以前可能也有人问过类似的问题,对此sry表示赞同。需要确保我对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(来自sql注入)是否比示例2更安全,还是只是浪费了时间?
如果您使用的是PDO,则应该使用带参数的已准备好的语句。文档中有一些示例。
/* 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();
如果使用这种方法,则不需要转义字符串。
他们说你不需要在PDO中转义字符串,因为它们使用了准备好的语句。如果您只是像在mysql中那样使用PDOquery()
方法,那么这并不比只使用mysql更安全。至于你所举的例子,它们都是同样不安全的;他们都同样容易受到注射(而且他们非常容易受到注射)。在切向点上,mysqli
扩展比PDO
有一个优势,因为不能在一个mysqli_query()
上执行多个SQL语句。这提供了一些(不完全)保护,以防某些(再次,不是所有)注入尝试,尤其是那些创建新超级用户之类的尝试。