我管理的其中一個站點包括新聞發佈列表,每個新聞發佈標題都會鏈接到詳細信息頁面。阻止來自詳細信息頁面的sql注入
標題和細節從MySQL數據庫中提取。
URL鏈接到詳細信息頁../pr.php?ID=457
我如何防止添加sql注入代碼到參數人嗎?
公共站點沒有用戶輸入表單。
我管理的其中一個站點包括新聞發佈列表,每個新聞發佈標題都會鏈接到詳細信息頁面。阻止來自詳細信息頁面的sql注入
標題和細節從MySQL數據庫中提取。
URL鏈接到詳細信息頁../pr.php?ID=457
我如何防止添加sql注入代碼到參數人嗎?
公共站點沒有用戶輸入表單。
找到一行代碼從URL中獲取的ID,這將是這樣的:
$ID = $_GET["ID"];
將其更改爲:
$ID = (int) $_GET["ID"];
甚至更好,更安全,頂部腳本補充一點:
$_GET["ID"] = (int) $_GET["ID"];
當你施放到INT沒有辦法任何人都能夠注入任何SQL成VA可變結構。你還應該檢查url中的變量是通過$ _GET變量而不是$ _REQUEST使用,或者甚至通過手動解析$ _SERVER [「QUERY_STRING」]來檢查。
確保ID是在該URL中傳遞給該腳本的唯一變量,如果存在更多,則需要保護所有這些變量。
確保僅接受整數值的變量很容易,只需進行此轉換即可。當變量可以是任何字符串時,將會更加困難,那麼您需要使用該字符串或類似的mysql_real_escape_string(),具體取決於您使用的數據庫和驅動程序的類型。
如果你需要一個完全成熟的通用解決方案,以SQL注入,看看我最近的另一個答案,那說明如何使用PDO擴展,自動數據綁定,以防止注射一起,鏈接如下:
stackoverflow.com/questions/8105508/does-this-work-to-stop-sql-injections/8105598#8105598
你不行。可以與服務器建立網絡連接的人可以發送他們想要的任何數據。
您必須改爲render the injection attempts harmless(並確保您處理的情況下,您以合理的方式從數據中取回0行,例如發送404 Not Found
響應)。
在你的例子中,我假設你需要ID參數是一個非零的正整數,沒有別的。 @Czarek的回答就足夠了。
$id = (int) $_GET["ID"];
或者有個內置功能intval():
$id = intval($_GET["ID"]);
但是這兩種方法返回0,如果輸入有沒有整數值(例如,「ABC」),所以你應該小心,一個id爲0本身並不會揭示你不打算用戶訪問的東西。很可能你的id值從1開始,如果是這樣就很安全。
您也可以使用PHP的內置filter擴展來獲得更大的靈活性。
if (filter_has_var(INPUT_GET, "ID") &&
filter_input(INPUT_GET, "ID", FILTER_VALIDATE_INT, array("min_range"=>1))
{
$id = filter_input(INPUT_GET, "ID", FILTER_SANITIZE_NUMBER_INT);
// then show data for $id
} else {
// show default page
}
您還可能感興趣的:
我們只是希望你不要有''的一個id'記錄0'。 – PeeHaa
與'0'有什麼區別?此外,沒有人保留ID爲'0'的記錄。 –
在字符串'test3'上鑄造爲int將返回'0'而不是'expected''3'。 http://codepad.org/Nrb5Wufb – PeeHaa