2010-01-24 75 views
2

如何在PHP中加密用戶密碼?使用PHP的MySQL簡單加密技術

請用初學者可以理解的方式解釋。我已經有這個示例代碼:

$password = "john856"; 
$encrypt_password = md5($password); 

echo $encrypt_password; 

如何將它合併到我當前的代碼中,該代碼不進行任何加密?

<?php 
    $con = mysql_connect("localhost","root",""); 

    if (!$con) { die('Could not connect: ' . mysql_error()); } 

    mysql_select_db("koro", $con); 

    $sql="INSERT INTO users 
      (LNAME, FNAME, MNAME, UNAME, PW) 
      VALUES 
      ('$_POST[Lneym]', '$_POST[Fneym]', '$_POST[Mneym]', '$_POST[Uneym]', '$_POST[Pass]')"; 

    if (!mysql_query($sql,$con)) { die('Error: ' . mysql_error()); } 

    echo "<script>alert('User added! You can now use the system.')</script>"; 

    mysql_close($con) 
?> 
+2

如果你想讓人們做你的工作,至少你可以做的是很好地格式化代碼! – 2010-01-24 00:26:46

+1

有關格式化您的文章的更多信息,請參閱markdown參考頁面:http://stackoverflow.com/editing-help – 2010-01-24 00:29:16

+2

您在該代碼中存在嚴重的mySQL注入問題。 – 2010-01-24 00:33:04

回答

3

讓我開始一個更重要的一點:

您必須從未穿過$ _ POST變量直接進入查詢。這使您極易受SQL injections的影響。

你應該至少是至少在每一個表格值運行mysql_real_escape_string()插入:

$Lneym = $_POST["Lneym"]; 
$Lneym_halfway_safe = mysql_real_escape_string($Lneym); 

.... 

$sql="INSERT INTO users 
      (LNAME, FNAME, MNAME, UNAME, PW) 
     VALUES 
      ('$Lneym_halfway_safe', 

然後,您可以也納入MD5()直線距離:

$PW = md5($_POST["PW"]); // no escape_string() needed here, 
          // the md5 checksum is safe 

然後插入'$PW'爲密碼字段。

最好的事情是使用類似PDO的數據庫類。其參數化查詢功能自動幫助防止SQL注入。也許this tutorial可以幫助你。

鑑於您甚至無法將md5()添加到您的代碼中(沒有個人的批評,我們都曾從那裏開始過),我強烈建議您閱讀編程基礎知識。複製粘貼網絡平臺的關鍵安全功能是非常危險的,並可能以眼淚結束。

+0

-1:很好的建議,但與回答實際問題無關。 – 2010-01-24 02:48:48

+0

再次閱讀,它在那裏。 – 2010-01-24 02:49:59

+0

現在是。看來,在發佈評論之前我沒有刷新。 – 2010-01-24 02:52:22

1

你幾乎在那裏。運行代碼:

$password=$_POST["pass"]; 
$encrypt_password=md5($password); 

,然後插入$ ENCRYPT_PASSWORD到密碼字段在數據庫:

$sql="INSERT INTO users 
      (LNAME, FNAME, MNAME, UNAME, PW) 
     VALUES 
      ('$_POST[Lneym]', '$_POST[Fneym]', '$_POST[Mneym]', '$_POST[Uneym]', '$encrypt_password')"; 

我要補充,但是,MD5是哈希算法是一個單向過程它在每個輸入上生成一個唯一的字符串(「碰撞拋開」)。你將無法恢復用戶的密碼,只是你知道。然而,這是一件好事,你仍然可以檢查登錄 - 只需比較md5的值即可。

0

正如其他人所說,逃避所有的變量:

$encrypt_password = mysql_real_escape_string(md5($_POST["pass"])); 
$lastname = mysql_real_escape_string($_POST[Lneym]); 
$firstname = mysql_real_escape_string($_POST[Fneym]); 
$midname = mysql_real_escape_string($_POST[Mneym]); 
$username = mysql_real_escape_string($_POST[Uneym]); 
$sql = "INSERT INTO users 
      (LNAME, FNAME, MNAME, UNAME, PW) 
      VALUES 
      ('$lastname', '$fistname', '$middlename', '$username', '$encrypt_password')"; 

然後進行登錄:

$encrypt_password = mysql_real_escape_string(md5($_POST["pass"])) 
$username = mysql_real_escape_string($_POST[Uneym]); 
$sql = "SELECT LNAME, FNAME, MNAME, UNAME 
     WHERE UNAME = '$username' 
     AND PW = '$encrypt_password'"; 
-1

據我所知使用SHA-2MD5甚至更​​好(更安全)的方式SHA-1來哈希你的密碼。

前一段時間我用這個頁面教程爲我的CMS,它工作得很好。

http://hungred.com/useful-information/php-better-hashing-password/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+Hungredcom+%28Hungred.com%29 

這幾乎編碼,是足夠安全使用,因爲它試圖私有函數用於保護密碼組合。