PHP应用程序安全:初学者必知的10大漏洞

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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

博客

书籍推荐