簡體   English   中英

比較 php 中的密碼並將其發送到數據庫

[英]Comparing passwords in php and sending it to a database

我正在頁面登錄,我是一名初學者程序員,我需要知道 function 來比較密碼,然后如果它們不匹配,請告訴用戶它們不匹配,然后我需要加密它們以發送到數據庫

謝謝

這是我到目前為止所擁有的:

<?php

$Firstname = $_POST['Firstname'];
$Lastname = $_POST['Lastname'];
$Email = $_POST['Email'];
$password = $_POST['password'];
$password2 = $_POST['password2'];

if ($&&$password&&$Email&&$Firstname&&$Lastname)
{

if int strcmp ( string $password , string $password2 )
{

$connect = mysql_connect("localhost","root","power1") or die("couldn't connect!");
mysql_select_db("members") or die ("couldnt find db!");

INSERT INTO users (Firstname, Lastname, Email, password,...)
VALUES ($Firstname, $Lastname, $Email, $password, $password2,...)

}
else
    die("Your Passswords do not match") 

}
else
    die("Please enter your credentials");

?>

我認為你來這里尋求幫助真是太好了,我喜歡你已經深入研究了你想做的事情。

<?php

$Firstname = $_POST['Firstname'];
$Lastname = $_POST['Lastname'];
$Email = $_POST['Email'];
$password = $_POST['password'];
$password2 = $_POST['password2'];

到目前為止,這很棒。 您創建了一些變量,例如$Firstname ,它們比$_POST['Firstname']更易於閱讀和鍵入。 許多 PHP 程序員都會這樣做。

但是,您必須注意的是, $_POST數組中不能保證不存在任何內容。 因此,像$_POST['Firstname']這樣的東西可以是未定義的。 出於這個原因,您必須首先測試您想要的值是否存在。

if ($&&$password&&$Email&&$Firstname&&$Lastname)
{

我相信這里是您想要測試 POST 值是否存在的地方。 不幸的是,這為時已晚,因為上面已經發生了錯誤。 您應該考慮以這種方式啟動您的程序。

<?php

if (isset($_POST['Firstname']) && isset($_POST['Lastname'])
 && isset($_POST['Email'])     && isset($_POST['password'])
 && isset($_POST['password2']))
{
    $Firstname = $_POST['Firstname'];
    $Lastname = $_POST['Lastname'];
    $Email = $_POST['Email'];
    $password = $_POST['password'];
    $password2 = $_POST['password2'];

    // rest of script...
}

在這個例子中,我們確保我們想要使用的所有 POST 值在我們開始使用它們之前確實存在。 如果缺少 POST 值,此示例將不會遇到任何錯誤。

if int strcmp ( string $password , string $password2 )
{

您有正確的想法,但實際上不需要使用strcmp來比較 PHP 中的兩個字符串是否相等。 相反,您可以簡單地使用==運算符。

if ($password == $password2)
{

如果您真的想使用strcmp ,我們可以從文檔頁面http://php.net/strcmp中了解到,如果字符串相等,則 function 返回零。 因此,我們可以使用它。

if (strcmp($password, $password2) == 0)
{

在您確定密碼匹配之后,這就是您想要 hash 密碼的時候。 請注意,散列與加密不同:散列是單向的,這意味着一旦對密碼進行散列,您將無法獲取 hash 代碼並取回密碼; 另一方面,加密可以反轉。 因為我們從不希望壞人知道某人的密碼實際上是什么,所以我們應該 hash 密碼而不是加密它。

當然,一個 hash 的強度只和散列算法一樣好,還有很多可用的。 sha1非常強大並且可以很好地使用,直到您對編程更加熟悉為止。

$password_hash = sha1($password);

您已完美連接到數據庫。 這里沒有錯。

$connect = mysql_connect("localhost","root","power1") or die("couldn't connect!");
mysql_select_db("members") or die ("couldnt find db!");

但是,有一種特殊的方式需要您查詢數據庫。

INSERT INTO users (Firstname, Lastname, Email, password,...)
VALUES ($Firstname, $Lastname, $Email, $password, $password2,...)

該查詢需要通過將其作為字符串傳遞給mysql_query function 來提供給數據庫。

$sql_Firstname = mysql_real_escape_string($Firstname);
$sql_Lastname = mysql_real_escape_string($Lastname);
$sql_Email = mysql_real_escape_string($Email);
$sql_password_hash = mysql_real_escape_string($password_hash);

$sql = "INSERT INTO users (Firstname, Lastname, Email, password)"
      ."`VALUES ('$sql_Firstname', '$sql_Lastname', '$sql_Email', '$sql_password_hash')";

mysql_query($sql);

注意幾件事。 首先,我將$password_hash而不是$password存儲在數據庫中。 這就是我們想要的,因為我們永遠不希望壞人破解數據庫並找出人們的密碼。 其次,請注意我沒有直接使用$Firstname構造 SQL 字符串; 相反,我只使用$sql_Firstname ,它等同於$Firstname但已正確轉義了特殊字符——這就是mysql_real_escape_string function 所做的。 這對於保護自己免受 SQL 注入攻擊至關重要,我建議您閱讀以下內容: http://php.net/manual/en/security.database.sql-injection.ZE1BFD762321E409CEE4CAC0.B6E

}
else
    die("Your Passswords do not match") 

}
else
    die("Please enter your credentials");

你程序的rest做好了; 故意處理這些可能的錯誤情況對您有好處。 確保您繼續考慮所有可能性並妥善處理每一種可能性; 這樣做將有助於防止代碼中出現未知錯誤和安全漏洞。

在這里,您 Go 我為 Ya 重寫了它並在我的數據庫上對其進行了測試。 稍后在 trillian 上聯系我,我們可以深入了解從字段中刪除壞字符和自定義錯誤消息。 我得 go 現在是時候到 go 更換我的分配器蓋並將我的進氣口轉換為冷空氣進氣口!!! 打我哥

<?php
if (isset($_GET['action']) && $_GET['action'] == 'register') {

$key = "Ex6wCoVjh80Iu7ZAraanEEUyJmPHjCIt";

$Firstname = $_POST['Firstname'];
$Lastname = $_POST['Lastname'];
$Email = $_POST['Email'];
$password = $_POST['password'];
$password2 = $_POST['password2'];

// Function that converts a string to hexadecimal
    function asc2hex ($temp) {
       $data = "";
       $len = strlen($temp);
       for ($i=0; $i<$len; $i++) $data.=sprintf("%02x",ord(substr($temp,$i,1)));
       return $data;
    }

// String encryption function
        function encrypt($password, $key) {
            $result = '';
            for($i=1; $i<=strlen($password); $i++) {
                $char = substr($password, $i-1, 1);
                $keychar = substr($key, ($i % strlen($key))-1, 1);
                $char = chr(ord($char)+ord($keychar));
                $result.=$char;
            }
            return asc2hex($result);
        }

if ($password == $password2){
$con = mysql_connect("localhost","root","power1");
 if (!$con)
   {
   die('Could not connect: ' . mysql_error());
   }

mysql_select_db("members", $con);

// Check If Email Exists 
$email_check = mysql_query("SELECT Email FROM users WHERE Email='$Email'");
$email_count = mysql_num_rows($email_check);
if ($email_count == '0') {
mysql_query("INSERT INTO users (Firstname, Lastname, Email, password) VALUES ('$Firstname', '$Lastname', '$Email', '".encrypt($password, $key)."')");
}else{
echo "There Is Already A User Registered With This Email Address.";
}
}else{
echo "Your Passwords Do Not Match. Please Try Again.<meta http-equiv='REFRESH' content='3;url=login.php'>";
}
}else{
?>
<form method="post" action="?action=register">
<table border="0" cellpadding="0" cellspacing="5" width="377">
<tr>
<td width="74">First Name</td>
<td width="299"><input type="text" name="Firstname" size="20"></td>
</tr>
<tr>
<td width="74">Last Name</td>
<td width="299"><input type="text" name="Lastname" size="20"></td>
</tr>
<tr>
<td width="74">Email</td>
<td width="299"><input type="text" name="Email" size="20"></td>
</tr>
<tr>
<td width="74">Password</td>
<td width="299"><input type="password" name="password" size="20"></td>
</tr>
<tr>
<td width="74">Repeat Password</td>
<td width="299"><input type="password" name="password2" size="20"></td>
</tr>
<tr>
<td width="74"></td>
<td width="299"><input type=submit value="Submit"></td>
</tr>
</table>
</form>
<?php } ?> 

您可以使用 function 例如 md5 (http://php.net/manual/en/function.md5.php) 來計算密碼的 hash 並比較哈希值(並將密碼存儲為 Z34804FC57728394C 中的 Z0800FC577294C D b)

雖然這不能回答你的問題,但我認為這是你需要的答案

您的代碼有多個語法問題。 你現在應該做的是學習一些基本的 PHP 教程,嘗試制作簡單的腳本來熟悉語法,然后再處理更復雜的事情,如數據庫連接、登錄處理等。

以下是問題(在評論中):

<?php

$Firstname = $_POST['Firstname'];
$Lastname = $_POST['Lastname'];
$Email = $_POST['Email'];
$password = $_POST['password']; // first three variables are capitalized and these two are not. This is not a syntax problem but a general conventions problem
$password2 = $_POST['password2'];

if ($&&$password&&$Email&&$Firstname&&$Lastname) // $&&$ does not make any sense
{
// missing indentation (not syntax problem, but readability/convention)    
if int strcmp ( string $password , string $password2 ) // the syntax is if(condition). In you case if(!strcmp($password, $password2))
{

$connect = mysql_connect("localhost","root","power1") or die("couldn't connect!");
mysql_select_db("members") or die ("couldnt find db!");

// MYSQL queries has to be executed with PHP-specific functions, like mysql_query
INSERT INTO users (Firstname, Lastname, Email, password,...)
VALUES ($Firstname, $Lastname, $Email, $password, $password2,...)

}
else
    die("Your Passswords do not match") // missing semicolon 

}
else
    die("Please enter your credentials");

好吧,首先,你一般hash一個密碼,你不加密它。 A popular hash algorithm is md5 , PHP provides a built in function to make a md5 hash: md5

最佳做法是對您存儲的密碼的哈希值加鹽。 您應該閱讀該主題,例如這里

然后,您將 hash 用戶使用 md5 輸入並將該值與存儲在數據庫中的密碼哈希值進行比較。

要回答您的第一個問題,比較注冊時的兩個密碼非常簡單:

$password = trim($_POST['password']);
$password2 = trim($_POST['password2']);
if($password1 === $password2){
echo "Passwords match";
}else{
echo "Password do not match";
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM