2010-06-14 104 views
10

腳本使用PHP,而DB使用MySQL。這是腳本本身。此查詢從sql注入安全嗎?

$unsafe_variable = $_GET["user-input"]; 
$sql=sprintf("INSERT INTO table (column) VALUES('%s')",$unsafe_variable); 
mysql_query($sql); 

有人說,如果用戶分配;DROP TABLE blah;字符串變量$ unsafe_variable它刪除表。

但我試過了這個例子,

http://localhost/test.php?user-input=DROP%20TABLE%20my_table 

但它並沒有刪除表,而是在表中插入新行(;DROP TABLE blah;)

有人可以解釋我怎麼可能用sql注入攻擊這個腳本?

+3

'mysqli'或'PDO'他們準備的語句會是一個更好的選擇。 – Powerlord 2010-06-14 19:29:33

+0

非常感謝所有參與者的問題。我真的意識到,只有'sprintf',我們不能確定我們的查詢是否來自** sql注入**。對於這個特定的例子,我和參與者都不能介紹如何執行sql注入。但是我發現了一個很好的sql例子,即使我們使用'sprintf',我們也可以執行sql-injection。這個sql示例可以在這裏找到(http://php.net/manual/en/function.mysql-real-escape-string.php「PHP在線手冊」)。請參閱'Example#2的一部分示例SQL注入攻擊' – Bakhtiyor 2010-06-15 09:41:59

回答

13

由於PHP的mysql_query函數僅允許每次調用一個查詢,所以該特定注入將無法工作。但是,以下可以工作,如果column有一個主要或唯一鍵:

$unsafe_variable = "admin') ON DUPLICATE KEY UPDATE password=MD5(CONCAT('knownsalt', 'newpassword'))#"; 
更好

使用長篇大論mysql_real_escape_string功能:

$sql=sprintf("INSERT INTO table (column) VALUES(%s)", 
      mysql_real_escape_string($unsafe_variable)); 
mysql_query($sql); 
4

mysql_query()不允許在一個函數中執行多個查詢。所以你不能INSERT,然後DROP表。但是你不應該依賴這個作爲'安全'。改用參數化查詢。查看PHP的PDO庫。

但是,它們可能會改變其他任何內容,例如可能從另一個表中選擇一個密碼字段作爲子查詢放置到該表中,以便他們可以查看散列。

+0

http://php.net/manual/en/function.mysql-query.php – 2010-06-14 19:24:02

+0

downvote的任何原因?準備好的語句通常比'mysql_real_escape_string'安全。 – 2010-06-14 20:13:21

1

不,sprintf的不逃避內容使用:

$unsafe_variable = mysql_real_escape_string($_GET["user-input"]); 
$sql=sprintf("INSERT INTO table (column) VALUES('%s')",$unsafe_variable); 
mysql_query($sql); 
1
mysql_real_escape_string($unsafe_variable) 
3

雖然mysql_query只允許一個查詢來執行,一般這個查詢是不安全的。一個危險的輸入,將利用您的查詢的一個例子是:

'); DROP TABLE my_table; -- 

');在一開始就會關閉您的查詢,並插入一個空值,但將允許額外的查詢INSERT以下執行。然後在放下一張桌子後,最後的--將標記爲其他所有內容(即查詢的其餘部分)作爲註釋。

爲了安全地準備用於查詢的輸入,請使用mysql_real_escape_string

+0

你是否想說如果我運行這個腳本[http://authoringtool/test.php?user-input =');%20DROP%20TABLE%20my_table2;%20--]它會從我的數據庫中刪除my_table2?如果沒有,請給我一個真實的例子,因爲你的例子並沒有刪除my_table2 :) – Bakhtiyor 2010-06-14 19:29:16

+1

如上所述,'mysql_query'不支持執行多個查詢,但你仍然應該正確地保護你的查詢。 – 2010-06-14 19:31:15

1

有人說如果用戶指定的話; DROP TABLE等於;字符串到變量$ unsafe_variable它刪除表。

很明顯,情況並非如此 - 但如果您不明白爲什麼,那麼您無法判斷您的代碼是否安全。你打算在這裏發佈每一行來檢查它的安全嗎?如果不對上面的代碼做什麼以及如何做出妥協(SQL注入已經在其他地方已經有很好的文檔記錄 - 嘗試Google開始),你應該始終確保任何離開你的PHP代碼的數據是以正確的方式表示它的去向。

對於MySQL數據庫是指:

1)使用mysql_real_escape_string的輸出(並確保您傳遞正確的資源句柄)

2)使用參數綁定。

關於代碼注入攻擊的適當討論可以很容易地填充幾百頁 - 在S.O.中有一點要回答。查詢。

C.

0

我想你需要嘗試的例子是http://localhost/test.php?user-input=';DROP%20TABLE%20my_table'

');關閉values('%s段,然後發出一個新的命令,drop table...

+0

這不起作用。 – Bakhtiyor 2010-06-15 09:13:05