避免CSRF攻击的方案

CSRF攻击的方式

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

解决思路

跨域角度

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

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

针对CSRF的方式

表单使用脚本自动提交

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

html 复制代码
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
相关推荐
唐古乌梁海6 天前
Flask项目中CSRF Token实现的解决方案
python·flask·csrf
汉堡包00111 天前
【靶场练习】--DVWA第三关CSRF(跨站请求伪造)全难度分析
前端·安全·csrf
余防12 天前
CSRF跨站请求伪造
前端·安全·web安全·csrf
修炼果14 天前
为什么使用 Redis 存储Oauth的state 参数,可有效防止 CSRF 攻击
数据库·redis·csrf
emma羊羊14 天前
【CSRF】防御
前端·网络安全·csrf
emma羊羊14 天前
【CSRF】跨站请求伪造
前端·网络安全·csrf
阿龟在奔跑1 个月前
Spring Security 传统 web 开发场景下开启 CSRF 防御原理与源码解析
java·spring·web安全·java-ee·csrf
xyphf_和派孔明2 个月前
关于Web前端安全防御CSRF攻防的几点考虑
前端·安全·csrf
桑晒.2 个月前
CSRF漏洞原理及利用
前端·web安全·网络安全·csrf
枷锁—sha3 个月前
【DVWA系列】——CSRF——Medium详细教程
android·服务器·前端·web安全·网络安全·csrf