PHP:filter_var安全性足够安全吗?
问题描述:
我有以下行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']) . " ");
+1
尽管此代码片段可能会解决问题,但[包括解释](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