2012-10-12 51 views
6

可能重複:
Best way to prevent SQL injection in PHP?SQL注入防護 - 單引號

我一直都做了一些測試,以防止SQL注入我的網站。我看到有幾種方法可以這樣做,轉義我的用戶輸入,添加斜槓,或者更好地使用參數化的sql語句。

我有這個測試代碼..

$q=$_GET["q"]; 
$game = mysql_query("SELECT * FROM `Games` WHERE `id` = '$q'"); 
$game = mysql_fetch_array($game); 

echo "<h4>ID: ".$game[0]."<br /></h4>name: " . $game[1]; 

我試了幾個SQLI請求,不能讓我的測試頁面錯誤,或顯示任何額外數據。

但是,當我改變了我的sql語句代碼,這(去掉周圍$ Q單引號)..

$game = mysql_query("SELECT * FROM `Games` WHERE `id` = $q"); 

我可以進行簡單的SQLI的,並得到了一定的成果。

那麼,只是用單引號包裝我的用戶輸入足夠好?還是我看過更復雜的SQLi技術?

+3

使用PDO與準備好的語句。這是到2012年爲止更安全的選擇。 – itachi

+1

檢查您的php服務器是否有'magic_quotes_gpc = ON',這將有助於防止SQL注入 – jcho360

+0

使用預準備語句(mysqli或POD)。節省了很多麻煩,而且mysql已被棄用。 –

回答

1

試試這個輸入:

abc' OR id <> ' 

會導致下面的語句:

"SELECT * FROM `Games` WHERE `id` = 'abc' OR id <> ''" 

,將返回所有的遊戲,而不是唯一的一個。如果您的頁面允許顯示整個結果,那麼我們肯定會看到太多......

出路在於使用PDO和預準備語句,在將用戶輸入插入到SQL語句之前至少使用mysqli_real_escape_string()函數。

SQL注入可以做更多的事情,在最糟糕的情況下,你甚至可以控制服務器。看看這個SQL Injection Cheat Sheet

+0

嗨,我只是試過該輸入並沒有返回。我嘗試了很多與此相似的結果,因此我詢問單引號是否足夠。難道它是@ jcho360提到的阻止這些攻擊的'magic_quotes_gpc = ON'? – user1741863

+1

@ user1741863 - 這是可能的,你可以很容易地檢查它,只需調用一個php頁面調用'phpinfo();'並搜索magic_quotes_gpc。我不得不做一個演示,並創建一個頁面,在那裏你可以[使用SQL注入](http://www.martinstoeckli.ch/hash/hash_sqlinjection.php?step=2),不幸的是它是用德語寫的。 – martinstoeckli

+0

的確如此。感謝頁面,谷歌翻譯救援。 – user1741863

0

你應該使用mysql_real_escape_string()功能

在這種情況下,你必須使用單引號

$game = mysql_query("SELECT * FROM `Games` WHERE `id` = '$q'"); 

讓假設用戶輸入1'比escape_string輸出將是1\'

如果你是不使用引號比查詢將是

SELECT * FROM `Games` WHERE `id` = 1' 

//that is wrong or a injection 

但在單引號的情況下

SELECT * FROM `Games` WHERE `id` = '1\'' 

是好的,可以去除sql-injection

+1

'mysql_ *'已被棄用,並將在未來的版本中刪除。 – itachi

+0

@itachi不要oversmart.See問題正確'正確...消除我的用戶輸入,添加斜槓,或更好的使用參數化的SQL語句....' – StaticVariable

+0

負面投票與問題無關,但答案。難道它不是這樣嗎?您使用已棄用的功能。因此,這個答案缺乏我眼中的完整性,因此失去了讚譽。 – itachi