2016-04-01 43 views
1

我讀過關於SQL注入,所以我嘗試了它與我的網站,當然它的工作..我知道解決方案是參數化查詢,我也知道有很多的例子在那裏,但他們沒有提到我們連接到數據庫的部分。 因此,這裏是我的登錄頁面的PHP代碼的一部分:PHP中的參數化查詢與MySQL連接

$userName = $_POST["username"]; 
$userPass = $_POST["password"]; 

$query = "SELECT * FROM users WHERE username = '$userName' AND password = '$userPass'"; 

$result = mysqli_query($dbc, $query); //$dbc is for MySQL connection: $dbc = @mysqli_connect($dbhost, $dbuser, $dbpass, $db) 

$row = mysqli_fetch_array($result); 

if(!$row){ 
    echo "No existing user or wrong password."; 
} 

我已經找了很長一段時間的解決方案,但我想不出我如何能得到它的參數的方式工作。你能幫我一下,我應該如何完成我的代碼來防止SQL注入?

+1

這是在這裏詳細解釋:http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php – Guido

+0

看看如何在PHP中做準備語句將防止SQL注入:http://www.w3schools.com/php/php_mysql_prepared_statements.asp – Erick

回答

3

在這裏你去

$stmt = mysqli_prepare($dbc, "SELECT * FROM users WHERE username = ? AND password = ?"); 
mysqli_stmt_bind_param($stmt, "s", $userName); 
mysqli_stmt_bind_param($stmt, "s", $userPass); 
mysqli_stmt_execute($stmt); 
$row = mysqli_stmt_fetch($stmt); 

Documentation

正如方面說明我會建議加密密碼或更好地利用哈希的安全性,這不是很好的保存密碼爲純文本

+0

謝謝你的回答。我將它複製到我的代碼中,現在它使用正確的數據,但它仍然接受''或'='的東西:/ –

+0

@MárkVégh,當然它仍然接受它 - 它在輸入中。但是,它不能執行!這是準備好的陳述的重點。佔位符中的數據僅被視爲文本。 –

+0

哦,我明白了,但是我能做些什麼來防止這種注射?現在,只要在用戶名和密碼字段中輸入密碼,任何人都可以登錄:/ –

-1

使用:

$userPass = mysqli_real_escape_string($mysqli,$_POST["password"]); 

這封鎖了'或'='的東西事情:)其中$ mysqli是你的連接字符串ofc。