2012-04-03 70 views
0

可能是一個愚蠢的問題仍然:

我玩弄下面的代碼:

$a='a'; 

if ($_GET['a'] == $a) 
    echo 'true'; 
else 
    echo 'false'; 

現在,有沒有什麼辦法將數據發送到打破驗證?很明顯,它可能已經在SQL注入中完成的方式不會進行。

只是想知道這種驗證方式有多安全。

在此先感謝。

編輯:

我的問題是,有沒有什麼可以thorugh $ _GET可能「破」的比較,始終輸出「真」被傳遞。

+2

考慮沒有設置$ _GET ['a']的情況。也許一個永遠不會傳給你。 – Murtnowski 2012-04-03 20:52:13

+3

您試圖驗證數據的目的是什麼?沒有任何人可以做到從你的腳本中獲得「真」或「假」以外的任何東西。如果沒有設置'$ _GET ['a']',它只會在您的日誌中彈出警告。 – Crontab 2012-04-03 20:52:22

+0

有趣的問題。我想知道是否傳入奇怪的Unicode,或ASCII或任何東西會拋出它。它對我來說很安全...... – kevingreen 2012-04-03 20:53:03

回答

2

如果您正在尋找驗證$_GET['a']真正面臨的問題等於"a"而沒有別的,比是的,那就是代碼。

但是,如果您期望"a"且只有"a"它可能不應該是用戶輸入。

驗證(或衛生),意味着採取任何可能向您發送的字符串,並確保它適用於任何您想要的目的。如果它發送到數據庫,則通過mysql_escape_string()或使用預準備語句。如果要以HTML格式顯示,請確保使用html_entities()strip_tags()沒有任何有害標籤。

除了說用戶輸入了"a"之外,您的驗證對於其他任何內容都不是很好。 但是,沒有什麼比"a"能夠通過。

+0

我的問題是,有什麼可以通過$ _GET,可以'打破'比較,總是輸出'真' 。我完全知道如何清理和驗證用戶輸入數據。只是想知道是否有什麼可以打破比較 – michaeltintiuc 2012-04-03 21:01:47

+1

不,沒有什麼可以打破比較。在PHP中只有「a」將等於「a」。 – 2012-04-03 21:02:27

+0

偉大的,這就是我想知道的,你是否100%確定現在奇怪的ASCII或編碼數據可以通過? – michaeltintiuc 2012-04-03 21:04:16

-2

您可以使用mysqli擴展中的Prepared-Statements,這已經可以防止每個可能的注入。

如果你不想使用這種mysql和mysqli的也有「real_escape_string」,你可以在你的查詢中使用 - 方法在Userinput時,把

$sql = "SELECT `name` FROM `example` WHERE `id` = '".mysql_real_escape_string($YOURVAR)."'"; 

real_escape_string method from standart mysql extension

mysqli real_escape_string

+1

這是關於數據庫的大驚小怪? OP沒有提到這一點 – 2012-04-03 20:58:16

0

那麼,如果你確切知道什麼是進來,你可以比較沒有類型的強制和檢查一個空的參數:

$a = 'a'; 

if(!empty($_GET['a']) && $_GET['a'] === $a ) 
{ 
    //do more validation using your data model 
} 
else 
{ 
    //output error msg 
}