我正在使用PDO与我的数据库交谈,我想知道是否要使用这样的类型
$dbh->query("SELECT * FROM recipes WHERE id=".(int)$id);
是否足以阻止sql注入?在这种情况下,$ id始终是一个整数。
我也想知道如果变量是一个字符串,在这种语句中防止注入的好方法。
答案 0 :(得分:4)
是。转换为int可防止所有令人讨厌的SQL注入可能性。
如果变量是字符串,则应使用prepared statements传递它。
$sql = 'SELECT name, colour, calories
FROM fruit
WHERE calories < :calories AND colour = :colour';
$sth = $dbh->prepare($sql);
$sth->execute(array(':calories' => 150, ':colour' => 'red'));
$red = $sth->fetchAll();
答案 1 :(得分:3)
由于您已经在使用PDO,因此更好的方法是使用:
这要好得多:
$dbh->prepare("SELECT * FROM recipes WHERE id = ?");
$dbh->bindParam(1, (int) $id);
// more code.....
答案 2 :(得分:0)
您必须在查询中转义表和字段名称:
$dbh->query("SELECT * FROM `recipes` WHERE `id=`'".(int)$id."'");
答案 3 :(得分:0)
由于您专门将$id
转换为整数,因此它是安全的。对于字符串(或任何其他数据类型),您需要在执行查询之前将其转义;看看PDO::quote
。
答案 4 :(得分:0)
是的,如果参数是一个整数,那么绑定到一个整数就足以阻止SQL注入。
您还可以使用Automatic SQL Injection Tool来检测它。
答案 5 :(得分:0)
小心,在PHP (int)
中将NULL转换为0.
因此,如果您在应用程序中与ID为0显着关联,则可能会无意中触发该值。