PHP网站SQL注入防护指南

SQL注入是PHP网站常见的安全威胁之一,攻击者通过构造恶意SQL语句来操纵数据库查询。以下是关于PHP网站SQL注入的详细信息和防护措施:

常见SQL注入漏洞

  1. 直接拼接用户输入到SQL语句
  2. php
  3. // 危险示例$sql = "SELECT * FROM users WHERE username = '" . $_POST['username'] . "'";
  4. 使用不安全的函数
    • (已废弃)
  • mysql_query()
    • 不当使用或PDO
  • mysqli_query()
  1. 动态订单/排序参数
  2. php
  3. // 危险示例$order = $_GET['order'] ?? 'id';$sql = "SELECT * FROM products ORDER BY $order";

防护措施

1. 使用预处理语句(Prepared Statements)

PDO方式

php

$pdo = new PDO6', 'user', 'pass');$stmt = $pdo->prepare('SELECT * FROM users WHERE username = :username');$stmt->execute(['username' => $_POST['username']]);$results = $stmt->fetchAll();

MySQLi方式

php

$mysqli = new mysqli('localhost', 'user', 'pass', 'test');$stmt = $mysqli->prepare('SELECT * FROM users WHERE username = ?');$stmt->bind_param('s', $_POST['username']);$stmt->execute();$result = $stmt->get_result();

2. 输入验证和过滤

php

// 验证邮箱格式if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) { die('无效的邮箱地址');}// 验证数字ID$id = isset($_GET['id']) ? (int)$_GET['id'] : 0;

3. 最小权限原则

数据库用户应仅具有必要的最小权限,避免使用root/admin账户。

4. 其他安全措施

  • 使用Web应用防火墙(WAF)
  • 定期更新PHP和数据库系统
  • 错误处理:不要显示数据库错误给用户
  • php
  • // 在生产环境中关闭错误显示ini_set('display_errors', 0);

检测SQL注入漏洞

  1. 手动测试
    • 尝试输入单引号()观察错误
    • 测试等经典注入语句
  • 1' OR '1'='1
    • 测试注释符(,)
  1. 自动化工具
    • SQLMap
    • Burp Suite
    • OWASP ZAP

修复已存在的漏洞

如果发现网站存在SQL注入漏洞:

  1. 立即暂停受影响的功能
  2. 分析漏洞点
  3. 应用上述防护措施
  4. 测试修复效果
  5. 监控异常数据库活动

最佳实践

  • 始终使用现代数据库扩展(PDO或MySQLi)
  • 避免拼接SQL语句
  • 对动态排序/过滤参数使用白名单验证
  • 实施深度防御策略(多层安全措施)

通过实施这些措施,可以显著降低PHP网站遭受SQL注入攻击的风险。