2010-12-09 26 views
7

問題說這一切有希望,如果我檢查一個變量爲is_numeric()返回true,可以直接放入MySQL查詢,還是我需要應用標準轉義?我在想空字符,溢出漏洞和東西。is_numeric()是否意味着var對MySQL安全?

一個不明確的例子是:

if(is_numeric($_GET['user_id'])) { 
    mysql_query("SELECT * FROM `users` WHERE id = ".$_GET['user_id']); 
} 

數據類型在MySQL是INT()。

+1

是$ _GET ['user_id']還是$ _POST ['user_id']? – 2010-12-09 09:45:00

+0

就是這樣的例子:)把它們都更改爲$ _GET – Dunhamzzz 2010-12-09 09:53:45

+6

**不要將數據驗證和數據清理混合在一起!** if(is_numeric(是數據驗證。**可以在將來更改**。雖然清理規則會準備好的陳述的唯一好處在於同樣的理由:如果你需要清理一個變量,它不會*認爲*。**它可以。**時期。所以,要聰明,學會從這個良好的實踐中,根據需要驗證您的輸入,但無條件地清理數據庫變量 – 2010-12-09 10:04:39

回答

8

在我看來,最安全的方法是將USER_ID轉換爲整數,如果無效則返回0。

$user_id = (int) $_GET['user_id']; 

if ($user_id > 0) { 
    mysql_query("SELECT * FROM `users` WHERE `id` = " . $user_id); 
} 
4

http://php.net/manual/en/function.is-numeric.php

使用is_numeric時要小心()轉義SQL字符串。 is_numeric('0123')返回true,但不帶引號的0123不能插入到SQL中。 PHP將不帶引號的0123解釋爲字面八進制數;但SQL只會引發語法錯誤。

4

考慮到「10e3」is_numeric,沒有。

如果你想的數字(如,只有數字),你必須檢查ctype_digit(這將仍然打破像0123數字SQL)或鑄造數量增加到intfloat。如果數字可以接受爲以外的所有數字,則需要應用SQL安全轉義和引用。

-1

因爲PROGRAMM必須不存在id準備好變種這種單排要足夠:

mysql_query(sprintf("SELECT * FROM `users` WHERE `id` = %d LIMIT 1",$_GET['user_id'])); 

不管什麼不會是我們通過sprintf內的十進制數將轉向小數。零(〜壞輸入)具有與沒有現有ID相同的狀態。

保存條件並聲明額外的變量。