Php-pdo语句与MsSQL转义


Php pdo statement vs MsSQL escaping?

以前可能也有人问过类似的问题,对此sry表示赞同。需要确保我对SQL注入的保护是正确的。

我刚刚将我的php-sql语句转换为pdo语句。对于旧的sql查询,我曾经使用mysql_real_escape_stringstrip_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语句。这提供了一些(不完全)保护,以防某些(再次,不是所有)注入尝试,尤其是那些创建新超级用户之类的尝试。