2011-11-02 78 views
0

給出1000s的字符串格式的mysql查詢,有沒有辦法在運行查詢之前分析並從這些字符串中刪除任何SQL注入?停止一個函數中的所有SQL注入的方法?

我的一個想法是檢查在SQL注入中使用的常見單詞/短語的字符串,這些字詞在執行查詢的應用程序中從不使用。如果找到,請不要運行查詢並提醒管理員。

+4

簡答:不,不可靠。最好是仔細檢查每個查詢並正確清理值(或者如果這有助於減少工作負載,則使用參數化查詢) –

+2

與'ON ERROR RESUME NEXT'類似,但用於良好? '在注射拒絕訪問'? – Konerak

+3

你還應該提供一個例子,你現在怎麼做。例如,如果您已經在一個字符串中創建了SQL,那麼需要「修復」它的解析器會遇到像db服務器一樣的問題。在數據庫服務器端,它被稱爲sql-injection,然後,在你的應用程序中,只是你的解析器的一個缺陷。 – hakre

回答

3

mySQL鼓勵使用mysql_real_escape_string來清理查詢。

轉義在unescaped_string特殊字符,並考慮到 佔當前字符集的連接,使其安全 將其放置用於mysql_query()。如果要插入二進制數據,則必須使用此功能。

mysql_real_escape_string()調用MySQL的庫函數 mysql_real_escape_string,其中前添加反斜槓以下 字符:\ X00,\ n,\ r,\,」,「和\ X1A

此功能必須始終(除少數例外)被用來發送一個查詢到MySQL之前,使數據 安全

PS:這裏是一個很好的答案addslashes/mysql_real_escape_string辯論:http://www.sitepoint.com/forums/showthread.php?337881-addslashes()-vs-mysql_real_escape_string()...the-final-debate&s=7cabb6e5fd909f2c787d47cd01471dfb&p=2439889&viewfull=1#post2439889

+2

您必須將每個參數傳遞給mysql_real_escape_string,而不是完整的查詢。它也是「唯一」的字符串文字參數設計,而不是查詢可能包含的所有其他可能的「移動部分」。 – VolkerK

+0

你說得對,我沒有足夠解釋,他需要重寫查詢,這是最實用的方法。 –

1

我想到的一個想法是檢查字符串中用於sql注入的常用單詞/短語,這些單詞/短語在運行查詢的應用程序中從不使用。如果找到,請不要運行查詢並提醒管理員。

非常糟糕的主意。

的解決方案是使用PDO:http://php.net/manual/en/ref.pdo-mysql.php

又通所有 $乏使用的參數。
如果您必須使用動態SQL,請確保您對照白名單檢查注入的東西。
看到這個問題如何安全地做到這一點:How to prevent SQL injection with dynamic tablenames?

現在你是保存。

如果您不能使用PDO,請使用mysql_real_escape_string()
下面是一個例子:

$var = mysql_real_escape_string($_POST['unsafe_value']); 
$query = "SELECT * FROM user WHERE username = '$var' "; 
// The quotes are vital, without them  ^^ 
//you will may get syntax errors and mysql_real.... will not protect you! 

只能用這個參數不是表,列,數據庫名稱或SQL構造,也記得要經常引用您'$vars'
對於任何值,您都必須使用白名單。請注意0​​不起作用,不應使用!
對於整數值,你可以使用intval(),但是我建議反對它,它不會節省時間,使你的代碼難以閱讀,並且違反規則總是使用mysql_real_escape_string()