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应用被攻击的风险。