[英]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.