首页 > 后端开发 > php教程 > 准备好的语句如何防止 PHP 应用程序中的 SQL 注入攻击?

准备好的语句如何防止 PHP 应用程序中的 SQL 注入攻击?

DDD
发布: 2024-12-21 16:46:10
原创
631 人浏览过

How Can Prepared Statements Prevent SQL Injection Attacks in PHP Applications?

防止 PHP 中的 SQL 注入攻击

在 Web 应用程序中,用户输入如果不处理,往往会导致 SQL 注入等漏洞适当地。当用户提供的数据未经适当的验证或清理而直接包含在 SQL 语句中时,就会发生 SQL 注入。

问题

考虑以下 PHP 代码片段:

$unsafe_variable = $_POST['user_input'];

mysql_query("INSERT INTO `table` (`column`) VALUES ('$unsafe_variable')");
登录后复制

如果用户输入恶意数据,例如值'); DROP TABLE table;--,SQL 查询变为:

INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')
登录后复制

这将导致恶意用户从数据库中删除整个表。

解决方案:准备好的语句和参数化

防止SQL注入的推荐解决方案是使用准备好的语句和参数化来将数据与SQL分离查询。这确保用户输入被视为数据而不是可执行命令。

使用 PDO

PDO 为各种数据库驱动程序提供一致且通用的接口。要将预准备语句与 PDO 结合使用:

$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');
$stmt->execute(['name' => $name]);

foreach ($stmt as $row) {
    // Do something with $row
}
登录后复制

使用 MySQLi

对于 MySQL,MySQLi 在 PHP 8.2 中提供了execute_query() 方法:

$result = $db->execute_query('SELECT * FROM employees WHERE name = ?', [$name]);
while ($row = $result->fetch_assoc()) {
     // Do something with $row
 }
登录后复制

或者,在 PHP 之前的版本中8.2:

$stmt = $db->prepare('SELECT * FROM employees WHERE name = ?');
$stmt->bind_param('s', $name); // 's' specifies the variable type as string
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
     // Do something with $row
 }
登录后复制

对于其他数据库驱动程序,请参阅其具体文档。

正确的连接设置

为了确保真正的保护,至关重要配置数据库连接正确:

PDO

禁用模拟准备语句:

$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
登录后复制

MySQLi

启用错误报告并设置角色set:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$dbConnection = new mysqli('127.0.0.1', 'username', 'password', 'test');
$dbConnection->set_charset('utf8mb4');
登录后复制

说明

准备好的语句由数据库服务器解析和编译,而参数被视为单独的值。这可以防止恶意输入被解释为命令。

结论

通过使用准备好的语句和参数化,您可以有效地保护您的 PHP Web 应用程序免受 SQL 注入攻击并维护数据完整性。

以上是准备好的语句如何防止 PHP 应用程序中的 SQL 注入攻击?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板