我有以下行PHP腳本:PHP:filter_var安全性足夠安全嗎?
$query = "SELECT * FROM products WHERE product_id='" . filter_var($_GET[id], FILTER_SANITIZE_NUMBER_INT) . "'";
這是足夠安全?你會如何改進這個代碼?
我有以下行PHP腳本:PHP:filter_var安全性足夠安全嗎?
$query = "SELECT * FROM products WHERE product_id='" . filter_var($_GET[id], FILTER_SANITIZE_NUMBER_INT) . "'";
這是足夠安全?你會如何改進這個代碼?
正是出於這種情況下的安全,但更普遍的做法,我寧願結合使用mysql_real_escape_string
型鑄造:
$query = "SELECT * FROM products WHERE product_id='" . (int)mysql_real_escape_string($_GET['id']) . "'";
在最壞的情況下,這將導致0
和意志也逃脫所有惡意輸入。 mysql_real_escape_string
可用於各種數據,以確保查詢的安全性,從而使其成爲所有逃生/衛生功能中最通用的。
沒有去儘可能使用準備好的語句,你可以用sprintf來創建你的SQL和自動處理的類型轉換:
$query = sprintf("SELECT * FROM products WHERE product_id = '%d'", mysql_real_escape_string($_GET['id']));
請參閱從PHP手冊sprintf條目的語法。
,如果你使用array_map
逃避所有$_GET
和$_POST
變量變得更加簡單,那麼你可以將它們用作是:
$_GET = array_map('mysql_real_escape_string', $_GET);
$_POST = array_map('mysql_real_escape_string', $_POST);
$query = sprintf("SELECT * FROM products WHERE product_id = '%d'", $_GET['id']);
我通常只使用intval:
$product_id = intval($_GET['id']);
$query = "SELECT * FROM products WHERE product_id='" . $product_id . "'";
可能這對你有用......!
$query=query("SELECT * FROM products WHERE product_id= ". escape_string($_GET['id']) . " ");
儘管此代碼片段可能會解決問題,但[包括解釋](http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)確實有助於提高帖子的質量。請記住,您將來會爲讀者回答問題,而這些人可能不知道您的代碼建議的原因。 – 2017-02-21 07:05:27
+1,也有更好的支持,因爲filter_var只適用於PHP 5.2或更高版本。 – 2010-01-05 09:51:27
謝謝你的徹底解答。 – Evenz495 2010-01-05 10:37:18