我听说sprintf()
可以防止SQL注入。这是真的吗?如果是这样,怎么样?
为什么人们建议写这样的查询:
$sql = sprintf('SELECT * FROM TABLE WHERE COL1 = %s AND COL2 = %s',$col1,$col2);
答案 0 :(得分:9)
这没有任何保护。使用sprintf
可以获得更易读的代码,然后放入和退出字符串以在每个变量上运行mysql_real_escape_string
...但是该示例不会在末尾转义变量,从而失去优势。
如果您需要体面的保护,请使用提供bound parameters的内容。
答案 1 :(得分:9)
%s
你必须mysql_real_escape_string所以:
$sql = sprintf('SELECT * FROM TABLE WHERE COL1 = "%s" AND COL2 = "%s"',
mysql_real_escape_string($col1),
mysql_real_escape_string($col2));
是更安全的注射
注意:我想你看看PDO,这就是我喜欢用于DBconections和查询的内容
答案 2 :(得分:3)
使用sprintf可以防止数字字段的SQL注入:
$sql = sprintf("SELECT * FROM table WHERE col1 = %i", $col1);
通过这种方式使用sprintf,您可以确定$ col1将被转换为整数 - 尽管它可能会生成错误或警告,如果它不是真正的整数。
防止SQL注入的正确方法是检查所有输入值,并进行转义。但是在其他问题中我会更全面地介绍,所以我不打算详细介绍。
答案 3 :(得分:1)
它显然没有,如果你真的在书或教程中读到它,你应该自动丢弃它以备将来参考。
但是,它可以是生成需要进一步处理的输出的实用方法。请比较:
echo '<p>Hello, <strong></strong>' . htmlspecialchars($name) . ', welcome to ' . htmlspecialchars($place). '</p>';
echo sprintf('<p>Hello, <strong>%s</strong>, welcome to %s</p>',
htmlspecialchars($name),
htmlspecialchars($place)
);
同样适用于其他类型的输出,例如SQL代码,但当然您仍然需要做一些事情来输入以使其安全:sprintf()只是一个不知道SQL和数据库的常规字符串函数。
请注意,绑定参数使用类似的语法:
// Fictional DB abstraction layer
$sql = 'SELECT foo_id
FROM foo
WHERE name=:name AND status=:status';
$params = array(
'name' => $name,
'status' => $status,
);
$result = $db->run($sql, $params);
这就是为什么我特别容易使用那些提供这种语法的数据库库,比如PDO。