2011-04-07 33 views
4

我正在嘗試阻止SQL注入的現有網站上工作。在$_GET['ID']之前未經過處理。mysql_real_escape_string()沒有消毒變量

$ID=mysql_real_escape_string($_GET['ID']); 
$sQuery=mysql_query("select * from tbl_mini_website as s1, tbl_actor_merchant as me where s1.MERCHANT_ID=$ID AND s1.MERCHANT_ID=me.MERCHANT_ID"); 

如果我把一個'在URL的末尾,用mysql_real_escape_string()我得到這個從mysql_error()

您的SQL語法錯誤;檢查對應於你的MySQL服務器版本的使用權語法手冊近「\\」 AND s1.MERCHANT_ID = me.MERCHANT_ID」在行1

與出mysql_real_escape_string()我得到:

你的SQL語法有錯誤;檢查對應於你的MySQL服務器版本使用附近的正確語法手冊「\」 AND s1.MERCHANT_ID = 1行

me.MERCHANT_ID」我不知道怎麼了呢?任何幫助將不勝感激。

+0

如果在執行它之前'回顯查詢? – zerkms 2011-04-07 00:32:37

回答

6

如果它是一個id,我假設數字,爲什麼不把它轉換爲整數?

$ID = (int) $_GET['ID']; 

我可以給你的最好的建議是check out PDO並使用綁定參數。

+0

可能不是其他原始解決方案可以用於整數字段。我認爲弗蘭克是正確的添加引號。 – Dinah 2011-04-07 00:33:12

+2

@Dinah:他們都糾正。弗蘭克農夫事實上,MySQL _...不加引號,和亞歷克斯 - 數字不應該用引號包圍,但用作數字(這可能會導致鑄造/性能問題) – zerkms 2011-04-07 00:38:07

5

mysql_real_escape_string轉義,但不引用。

嘗試:

$sQuery=mysql_query("select * from tbl_mini_website as s1, tbl_actor_merchant as me where s1.MERCHANT_ID='$ID' AND s1.MERCHANT_ID=me.MERCHANT_ID"); 

更一般地,我傾向於在一個函數來包裝這兩個,如:

function quoteValue($value) { 
    return "'" . mysql_real_escape_string($value) . "'"; 
} 

這是非常有用的,因爲你可能會發現下你想要的行更精細的引用行爲(特別是在處理Unicode,控制字符等時)

+0

謝謝!我一直在研究這個問題一個小時,這正好在我的鼻子下面。 – Lienau 2011-04-07 00:41:47

2

這是因爲您沒有引用變量。

這裏的)給出以下輸入

$_GET['ID'] = "1"; 
$ID=mysql_real_escape_string($_GET['ID']); 
SELECT ... where s1.MERCHANT_ID=1 ... 

$_GET['ID'] = "1'" 
$ID=mysql_real_escape_string($_GET['ID']); 
SELECT ... where s1.MERCHANT_ID=1\' ... 

$_GET['ID'] = "1'" 
SELECT ... where s1.MERCHANT_ID=1' ... 
1

菲爾·布朗是正確的,但你建議立即進行刪除有關老式mysql_real_escape_string or mysql_connect()忘記,因爲他們是很老,並移動到php`s PDO(您查詢,您使用C和準備語句,綁定,獲取對象許多更多的功能。

如果您想要SQL Injection的下一代數據庫操作和安全性,我建議閱讀PDO文檔http://php.net/manual/en/book.pdo.php