1

以前可能已经问过类似的问题,并为此感到抱歉。需要确保我正确地防止 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 注入)还是只是浪费时间?

4

2 回答 2

4

如果您使用的是 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();

如果您使用这种方法,则无需转义字符串。

于 2012-07-26T20:36:16.847 回答
1

他们说您不需要在 PDO 中转义字符串,因为它们使用准备好的语句。如果你只是使用query()mysql 中的 PDO 方法,那并不比只使用 mysql 更安全。至于您给出的示例,它们都同样不安全;他们都同样容易受到注射(而且他们非常容易受到注射)。在切线点上,mysqli扩展有一个优势,PDO因为您不能执行多个 SQL 语句而不是一个mysqli_query(). 这提供了一些(不是完全的)保护来防止一些(同样,不是全部)注入尝试,尤其是那些让新的超级用户等的尝试。

于 2012-07-26T20:39:00.403 回答