2011-04-02 52 views
2
$column = $_GET['id']; 
$result = mysql_query("SELECT $column FROM table"); 
echo $result; 

我正在建立一個網站與MySQL,因此試圖瞭解SQL注入。我認爲這個代碼很脆弱,但我似乎無法做出正確的工作。我將如何從表'example2'拉列'這裏'?這個sql查詢容易被注入嗎?

感謝

+0

它非常脆弱。嘗試使用mysql_real_escape_string並清理變量(如果$ _GET ['id']是一個整數do $ id =(int)$ _ GET ['id']) – Khez 2011-04-02 04:11:06

+3

建議'mysql_real_escape_string_for_real_this_time'幾乎不會比原來好。這是2011年。使用預先準備的語句。 – 2011-04-02 04:22:59

回答

1

將$列是這樣的:

" here FROM example2 -- " 
+0

'mysql_query'不允許多個查詢,所以這隻會引發錯誤。 – Yahel 2011-04-02 04:12:40

+0

@yc我已修復它。 – 2011-04-02 04:13:07

1

如果以下文本以$ _GET ['id']的形式傳遞,您將有一個漏洞利用:

$_GET['id'] = '[other sql commands here]';

兼用mysql_real_escape_string()mysqli_real_escape_string()(如果你使用的是改進的界面)

+2

'mysql_query'不允許多個查詢... – Yahel 2011-04-02 04:12:59

+0

@yc啊,很好趕上 – Patrick 2011-04-02 04:16:00

+0

@yc我猜你可以告訴我不是一個sql注入黑客:-) – Patrick 2011-04-02 04:17:38

6

試想$ _GET [ '身份證']等於這樣的

* FROM anytable_i_want; -- 

雙連字符手段你的字符串的其餘部分是一個評論...所以現在你正在執行的SQL是:

SELECT * FROM anytable_i_want; 

保護這種廢話的最好方法就是準備好的陳述。如果使用,說PDO接口,你做這樣的事情:

$HANDLE = $PDO->prepare('SELECT ? FROM mytable'); 
$HANDLE->execute(array($_GET['id'])); 

現在不管是什麼系作爲$ _GET [「身份證」]它woudlnt有什麼奇怪的效果。

mysql_real_escape_string會覆蓋你如果使用我的mysql_系列函數,儘管如果你在運行時改變字符集,你可能會受到一些攻擊。

+0

優秀的非多重查詢(即適用)風險的例子! +1 – Yahel 2011-04-02 04:17:15

+0

非常感謝,我不知道我可以用雙連字符評論查詢的其餘部分。 – user688579 2011-04-02 04:21:34

+1

函數的mysql_系列是舊的,真的不應該使用。它已被mysqli_和PDO所取代,這兩者都允許準備好的語句。我個人比較喜歡PDO,但如果你在使用PHP,你應該選擇其中的一種。 – Erik 2011-04-02 04:23:19