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

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

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

开始课程

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

\n

PHP仍然是Web开发中最流行的语言之一,但如果不遵守基本的安全规则,其灵活性往往会带来漏洞。根据OWASP的数据,大多数入侵都是由初学者常犯的10种典型错误造成的。在本文中,我们将通过真实的代码示例逐一分析每个漏洞,并展示如何保护您的应用程序。

\n\n

1. SQL注入(SQL Injection)

\n

最常见的攻击方式。攻击者通过用户输入注入恶意的SQL代码。

\n

有漏洞的代码:

\n
<?php\n$id = $_GET['id'];\n$query = "SELECT * FROM users WHERE id = $id";\n$result = mysqli_query($conn, $query);\n?>
\n

防护措施: 使用预处理语句(prepared statements):

\n
<?php\n$stmt = $conn->prepare("SELECT * FROM users WHERE id = ?");\n$stmt->bind_param("i", $_GET['id']);\n$stmt->execute();\n$result = $stmt->get_result();\n?>
\n\n

2. XSS(跨站脚本攻击)

\n

通过未经验证的数据将JavaScript代码注入到页面中。

\n

有漏洞的代码:

\n
<?php\necho "你好," . $_GET['name'];\n?>
\n

防护措施: 使用htmlspecialchars()对输出进行转义:

\n
<?php\necho "你好," . htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8');\n?>
\n\n

3. CSRF(跨站请求伪造)

\n

一种攻击方式,用户以自身身份执行非预期的操作。

\n

有漏洞的代码:

\n
<form action="/delete.php" method="POST">\n    <input type="submit" value="删除账户">\n</form>
\n

防护措施: 添加CSRF令牌:

\n
<?php\nsession_start();\n$_SESSION['csrf_token'] = bin2hex(random_bytes(32));\n?>\n<form action="/delete.php" method="POST">\n    <input type="hidden" name="csrf_token" value="<?= $_SESSION['csrf_token'] ?>">\n    <input type="submit" value="删除账户">\n</form>
\n\n

4. 不安全的密码存储

\n

以明文形式或使用过时的哈希算法(MD5、SHA1)存储密码。

\n

有漏洞的代码:

\n
<?php\n$password = md5($_POST['password']);\n// 或者\n$password = sha1($_POST['password']);\n?>
\n

防护措施: 使用password_hash()和password_verify():

\n
<?php\n$hash = password_hash($_POST['password'], PASSWORD_BCRYPT);\n// 验证:\nif (password_verify($input_password, $hash)) {\n    echo "密码正确";\n}\n?>
\n\n

5. 不安全的文件操作(本地/远程文件包含)

\n

通过用户输入包含文件而不进行验证。

\n

有漏洞的代码:

\n
<?php\ninclude($_GET['page'] . '.php');\n?>
\n

防护措施: 使用允许文件的白名单:

\n
<?php\n$allowed_pages = ['home', 'about', 'contact'];\n$page = $_GET['page'] ?? 'home';\nif (in_array($page, $allowed_pages)) {\n    include($page . '.php');\n} else {\n    include('404.php');\n}\n?>
\n\n

6. 错误的会话配置

\n

使用可预测的会话标识符或未重新生成会话。

\n

有漏洞的代码:

\n
<?php\nsession_start();\n$_SESSION['user_id'] = $user_id;\n// 登录后未重新生成会话\n?>
\n

防护措施:

\n
<?php\nsession_start();\nsession_regenerate_id(true); // 登录后重新生成ID\n$_SESSION['user_id'] = $user_id;\n?>
\n\n

7. 输入验证不足

\n

信任来自用户的任何数据。

\n

有

博客

书籍推荐