PHP应用程序安全:新手必知的十大漏洞
PHP仍然是Web开发中最流行的语言之一,但其灵活性常常导致严重的安全错误。新手很容易忽略关键漏洞,这可能导致数据泄露或服务器被完全攻破。在本文中,我们将分析10种最常见的PHP应用程序漏洞,展示危险代码示例,并教你如何正确防御。本材料专为希望从第一天起编写安全代码的初级开发人员准备。
1. SQL注入 (SQL Injection)
这是最著名且最危险的漏洞。当用户输入未经转义直接拼接到SQL查询中时就会发生。攻击者可以访问数据库、修改或删除数据。
危险代码:
<?php$id = $_GET['id'];$query = "SELECT * FROM users WHERE id = $id";$result = mysqli_query($conn, $query);?>如何防御: 使用PDO或MySQLi的预处理语句 (prepared statements)。
<?php$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");$stmt->execute(['id' => $_GET['id']]);?>2. XSS (跨站脚本攻击)
XSS允许攻击者向其他用户显示的页面中注入恶意JavaScript代码。这可能导致会话cookie被盗或重定向到钓鱼网站。
危险代码:
<?phpecho "你好, " . $_GET['name'];?>如何防御: 始终使用htmlspecialchars()转义输出。
<?phpecho "你好, " . htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8');?>3. CSRF (跨站请求伪造)
CSRF攻击迫使已认证用户在网站上执行非预期的操作(例如更改密码或转账)。当用户在第三方网站上点击链接时,攻击就会发生。
如何防御: 对所有表单和更改状态的请求使用CSRF令牌。
<?phpsession_start();if (empty($_SESSION['csrf_token'])) { $_SESSION['csrf_token'] = bin2hex(random_bytes(32));}?><form method="POST"> <input type="hidden" name="csrf_token" value="<?= $_SESSION['csrf_token'] ?>"> <button type="submit">删除账户</button></form>4. 不安全的文件操作
允许攻击者读取或写入服务器上的任意文件。例如,通过路径遍历 (path traversal) 或上传PHP webshell。
危险代码:
<?phpinclude($_GET['page'] . '.php');?>如何防御: 切勿在文件路径中使用用户输入。使用允许值的白名单。
<?php$allowed_pages = ['home', 'about', 'contact'];$page = $_GET['page'] ?? 'home';if (in_array($page, $allowed_pages)) { include($page . '.php');} else { include('404.php');}?>5. 认证和会话管理缺陷
弱密码、缺乏暴力破解防护、会话固定——所有这些都为账户劫持打开了大门。
建议:
- 仅通过
password_hash()以哈希形式存储密码。 - 对所有认证页面使用HTTPS。
- 登录后重新生成会话ID:
session_regenerate_id(true)。 - 设置较短的会话生命周期。
6. 不安全的直接对象引用 (IDOR)
ID