PHP安全:如何保护网站免受SQL注入和XSS攻击

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

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

开始课程

您的PHP网站处于瞄准镜下:为什么黑客喜欢薄弱的安全防护

\n\n

想象一下:您花费数周时间开发了一个很棒的博客或在线商店,使用PHP构建。网站运行正常,访客满意。但在某个“美好”的一天,您登录后台,却发现一片空白——数据库被删除了。或者更糟的是,首页上赫然显示着赌场广告,所有用户都被重定向到钓鱼网站。

\n\n

听起来熟悉吗?不幸的是,对于许多初学者(甚至不止初学者)PHP开发者来说,这是现实。最令人沮丧的是,90%此类攻击都源于两个看似简单的漏洞:SQL注入和跨站脚本攻击(XSS)。黑客并不破解复杂的加密算法——他们只是利用了程序员的疏忽。

\n\n

在本文中,我们不会进行枯燥的说教。我们将从“内部”剖析这些攻击的工作原理,最重要的是,学会设置可靠的防御措施。您将了解如何让您的PHP代码成为攻击者难以攻克的“硬骨头”。我们开始吧!

\n\n

SQL注入:当数据库说出黑客的语言

\n\n

SQL注入(SQL injection)是一种攻击类型,攻击者将恶意SQL代码“注入”到数据库查询中。如果您的应用程序未过滤输入数据,黑客可以迫使数据库执行任何命令:从窃取密码到完全删除表。

\n\n

易受攻击的代码是什么样的?

\n\n

想象一个简单的登录表单。初学者的代码通常如下所示:

\n\n
<?php\n$login = $_POST['login'];\n$password = $_POST['password'];\n\n// 危险!直接拼接到查询中\n$query = "SELECT * FROM users WHERE login = '$login' AND password = '$password'";\n$result = mysqli_query($link, $query);\n?>
\n\n

看起来合情合理。但如果攻击者在登录字段中输入以下字符串会发生什么:

\n\n
' OR '1'='1
\n\n

查询将变为:

\n\n
SELECT * FROM users WHERE login = '' OR '1'='1' AND password = '...'
\n\n

条件 '1'='1' 始终为真。恭喜,黑客刚刚无需密码就进入了系统!而如果他输入 '; DROP TABLE users; --,您的用户表将永远消失。

\n\n

转义 vs. 预处理语句:如何选择?

\n\n

许多旧教材建议使用 mysqli_real_escape_string() 函数。是的,它可以转义特殊字符,但这已经是过时的方法了。这种方法有缺点:

\n\n
    \n
  • 容易忘记对每个变量应用该函数。
  • \n
  • 无法防御所有类型的注入(例如,与LIKE一起使用时)。
  • \n
  • 代码变得混乱且难以维护。
  • \n
\n\n

现代且正确的方法是使用PDO或MySQLi的预处理语句(prepared statements)。它们将查询逻辑与数据分离。数据库首先“编译”查询模板,然后将数据代入其中。即使黑客传递了恶意代码,它也会被当作普通字符串处理,而不是SQL命令的一部分。

\n\n

使用PDO编写安全代码

\n\n

以下是使用PDO(PHP数据对象)进行安全数据库查询的正确方式:

\n\n
<?php\n// 连接数据库\n$dsn = 'mysql:host=localhost;dbname=mydb;charset=utf8mb4';\n$pdo = new PDO($dsn, 'user', 'password');\n\n// 设置错误模式(调试时重要,生产环境应关闭)\n$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);\n\n// 准备查询(模板)\n$stmt = $pdo->prepare("SELECT * FROM users WHERE login = :login AND password = :password");\n\n// 绑定参数并执行\n$stmt->execute([\n    ':login' => $_POST['login'],\n    ':password' => $_POST['password']\n]);\n\n$user = $stmt->fetch();\n\nif ($user) {\n    echo "欢迎!";\n} else {\n    echo "用户名或密码错误";\n}\n?>
\n\n

关

博客

书籍推荐