GET请求里放修改操作会被CSRF攻击吗? Zz超霞 提问于 2026-03-23 16:35:20 阅读 19 安全 我最近在做用户设置页面,不小心把“删除草稿”功能写成了GET请求,类似点个链接就删了。后来听说这样会有CSRF风险,但我不太确定是不是真的有问题? 比如下面这种写法: <a href="/api/delete-draft?id=123" rel="external nofollow" >删除草稿</a> <!-- 后端用PHP接收$_GET['id']然后直接删库 --> 我已经改成POST了,但想搞明白:为什么GET不能用来做数据修改?浏览器或服务器层面会自动防这种攻击吗? CSRF防护Web安全 我来解答 赞 3 收藏 分享 生成中... 手机扫码查看 复制链接 生成海报 反馈 发表解答 您需要先 登录/注册 才能发表解答 1 条解答 志鸽 Lv1 你说的情况确实存在CSRF(跨站请求伪造)的风险。GET请求通常用于获取数据,而不应该用来执行修改操作,比如删除数据。这是因为GET请求可以通过多种方式被触发,比如点击链接、加载图片、甚至是通过其他网站的iframe等,这给了攻击者一个利用的机会。 在你的例子中,如果攻击者诱导用户访问一个包含恶意链接的页面,用户的浏览器会在不知情的情况下发送一个GET请求到你的服务器,从而删除指定的草稿。这就是典型的CSRF攻击。 改成POST请求是个好的改进,因为POST请求不会被浏览器自动发送,需要用户明确的交互,比如点击提交按钮。但这还不够,为了进一步防止CSRF攻击,你还需要在每个表单中添加一个唯一的CSRF令牌,并在服务器端验证这个令牌。 这里有个简单的PHP示例来说明如何生成和验证CSRF令牌: session_start(); // 生成CSRF令牌 if (!isset($_SESSION['csrf_token'])) { $_SESSION['csrf_token'] = bin2hex(random_bytes(32)); } // 显示表单,包含CSRF令牌 echo ' 删除草稿 '; // 验证CSRF令牌 if ($_SERVER['REQUEST_METHOD'] === 'POST') { if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) { die('Invalid CSRF token'); } // 处理删除逻辑 $draftId = $_POST['id']; // 这里要记得防止SQL注入,最好使用预处理语句 $stmt = $pdo->prepare('DELETE FROM drafts WHERE id = :id'); $stmt->execute(['id' => $draftId]); } 这样做可以有效防止CSRF攻击,同时记得对用户输入的数据进行适当的验证和清理,防止SQL注入等其他安全问题。虽然现代浏览器有一些内置的安全机制来防止CSRF,但我们不能完全依赖它们,还是需要自己实现一些防御措施。 回复 点赞 2026-03-23 17:00 加载更多 相关推荐 2 回答 49 浏览 为什么在GET请求中添加CSRF Token反而导致接口验证失败? 在开发Vue项目时,我尝试给所有请求都加上CSRF防护。但发现当用GET请求获取数据时,把Token加到查询参数里后,后端直接返回403错误。而改成POST请求后却能正常通过验证。 我的代码是这样的:... 亚楠~ 安全 2026-02-15 15:08:31 2 回答 31 浏览 GET请求里带操作参数会被CSRF攻击吗? 我最近在做用户删除功能,后端同事说不能用GET请求做删除,但我看有些老接口还是用GET传id删数据。现在我用React写了个按钮,点一下就发GET请求删用户,但安全扫描工具报了CSRF风险,这到底是不... 南宫弋焱 安全 2026-02-27 18:30:22 2 回答 36 浏览 GET请求能用来提交敏感操作吗?CSRF防护怎么处理? 最近在写一个删除用户的功能,后端同事说要用 POST,但我图省事直接用 GET 发了个带 token 的链接,结果被安全扫描工具报了 CSRF 风险。不是已经有 token 了吗?为啥 GET 还不行... A. 雨涵 安全 2026-03-09 04:15:20 1 回答 33 浏览 前端如何配合后端做好CSRF防护?状态变更操作总被拦截怎么办? 我们项目里用的是 cookie + CSRF token 的方案,后端要求所有修改数据的请求(比如 POST、PUT)都必须带一个叫 X-CSRF-Token 的 header。但我发现每次提交表单时... 萌新.莉莉 安全 2026-02-27 17:53:20 1 回答 27 浏览 前端如何正确设置CSRF Token到请求头中? 我们后端启用了CSRF防护,要求每个POST请求都必须带上 X-CSRF-Token 请求头。我在登录成功后把token存到了 localStorage 里,但在发起请求时总是被拦截,提示 token... 书生シ莉莉 安全 2026-03-13 15:29:20 2 回答 51 浏览 Vue项目CSRF防护时验证请求头总失败怎么办? 我在Vue项目里用axios发请求时设置了X-CSRF-Token头,但后端一直返回403错误。之前在登录接口成功获取到token并存到cookie里了,代码是这样的: <script> ... 秀丽 安全 2026-02-08 23:42:30 2 回答 49 浏览 为什么StatelessWidget的数据在修改后界面没变化? 我在用StatelessWidget实现一个计数器,点击按钮时调用父组件的回调修改数据,但界面始终没变化。已经确认数据确实更新了,也尝试过用setState()强制刷新父组件,但子组件显示的数值还是没... 爱玲的笔记 移动 2026-02-06 16:40:39 2 回答 88 浏览 Double Submit Cookie如何防止CSRF攻击?我的实现总出现跨域问题怎么办? 我按照教程实现了双重提交Cookie,后端设置了CSRF-TOKEN到Cookie和响应头,前端在请求头带上这个Token。但测试时发现,跨域请求时浏览器报“Blocked cookie with s... シ莉莉 安全 2026-02-03 20:16:34 2 回答 88 浏览 为什么我的Anti-CSRF Token在跨域请求时失效了? 我在单页应用里用JWT做Anti-CSRF防护,每次登录后把token存在cookie并带上自定义请求头。但调用支付接口时后端返回403,明明请求头里带了正确的token值。 尝试过在Express后... 百里玲玲 安全 2026-02-01 08:29:30 2 回答 110 浏览 为什么修改元素样式后getBoundingClientRect返回旧值? 我在开发一个动态布局的组件时遇到奇怪的问题。当我用JavaScript修改元素宽度后,立即调用getBoundingClientRect获取尺寸,返回的还是修改前的值。比如这段代码: function... 宇文月怡 前端 2026-02-01 01:11:36
在你的例子中,如果攻击者诱导用户访问一个包含恶意链接的页面,用户的浏览器会在不知情的情况下发送一个GET请求到你的服务器,从而删除指定的草稿。这就是典型的CSRF攻击。
改成POST请求是个好的改进,因为POST请求不会被浏览器自动发送,需要用户明确的交互,比如点击提交按钮。但这还不够,为了进一步防止CSRF攻击,你还需要在每个表单中添加一个唯一的CSRF令牌,并在服务器端验证这个令牌。
这里有个简单的PHP示例来说明如何生成和验证CSRF令牌:
这样做可以有效防止CSRF攻击,同时记得对用户输入的数据进行适当的验证和清理,防止SQL注入等其他安全问题。虽然现代浏览器有一些内置的安全机制来防止CSRF,但我们不能完全依赖它们,还是需要自己实现一些防御措施。