避免CSRF攻击的方案

CSRF攻击的方式

恶意网站发送对感兴趣网站的请求(或者正常网站发送恶意请求,但一般正常网站不可能这么做),显然,这肯定属于跨域请求了。

解决思路

跨域角度

首先,对跨域行为进行限制:

  • 限制cookie
    • 禁止第三方网站的cookie被携带:跨域请求时,不允许携带cookie。通过SameSite属性为strict来设置。
    • 限制cookie的作用范围:避免造成更大范围的攻击。
  • ajax请求:严格限制ajax请求的跨域白名单,并且服务端严格区分HTTP请求的动词,因为浏览器并不会阻止ajax的GET请求发出,服务端是可以处理跨域ajax的GET请求(以及OPTIONS、HEAD等),所以如果允许跨域ajax,则最多允许OPTIONS、HEAD、GET方法
  • 检查referrer首部

针对CSRF的方式

表单使用脚本自动提交

使用表单让脚本自动提交的方式可以进行CSRF攻击

form method="POST" action="https://www.a.com/update" enctype="multipart/form-data"> 
    <input type="hidden" name="hello" value="update state"/> 
    .....
    <input type="hidden" name="attack" value="csrf attack"/> 
</form> 
<script> 
    document.forms[0].submit();
</script>
  • 只使用JSON API:避免application/x-www-form-urlencoded的form提交
  • 避免使用POST请求:该form提交只能使用GET或者POST
  • 不要对form表单进行方法重写:不要将form的POST请求重写为PUT、DELETE等
使用CSRF token进行请求验证

服务端下发用于CSRF token用于请求验证,客户端使用脚本进行请求时,携带该token进行验证,而恶意网站是无法获取到该token的值。这种方式要求token值一定要是随机生成。

  • 在表单内植入该token值:<input type="hidden" name="csrf_token" value="{{ csrf_token_value }}" />
  • 在静态资源和a链接的URL内植入token:https://www.a.com/bbb/cc?a=b&csrf_token={{csrf_token_value}}
  • 跨域的脚本请求可以使用自定义首部携带该token
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CSRF token invalid是一个常见的错误信息,通常出现在服务端无法接受post请求时。CSRF(跨站请求伪造)是一种web攻击方式,目的是利用用户在一个网站上已登录的身份来进行恶意操作。为了防止这种攻击,服务端会生成一个CSRF token,并将其与表单一起发送给客户端。客户端在发送post请求时需要将该token作为请求的一部分发送给服务端。服务端会比对请求中的CSRF token和自己生成的token是否一致,如果不一致,则会返回"invalid csrf token"错误信息。 要解决CSRF token invalid错误,有几种可能的解决方案。一种是在服务端的配置文件中关闭CSRF防范,这样可以避免在本地测试时出现该错误。另一种解决方案是增加适当的插件,比如yhsd-api插件,在使用该插件后,可以直接通过app.Yhsd获取yhsd-api,无需额外的require('yhsd-api')操作。同时,该插件还提供了一些常用的方法,可以帮助处理CSRF token相关的问题。 总结起来,解决CSRF token invalid错误的方法主要包括关闭CSRF防范和使用适当的插件来处理CSRF token。具体的实现方式可以根据你的需求和具体的技术栈来选择。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Egg post 失败 { message: 'invalid csrf token' } 解决方案](https://blog.csdn.net/weixin_43704471/article/details/90763103)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [yhsd-egg:友好速搭插件开发egg.js:egg:扩展框架——yhsd-egg:egg:!](https://download.csdn.net/download/weixin_42123456/18521303)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值