2013-06-22 52 views
1

我有一些結構鏈接如下...使用is_numeric的表單驗證

http://domain.com?problem_id=23&course_id=4 

從GET「域」的預期值(PROBLEM_ID和COURSE_ID)都爲整數。我可以通過簡單的說...

if (is_numeric($_GET['problem_id'])){ 
    //It's safe, so do stuff. 
} else { 
    echo 'It appears you submitted a problem incorrectly. Please contact us for assistance'; 
    exit; 
} 

或者這是否仍然像SQL注入等nastiness開放?

提出的解決方案

$int_problem_id = (int) $_GET['problem_id']; 
if (ctype_digit($int_problem_id)){ 
    //It's safe, so do stuff. 
} else { 
    echo 'It appears you submitted a problem incorrectly. Please contact us for assistance'; 
    exit; 
} 
+0

http://stackoverflow.com/questions/60174/how-to-prevent-sql-injection-in-php – Hast

+2

請注意['is_numeric()'](http://php.net/manual/en /function.is-numeric.php)可能實際上並沒有做你認爲的事情。以下全部對於is_numeric返回true:'3.14','+ 0123.45e6','0xf4c3b00c','0b10100111001'。是['ctype_digit()'](http://www.php.net/manual/en/function.ctype-digit.php)你正在尋找什麼? – jcsanyi

+0

@jcsanyi:使用ctype_digit是一個更好的方法。謝謝! – gtilflm

回答

2

是的,這是一個解決方案。另外,您還可以投射到int。

$integer = (int) $_GET['problem_id'] ; 

即使數值沒有包含特殊符號,數值也不會造成危害,您應該確保數據庫的所有輸入。

+0

這是必要的,還是隻是看問題的另一種方式? – gtilflm

+2

這是一個額外的100%的方式來確保輸入不會損害您的數據庫。 – vikingmaster

+0

好酷。從上面的jcsanyi涉及ctype_digit,我將與我已經添加到原始文章中的提議的解決方案一起使用。看起來不錯? – gtilflm

1

你必須確保?problem_id=是數字。所有其他字段可能仍然存在風險,因此這不是防範SQL注入的正確方法。您應該查看PDO和MySQLi及其功能。

+0

沒錯。另外,很抱歉,這些數據實際上是通過URL傳入的。請看我修改後的帖子。你的答案仍然有效嗎? – gtilflm

+0

是的。 ?problem_id表示它是一個GET參數,可通過$ _GET ['problem_id']訪問,因此您處於正確的軌道上。你對變量所做的事情是重要的,你可以寫一個直接的mysql查詢(此時你很容易受到SQL注入攻擊),或者使用PDO/MySQLi爲你寫查詢。無論類型如何,它們都能安全地逃避變量。使用整數,它會將其綁定爲整數,但有人提交'?problem_id = 1; DROP TABLES'將使他們的查詢逃脫,並且不會造成任何損害。 – SpenserJ

+0

對。我實際上不會與數據庫進行交互。所以,我想我應該使用我上面提出的解決方案非常安全。感謝回覆。 – gtilflm