无文本输入/文本域的AJAX关注表单是否需要CSRF Token?
必须添加CSRF Token,原因如下:
- CSRF攻击的核心是利用用户已认证的会话权限发起未授权状态修改请求,和表单里有没有文本输入框/textarea完全无关。你的场景是“用户1关注用户3”,这属于对服务器状态的修改操作(比如更新关注关系表),天然就是CSRF攻击的目标。
- 举个实际攻击场景:攻击者可以构造一个恶意页面,里面隐藏一段JS代码,自动向你的服务器发送和你这个AJAX完全一样的关注请求。只要你的用户(已登录状态)不小心打开了这个恶意页面,就会在不知情的情况下完成关注操作——因为请求会自动携带用户的登录Cookie,服务器会误以为是用户主动发起的请求。
- 哪怕你的表单没有任何输入字段,只要是非幂等的状态修改请求(POST/PUT/DELETE这类),都必须做CSRF防护。
简单的实现方式参考:
- 可以在页面的meta标签里嵌入CSRF Token:
<meta name="csrf-token" content="你的Token值"> - 然后在AJAX请求里,把这个Token放到请求头里(比如
X-CSRF-Token),或者作为POST参数一起发送 - 服务器端验证请求里的Token和用户会话中存储的Token是否一致,不一致则拒绝请求
额外提醒:别用GET请求来处理这个关注操作!GET请求的参数会暴露在URL里,而且更容易被通过图片标签、链接等方式触发CSRF,一定要用POST这类更安全的请求方法。
内容的提问来源于stack exchange,提问作者Jean
相关产品推荐
相关产品推荐

