PHP如何防止SQL注入

Tags: php how-to

PHP如何防止SQL注入

使用Prepared Statement和参数化的查询。这些SQL 语句和参数会发送到数据库服务器并由数据库服务器解析。这种方式下攻击者不可能注入恶意 SQL。

基本上有两个方式可用于实现这一目标:

1. 使用PDO预处理语句

$statement = $pdo->prepare('SELECT * FROM foo WHERE bar = :bar');

$statement->execute(array('bar' => $bar));

foreach ($statement as $row) {
    // do something with $row
}

请注意当使用 PDO 访问 MySQL 数据库时Prepared Statement不是默认使用的。要解决此问题,您必须禁用仿真Prepared Statement。创建一个使用 PDO 连接的示例是:

$conn = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass');

$conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

在上面的示例中的错误模式并不是绝对必要的,但建议添加它。这种方式的脚本不会停止,当一个致命错误发生时。它让开发人员有机会处理 PDOExceptions。
但是必须在第一行,告诉 PDO 禁用模拟Prepared Statement(使用setAttribute()),并使用真实预准备语句。这将确保该语句和值在PHP 发送到 MySQL 服务器 之前不会解析值(让可能的攻击者没有机会注入恶意 SQL)。
虽然您可以在构造函数的选项中设置字符集。请注意 老版本的 PHP (< 5.3.6)默认忽略在 DSN 中的charset参数。

2. 使用MySQL的预处理语句

$statement = $dbConnection->prepare('SELECT * FROM foo WHERE bar = ?');
$statement->bind_param('s', $bar);

$statement->execute();

$result = $statement->get_result();
while ($row = $result->fetch_assoc()) {
    // do something with $row
}

本文链接:http://www.4byte.cn/learning/120041/php-ru-he-fang-zhi-sql-zhu-ru.html



相关文章