php pdo语句vs MsSQL逃脱?

时间:2012-07-26 20:33:49

标签: php sql pdo

之前可能已经提出过类似的问题,并为此而烦恼。需要确保我能防止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是否比示例2更安全(来自sql注入)还是只是浪费时间去做?

2 个答案:

答案 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语句。这为一些(同样不是全部)注入尝试提供了一些(非全部)保护,特别是那些制作新超级用户等的注入尝试。