之前可能已经提出过类似的问题,并为此而烦恼。需要确保我能防止SQL注入正确。
我刚刚将我的php sql语句转换为pdo语句。对于旧的SQL查询,我曾经使用mysql_real_escape_string
,strip_tags()
,也许htmlenteties()
(不确定id是否执行了html)。
在pdo语句中使用这样的东西是否必要。听说过pdo中没有必要的地方。什么是真/假?
并且:我总是习惯于编写查询,如下面的第一个例子:
SELECT `id` , `password` FROM `users` WHERE `username` = '$username'
SELECT id, password FROM users WHERE username = '$username'
示例1是否比示例2更安全(来自sql注入)还是只是浪费时间去做?
答案 0 :(得分:4)
如果您使用PDO,则应使用带参数的预准备语句。 documentation中有一些示例。
/* Execute a prepared statement by passing an array of values */
$sql = 'SELECT name, colour, calories
FROM fruit
WHERE calories < :calories AND colour = :colour';
$sth = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$sth->execute(array(':calories' => 150, ':colour' => 'red'));
$red = $sth->fetchAll();
$sth->execute(array(':calories' => 175, ':colour' => 'yellow'));
$yellow = $sth->fetchAll();
如果您使用此方法,则无需转义字符串。
答案 1 :(得分:1)
他们说你不需要在PDO中转义字符串,因为它们使用prepared statements。如果你只是在mysql中使用PDO query()
方法,那就不比使用mysql更安全了。至于你给出的例子,他们都同样不安全;它们同样容易受到注射(并且它们非常易受注射)。在切线点上,mysqli
扩展名优于PDO
,因为无法在一个mysqli_query()
上执行多个SQL语句。这为一些(同样不是全部)注入尝试提供了一些(非全部)保护,特别是那些制作新超级用户等的注入尝试。