防止 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中文网其他相关文章!