PHP安全编码指南:保护你的应用免受攻击

PHP安全编码是保护Web应用的关键,以下是针对SQL注入、XSS、CSRF等常见攻击的核心防护措施:


1. 防范SQL注入攻击

  • 参数化查询(预处理语句)
    使用PDO或MySQLi扩展,严格分离SQL逻辑与用户输入:
    $stmt = $pdo->prepare("SELECT * FROM users WHERE email = :email");
    $stmt->bindParam(':email', $userInput);
    $stmt->execute();
  • 输入过滤与白名单验证
    对用户输入的数据类型(如数字、邮箱格式)进行校验,避免非法字符:
    $email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);

2. 防御XSS(跨站脚本攻击)

  • 输出转义
    在输出用户数据到HTML时,强制转义特殊字符:
    echo htmlspecialchars($userContent, ENT_QUOTES, 'UTF-8');
  • 设置安全HTTP头
    启用CSP(内容安全策略),限制脚本来源:
    header("Content-Security-Policy: default-src 'self'");

3. 防止CSRF(跨站请求伪造)

  • 使用CSRF令牌
    生成唯一令牌并验证表单来源:
    session_start();
    $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
    // 表单中隐藏字段:
    <input type="hidden" name="csrf_token" value="<?= $_SESSION['csrf_token'] ?>">
    if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
        die("CSRF验证失败!");
    }
  • 限制请求方法
    敏感操作(如修改数据)强制使用POST,避免GET暴露参数。

4. 文件上传安全

  • 严格验证文件类型与内容
    检查MIME类型及文件扩展名,禁止执行权限:
    $allowedTypes = ['image/jpeg', 'image/png'];
    if (in_array($_FILES['file']['type'], $allowedTypes)) {
        // 处理上传
    }
  • 存储隔离
    将上传文件保存在非Web根目录,防止直接访问。

5. 其他关键措施

  • 错误处理
    关闭生产环境错误显示,避免泄露敏感信息:
    error_reporting(0);
    ini_set('display_errors', 'Off');
  • 依赖更新
    定期升级PHP版本及框架(如Laravel/Symfony),修复已知漏洞。
  • 权限最小化
    数据库连接使用低权限账号,避免root账户直接操作。

工具推荐

  • 静态分析工具:PHPStan、Psalm(检测代码漏洞)
  • 渗透测试工具:OWASP ZAP、Burp Suite
  • 安全库paragonie/random_compat(安全随机数生成)

通过结合代码规范、安全工具及持续监控,可大幅降低PHP应用被攻击的风险。

搜索