2014-02-08 18 views
0

我目前正在一個網站上工作,它有一個註冊PHP文件,將數據發送到數據庫。爲了安全措施,我設置了一個密碼加密文件,用於加密用戶輸入的密碼,以便在數據庫中無法找到。不幸的是,當用戶試圖從PHP文件中的日誌連接到數據庫時,它拒絕他們訪問登錄,因爲代碼連接到數據庫密碼,但它不會從密碼中「清理」密碼,並且該密碼不被服務器識別。我將在下面提供的代碼我:如何讓我的PHP文件正確地調用數據庫中的密碼?

Signup.php

$p = $_POST['p'];  
$cryptpass = crypt($p); 
include_once ("php_includes/randStrGen.php"); 
$p_hash = randStrGen(20)."$cryptpass".randStrGen(20); 

的login.php

$p = md5($_POST['p']); 

如何修改我上面提供的的login.php線,使其進行消毒密碼從它的加密值到用戶實際知道並輸入的密碼?

p.s. $ P =用戶輸入的

+0

您應該更多地瞭解您的密碼加密方法......加密和解密時有一些標準。 – VIDesignz

+0

好的。我不是專家,顯然來自你能看到的。你有推薦的另一種方法嗎? –

+0

是的......給我幾分鐘 – VIDesignz

回答

1

我要在這裏添加第二個答案,這更是一個安全防範的你將要插入或繪製,當涉及到任何用戶輸入來自數據庫。當你想要清理任何用戶輸入以防止數據庫注入是最簡單的方法來分解數據庫時。

這是一個偉大的衛生腳本。首先製作一個單獨的PHP文件並將其複製/粘貼到該文件中。

<?php 
// Sanitize User Input 
function sanitize($data){ 

    // apply stripslashes if magic_quotes_gpc is enabled 
    if(get_magic_quotes_gpc()){ 
     $data = stripslashes($data); 
    } 
    // a mySQL connection is required before using this function 
    $data = mysql_real_escape_string($data); 

    return $data; 
} 
?> 

現在包括您將使用DB

<?php require("sanitize.php"); ?> 

注進行交互的任何頁面上此頁:mysql_connect("mysql",$mysqlusername,$mysqlpassword);

:喊你必須已經連接到你的數據庫 IE的功能之前

從這裏開始,它非常簡單。假設你從後分配一個變量,像這樣

$password = $_POST["password"]; 

消毒此輸入你這樣做

$password = sanitize($password); 

這有助於防止MySQL的注射通過移除相關的修改或暴露數據庫信息的某些字符。

希望這會有所幫助!

+0

美麗!對於遲到的回覆感到抱歉,非常感謝。我非常感謝你的時間。 –

0

,除非你也將它們保存在數據庫中不串接與隨機字符加密的密碼口令,否則 - 你將永遠無法比較用戶輸入與保存的加密密碼。只需使用:

$p_hash = $cryptpass; 

和腳本的login.php不使用md5($_POST['p']);這是不同的散列法,但也使用crypt()功能:

$p = crypt($_POST['p']); 
+0

我想我忽略了那些信息。當用戶輸入密碼時,它被腳本加密,並且加密的密碼被存儲在數據庫中。我不確定這是否是解決這個問題的最佳方式,但我對PHP是半新的,而且我還沒有像HTML和CSS那樣獲得「思考之外的思考」。 –

+0

您是否知道我可以使用和編輯符合我的規範的預製的,穩定的註冊和登錄PHP文件集? –

+0

實際上,我總是自己編寫註冊和登錄程序,所以我不知道任何預製的,準備好插件的文件來適應你。 – ivankoni

1

好了,一旦你從用戶那裏得到的密碼在插入數據庫時​​你會想要加密它。這需要額外的一段稱爲「鹽」的數據。 鹽是獨一無二的,你決定你想要它。但是你會需要它來加密和解密,所以重要的是你不要失去它!我將它保存在自己的文件中,並在需要時使用include。以下是PHP

$key_salt = 'lettersandnumbers'; 

現在的密碼加密 說你有像這樣的變量名和密碼...

$user_id = "usersId"; 
$password = "usersPassword"; 

這是爲了把它們放進數據庫的方式.. 。 具有下列數據創建一個變量

$insertdata = sprintf("INSERT INTO $table (user_id, password,) VALUES ('%s', AES_ENCRYPT('%s', '$key_salt'))", $user_id, $password); 
mysql_query($insertdata); 

通知之AES_ENCRYPT('%s', '$key_salt')這是什麼讓加密和看看它是如何與'%s'使用$key_salt一起(這是$password

這些的結合,使得它幾乎不可能被破解

這將解密密碼,並把它變成一個變量,那麼你可以做什麼你想用它之後....

$results = mysql_query(" 
    SELECT AES_DECRYPT(password, '$key_salt') as password FROM $table where AES_DECRYPT(password, '$key_salt')='$password'"); 
$row = mysql_fetch_array($results); 
$decryptedpassword = $row['password']; 
+0

好的。所以,如果我目前的加密文件被稱爲「RandStrGen.php」,那麼這是我會代替'lettersandnumbers'嗎?該文件是我的鹽文件。我瞭解除此之外的一切。 –

+0

旁註:不應該「加密」而是「散列」密碼。 –

+0

正確,'$ key_salt'只是一個你創建並放入其單獨文件的變量。然後將該文件包含在您加密或解密的任何頁面上。 – VIDesignz

相關問題