2014-04-03 74 views
2

我剛剛接管了一箇舊的PHP網站,它充斥着SQL注入漏洞。作者在SQL語句中直接包含$_GET變量。快速修復SQL注入漏洞的舊PHP網站的方法?

我不是PHP程序員,時間很短,所以我不會允許使用準備/參數化語句。

我可能會有時間做的最好的是這樣的事情:

$unsafe_variable = $_POST["user-input"]; 
$safe_variable = mysql_real_escape_string($unsafe_variable); 

mysql_query("INSERT INTO table (column) VALUES ('" . $safe_variable . "')"); 

有沒有什麼辦法可以快速做一個網站的所有網頁上?例如,我可以有一個include,它圍繞$_GET陣列進行迭代,並清除或轉義變量,然後用其安全版本在$_GET陣列中覆蓋其不安全版本。這意味着我可以解決所有頁面一氣呵成:)

編輯

我應該注意我不是一個PHP程序員,我別無選擇,用準備好的發言使我不是最新的關於這個辯論哪些php函數對於消毒輸入是安全的。在futher閱讀中,我相信真正的逃逸功能是安全的,如果我設置了mysql的字符集爲utf8

<?php 

$conn = mysql_connect("localhost", "my_user", "my_pass"); 
$db = mysql_select_db("world"); 

if (!mysql_set_charset('utf8', $conn)) { 
    echo "Error: Unable to set the character set.\n"; 
    exit; 
} 

我也相信代碼不會處理在所有的GET變量,但簡單地把它們添加到SQL查詢。

+0

「我可以有一個包含迭代周圍的GET數組,並清理或轉義變量,然後用GET數組中的安全版本覆蓋它的不安全版本」 - 這取決於。你打算使用GET的數據來處理* SQL以外的任何事情嗎? (大多數人都這麼做)。 – Quentin

+1

我會使用rename_function和override_function來重命名並重寫mysql_query以首先清理查詢,然後使用已清理的var的覆蓋內的原始mysql_query函數。看到第一個評論在這裏:http://www.php.net/manual/en/function.override-function.php#50821 –

+0

不,沒有辦法自動轉換所有的代碼。你可以嘗試使用一個基本的字符串搜索/替換,但它會錯過太多,可能也會過度磨損。此外,在_GET級別進行消毒是毫無意義的 - 無法保證_GET中的內容將直接用於sql中。任何中間處理步驟都可以殺死您所做的任何轉義。例如這就是爲什麼magic_quotes是一個徹頭徹尾的愚蠢瘋狂的想法。 –

回答

2

是的,你可以做一個包括或只是一個襯墊,如:

foreach($_REQUEST as $key => $val) { $_REQUEST[$key] = mysql_real_escape_string($val); } 

這不承擔任何陣列式的表單域被公佈。

但是,你要明白,

它無法減輕注射

,但只是降低了風險做這將是下載中心所有源

+0

Yep:單獨留下函數調用,並在頂部輸入[filter](http://www.php.net/manual/en/book.filter.php)。 – bishop

+0

是的,你的Common Sense所說的是絕對正確的。它也可能引入迴歸問題。它僅僅降低了風險。 – Jef

0

最保險的辦法,打開所有的.php文件在記事本++中搜索mysql_的所有打開的文件,然後驗證它是否必須被替換。

如果你的項目不是那麼大,它不會花太長時間,如果在一個文件中調用不完全相同,它將避免打破你的代碼。

0

這意味着我可以解決所有頁面一氣呵成:)

不幸的是,它不會幫助。

由於顯然沒有快捷方式。

只是因爲mysql_real_escape_string不會使變量變得「安全」。

唯一安全的粗略等價的,如果做出積極確保你把每查詢一個變量不僅逃脫,但也引述也可以實現。