保护您的数据库:准备好的语句和 SQL 注入预防
SQL 注入仍然是一个严重的安全漏洞,允许攻击者将有害的 SQL 代码注入到数据库输入中。 防御的核心原则是将数据与可执行的SQL命令严格分离。 这确保数据被视为数据,而不是潜在危险的指令。
准备好的陈述:最好的防御
阻止 SQL 注入的最可靠方法是使用准备好的语句。 这些是预编译的 SQL 查询,其中参数是单独处理的,可防止恶意代码注入。 用于实现准备好的语句的流行 PHP 扩展包括 PDO 和 MySQLi。
通过 PDO 和 MySQLi 使用准备好的语句
PDO: PDO 提供了一种干净且一致的方法:
<code class="language-php">$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name'); $stmt->execute(['name' => $name]);</code>
MySQLi(PHP 8.1 及以下):
<code class="language-php">$stmt = $db->prepare('SELECT * FROM employees WHERE name = ?'); $stmt->bind_param('s', $name); // 's' denotes a string parameter $stmt->execute();</code>
MySQLi(PHP 8.2 及更高版本): PHP 8.2 简化了流程:
<code class="language-php">$result = $db->execute_query('SELECT * FROM employees WHERE name = ?', [$name]);</code>
基本数据库连接配置
正确的数据库连接设置对于准备好的语句有效运行至关重要。
PDO:禁用模拟准备好的语句以获得最佳安全性:
<code class="language-php">$dbConnection = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8mb4', 'user', 'password'); $dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);</code>
MySQLi: 实现强大的错误处理和字符集设置:
<code class="language-php">mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); // Enable detailed error reporting $dbConnection = new mysqli('127.0.0.1', 'username', 'password', 'test'); $dbConnection->set_charset('utf8mb4'); // Set character set</code>
准备好的语句的优点
准备好的陈述有很多好处:
以上是准备的陈述如何防止SQL注入?的详细内容。更多信息请关注PHP中文网其他相关文章!