PHP应用程序十大漏洞:如何保护您的代码
PHP仍然是Web开发中最流行的语言之一。然而,它的灵活性和简单性常常导致严重漏洞的出现。根据OWASP统计,超过70%的Web应用程序至少存在一个严重的安全漏洞。在本文中,我们将分析10种最常见的PHP应用程序漏洞,展示危险代码示例,并提供实用的安全建议。
1. SQL注入 (SQL Injection)
最著名且最危险的攻击方式。攻击者通过用户输入注入SQL代码。
危险代码:
<?php$id = $_GET['id'];$query = "SELECT * FROM users WHERE id = $id";$result = mysqli_query($conn, $query);?>安全代码(使用预处理语句):
<?php$stmt = $conn->prepare("SELECT * FROM users WHERE id = ?");$stmt->bind_param("i", $_GET['id']);$stmt->execute();$result = $stmt->get_result();?>建议:
- 始终使用预处理语句(PDO或MySQLi)。
- 切勿将用户数据直接拼接到SQL查询中。
- 验证数据类型(例如,对ID使用
is_numeric())。
2. XSS(跨站脚本攻击)
通过未经验证的数据将JavaScript代码注入页面。可窃取Cookie、重定向到钓鱼网站。
危险代码:
<?phpecho "你好," . $_GET['name'];?>安全代码:
<?phpecho "你好," . htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8');?>建议:
- 使用
htmlspecialchars()对输出进行转义。 - 在响应头中设置Content-Security-Policy (CSP)。
- 对于JSON响应,使用
json_encode()。
3. CSRF(跨站请求伪造)
攻击者诱使已认证用户执行非自愿操作(例如转账)。
无保护的表单示例:
<form action="delete.php" method="POST"> <input type="hidden" name="id" value="123"> <input type="submit" value="删除"></form>安全代码(带令牌):
<?phpsession_start();if (empty($_SESSION['token'])) { $_SESSION['token'] = bin2hex(random_bytes(32));}?><form action="delete.php" method="POST"> <input type="hidden" name="token" value="<?= $_SESSION['token'] ?>"> <input type="hidden" name="id" value="123"> <input type="submit" value="删除"></form>建议:
- 为每个表单生成唯一的CSRF令牌。
- 在执行操作前在服务器端验证令牌。
- 使用SameSite Cookie(Lax或Strict)。
4. 不正确的身份验证和会话管理
会话保护薄弱、标识符泄露、会话固定攻击。
易受攻击的代码:
<?phpsession_start();if ($_POST['password'] == 'admin123') { $_SESSION['logged'] = true;}?>安全代码:
<?phpsession_start();session_regenerate_id(true); // 登录后更换会话ID
// 密码哈希$hash = password_hash($_POST['password'], PASSWORD_BCRYPT);if (password_verify($input_password, $hash)) { $_SESSION['logged'] = true; $_SESSION['user_agent'] = $_SERVER['HTTP_USER_AGENT'];}?>建议:
- 使用
password_hash()和pas