2011-11-13 72 views
0

我管理的其中一個站點包括新聞發佈列表,每個新聞發佈標題都會鏈接到詳細信息頁面。阻止來自詳細信息頁面的sql注入

標題和細節從MySQL數據庫中提取。

URL鏈接到詳細信息頁../pr.php?ID=457

我如何防止添加sql注入代碼到參數人嗎?

公共站點沒有用戶輸入表單。

回答

-1

找到一行代碼從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

+0

我們只是希望你不要有''的一個id'記錄0'。 – PeeHaa

+0

與'0'有什麼區別?此外,沒有人保留ID爲'0'的記錄。 –

+0

在字符串'test3'上鑄造爲int將返回'0'而不是'expected''3'。 http://codepad.org/Nrb5Wufb – PeeHaa

4

你不行。可以與服務器建立網絡連接的人可以發送他們想要的任何數據。

您必須改爲render the injection attempts harmless(並確保您處理的情況下,您以合理的方式從數據中取回0行,例如發送404 Not Found響應)。

1

在你的例子中,我假設你需要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 
} 

您還可能感興趣的: