我剛剛接管了一箇舊的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查詢。
「我可以有一個包含迭代周圍的GET數組,並清理或轉義變量,然後用GET數組中的安全版本覆蓋它的不安全版本」 - 這取決於。你打算使用GET的數據來處理* SQL以外的任何事情嗎? (大多數人都這麼做)。 – Quentin
我會使用rename_function和override_function來重命名並重寫mysql_query以首先清理查詢,然後使用已清理的var的覆蓋內的原始mysql_query函數。看到第一個評論在這裏:http://www.php.net/manual/en/function.override-function.php#50821 –
不,沒有辦法自動轉換所有的代碼。你可以嘗試使用一個基本的字符串搜索/替換,但它會錯過太多,可能也會過度磨損。此外,在_GET級別進行消毒是毫無意義的 - 無法保證_GET中的內容將直接用於sql中。任何中間處理步驟都可以殺死您所做的任何轉義。例如這就是爲什麼magic_quotes是一個徹頭徹尾的愚蠢瘋狂的想法。 –