2012-03-30 273 views
1

我看到幾個例子和人們用這種方式在登錄表單中查詢數據庫。 我不完全確定這是做登錄表單安全的最佳方式。用於登錄表單的簡單sql注入解決方案?

這是在PHP中查詢:

$query = "SELECT * FROM users WHERE usern = '".$_POST['username']."' AND passw = '".md5($_POST['password'])."'"; 

足夠有MD5()上的密碼後,以避免SQL注入? 我認爲md5函數會將所有字符和sql字符串轉換爲32個char字符串。

我可以使用哪些其他方式保護登錄表單?

回答

6

mysql_real_escape_string($_POST['username'])

雖然這是更好地使用mysqli推廣和使用準備好的語句。

(假設你使用MySQL)

編輯:針對下面的評論,它可能是很好用這個LIKE查詢:

addcslashes(mysql_real_escape_string($_POST['username']), '%_')

+1

+1對於準備好的語句 - 將要插入的數據傳遞爲**數據**要比將您寫入的SQL字符串與來自用戶的不受信任的字符串混合在一起 – Deebster 2012-03-30 15:41:22

+0

明確+1準備好的語句......介意你**「mysql_real_escape_string()」**不會轉義「%」。請查看php.net/manual/en/function.mysql-real-escape-string.php – 2012-03-30 15:45:28

+1

中的註釋部分是的,儘管這只是使用LIKE時的一個問題。你可以使用'addcslashes()'來提供幫助。 – MichaelRushton 2012-03-30 15:48:49

0

必須在讓數據靠近數據庫之前對數據進行清理。最簡單的方法是使用mysql_real_escape_string($_POST['username']),但這只是你需要做的最少的工作。

如果您使用的是像CodeIgniter這樣的框架,那麼您可以使用它們的內部功能,它可以消除任何XSS風險的$ _POST或$ _GET輸入。否則,我建議這些帖子:

0

您需要越獄$_POST['username']以及

和是md5將保護您免受sql注入。

在這個例子中,這樣的事情將是確定

$query = "SELECT * FROM users WHERE MD5(usern) = '".md5($_POST['username'])."' AND passw = '".md5($_POST['password'])."'"; 
+0

'MD5'的用戶名? – MichaelRushton 2012-03-30 15:40:44

+0

不是一個好主意,我知道,在問題的上下文中作出迴應,但不是比較用戶名,而是比較md5的用戶名。至少,這種方式你不需要擔心登錄注入。 – marvin 2012-03-30 15:50:43

+0

直到他試圖將'INSERT'或'UPDATE'設置爲''''usern'。 :) – MichaelRushton 2012-03-30 15:52:23

0

您輕鬆構建查詢的方式允許注入的代碼段中的用戶名。您可以使用準備好的語句來避免: http://php.net/manual/en/pdo.prepared-statements.php

準備好的語句基本上會描述語句將如何構造,並在之後添加數據。這樣,用戶就不能用輸入數據改變語句的結構。

0

如果你把它進行消毒的所有帖子,並讓你安全

function clean() { 
    foreach($_POST as $key => $val) { 
     $_POST[$key] = mysql_real_escape_string($val); 
    } 
} 

你也可以用use PDO and statements變量,並PDO將自動清洗的功能。

0
<?php 

try { 
    $dbh = new PDO("mysql:host=$hostname;dbname=$db", $dbusername, $dbpassword); 

    $query = "SELECT * FROM users WHERE usern = ? AND passw = ?"; 
    $sth=$dbh->prepare($sql); 
    $sth->execute(array($_POST['username'], md5($_POST['password'])); 
    $result = $sth->fetch(); 
} 
} catch(PDOException $e) { 
    echo $e->getMessage(); 
    exit; 
} 

PDO是Best way to stop SQL Injection in PHP

0

只是一個簡單的解決方案使用了類似的用戶名和密碼字段參數,使SQL命令字符串可分離從參數發送,然後攻擊者將只能得到空白responses.When參數使用的SQL命令字符串將與參數分開並編譯。使用準備好的語句是最佳解決方案。