在PHP中如何防止跨站请求伪造(CSRF)?
2026/9/3 12:37:42 网站建设 项目流程

什么是跨站请求伪造(CSRF)?

跨站请求伪造,简称CSRF,是一种网络安全攻击,攻击者诱导受害者执行一个恶意的请求。比如,你可能在浏览一个网页的时候,同时登录了网上银行,如果这时你点击了一个恶意链接,这个链接可能会代表你进行一笔转账,而你完全不知情。

如何防止跨站请求伪造?

在PHP中,防止CSRF攻击的一种常用方法是使用令牌(token)。这个令牌就像一个独一无二的密码,只有知道这个密码的请求才能被服务器接受。当用户打开一个页面时,服务器会生成一个令牌,并把它放在页面上。当用户提交表单时,这个令牌也会被一起提交,服务器会检查这个令牌是否正确,如果不正确,就拒绝这个请求。

底层原理是什么?

令牌机制的核心原理是:只有服务器和用户知道这个令牌,而攻击者不知道。这样,即使攻击者能够诱导用户发出一个请求,他们也无法伪造出正确的令牌,因此服务器会拒绝这个请求。

通俗的解释

想象一下,你去游乐园玩,需要凭票入场。这张票就相当于我们的令牌。游乐园(服务器)给了你一张独特的票(令牌),只有拿着这张票的人才能进入游乐园。如果你把票弄丢了,或者别人捡到了你的票(CSRF攻击),他们也不能进去,因为游乐园会检查票的真伪。

PHP实例代码

以下是一个简单的PHP代码示例,展示如何使用令牌防止CSRF攻击:

<?php // 生成一个随机的令牌 function generateToken() { return bin2hex(random_bytes(16)); } // 检查令牌是否正确 function checkToken($token) { // 假设我们将令牌保存在了session中 if (isset($_SESSION['token']) && $_SESSION['token'] === $token) { return true; } return false; } // 当用户打开页面时,生成并保存令牌 session_start(); $_SESSION['token'] = generateToken(); // 在HTML表单中添加一个隐藏的输入字段来保存令牌 ?> <form action="submit.php" method="post"> <!-- 其他表单字段 --> <input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>"> <input type="submit" value="提交"> </form> <?php // 在处理表单提交的页面(如submit.php)中,检查令牌 if ($_SERVER['REQUEST_METHOD'] === 'POST') { if (checkToken($_POST['token'])) { // 令牌正确,处理表单数据 // ... } else { // 令牌错误,拒绝请求 echo "错误的令牌!"; } } ?>

这个例子中,当用户打开页面时,服务器会生成一个令牌并保存在session中,同时在表单中添加一个隐藏的字段来保存这个令牌。当用户提交表单时,这个令牌也会被一起提交。服务器会检查提交的令牌和保存在session中的令牌是否一致,如果一致,就接受请求;如果不一致,就拒绝请求。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询