PHP:filter_var清理足够安全吗?

Eve*_*495 4 php security

我有一个PHP脚本,其中包含以下行:

$query = "SELECT * FROM products WHERE product_id='" . filter_var($_GET[id], FILTER_SANITIZE_NUMBER_INT) . "'";
Run Code Online (Sandbox Code Playgroud)

这样安全吗?你会如何改进这段代码?

Tat*_*nen 5

对于这种情况是安全的,但对于更通用的方法,我宁愿mysql_real_escape_string与类型转换一起使用:

$query = "SELECT * FROM products WHERE product_id='" . (int)mysql_real_escape_string($_GET['id']) . "'";
Run Code Online (Sandbox Code Playgroud)

在最坏的情况下,这将导致a 0并将逃脱所有恶意输入.mysql_real_escape_string可用于各种数据,使查询安全,这使其成为所有逃生/卫生功能中最通用的.

如果不使用预准备语句,您可以使用sprintf创建SQL并自动处理类型转换:

$query = sprintf("SELECT * FROM products WHERE product_id = '%d'", mysql_real_escape_string($_GET['id']));
Run Code Online (Sandbox Code Playgroud)

有关语法,请参阅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']);
Run Code Online (Sandbox Code Playgroud)