我有一个PHP脚本,其中包含以下行:
$query = "SELECT * FROM products WHERE product_id='" . filter_var($_GET[id], FILTER_SANITIZE_NUMBER_INT) . "'";
Run Code Online (Sandbox Code Playgroud)
这样安全吗?你会如何改进这段代码?
对于这种情况是安全的,但对于更通用的方法,我宁愿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)
| 归档时间: |
|
| 查看次数: |
1473 次 |
| 最近记录: |