可能是一個愚蠢的問題仍然:
我玩弄下面的代碼:
$a='a';
if ($_GET['a'] == $a)
echo 'true';
else
echo 'false';
現在,有沒有什麼辦法將數據發送到打破驗證?很明顯,它可能已經在SQL注入中完成的方式不會進行。
只是想知道這種驗證方式有多安全。
在此先感謝。
編輯:
我的問題是,有沒有什麼可以thorugh $ _GET可能「破」的比較,始終輸出「真」被傳遞。
可能是一個愚蠢的問題仍然:
我玩弄下面的代碼:
$a='a';
if ($_GET['a'] == $a)
echo 'true';
else
echo 'false';
現在,有沒有什麼辦法將數據發送到打破驗證?很明顯,它可能已經在SQL注入中完成的方式不會進行。
只是想知道這種驗證方式有多安全。
在此先感謝。
編輯:
我的問題是,有沒有什麼可以thorugh $ _GET可能「破」的比較,始終輸出「真」被傳遞。
如果您正在尋找驗證$_GET['a']
真正面臨的問題等於"a"
而沒有別的,比是的,那就是代碼。
但是,如果您期望"a"
且只有"a"
它可能不應該是用戶輸入。
驗證(或衛生),意味着採取任何可能向您發送的字符串,並確保它適用於任何您想要的目的。如果它發送到數據庫,則通過mysql_escape_string()
或使用預準備語句。如果要以HTML格式顯示,請確保使用html_entities()
或strip_tags()
沒有任何有害標籤。
除了說用戶輸入了"a"
之外,您的驗證對於其他任何內容都不是很好。 但是,沒有什麼比"a"
能夠通過。
我的問題是,有什麼可以通過$ _GET,可以'打破'比較,總是輸出'真' 。我完全知道如何清理和驗證用戶輸入數據。只是想知道是否有什麼可以打破比較 – michaeltintiuc 2012-04-03 21:01:47
不,沒有什麼可以打破比較。在PHP中只有「a」將等於「a」。 – 2012-04-03 21:02:27
偉大的,這就是我想知道的,你是否100%確定現在奇怪的ASCII或編碼數據可以通過? – michaeltintiuc 2012-04-03 21:04:16
您可以使用mysqli擴展中的Prepared-Statements,這已經可以防止每個可能的注入。
如果你不想使用這種mysql和mysqli的也有「real_escape_string」,你可以在你的查詢中使用 - 方法在Userinput時,把
例
$sql = "SELECT `name` FROM `example` WHERE `id` = '".mysql_real_escape_string($YOURVAR)."'";
這是關於數據庫的大驚小怪? OP沒有提到這一點 – 2012-04-03 20:58:16
那麼,如果你確切知道什麼是進來,你可以比較沒有類型的強制和檢查一個空的參數:
$a = 'a';
if(!empty($_GET['a']) && $_GET['a'] === $a )
{
//do more validation using your data model
}
else
{
//output error msg
}
考慮沒有設置$ _GET ['a']的情況。也許一個永遠不會傳給你。 – Murtnowski 2012-04-03 20:52:13
您試圖驗證數據的目的是什麼?沒有任何人可以做到從你的腳本中獲得「真」或「假」以外的任何東西。如果沒有設置'$ _GET ['a']',它只會在您的日誌中彈出警告。 – Crontab 2012-04-03 20:52:22
有趣的問題。我想知道是否傳入奇怪的Unicode,或ASCII或任何東西會拋出它。它對我來說很安全...... – kevingreen 2012-04-03 20:53:03