sprintf()如何防止SQL注入?

时间:2011-07-11 06:58:01

标签: php mysql sql-injection

我听说sprintf()可以防止SQL注入。这是真的吗?如果是这样,怎么样?

为什么人们建议写这样的查询:

$sql = sprintf('SELECT * FROM TABLE WHERE COL1 = %s AND COL2 = %s',$col1,$col2);

4 个答案:

答案 0 :(得分:9)

这没有任何保护。使用sprintf可以获得更易读的代码,然后放入和退出字符串以在每个变量上运行mysql_real_escape_string ...但是该示例不会在末尾转义变量,从而失去优势。

如果您需要体面的保护,请使用提供bound parameters的内容。

答案 1 :(得分:9)

sprintf不会保护!它只替换%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。