避免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
相关推荐
世界尽头与你4 天前
跨站请求伪造(CSRF)漏洞
web安全·网络安全·渗透测试·csrf
老马爱知9 天前
第5篇 | Web应用的“外邪”:XSS、CSRF与SSRF漏洞详解
web安全·xss·csrf·零信任·ssrf·信任边界·攻防启示录
牢七1 个月前
Ics-05
csrf
无盐海1 个月前
CSRF漏洞攻击(跨站请求伪造攻击)
前端·csrf
网络安全-海哥1 个月前
Web安全深度实战:从漏洞原理到防护方案
sql·web安全·网络安全·xss·csrf·漏洞挖掘·安全防护
牢七1 个月前
Csrf4
csrf
white-persist2 个月前
CSRF 漏洞全解析:从原理到实战
网络·python·安全·web安全·网络安全·系统安全·csrf
携欢2 个月前
PortSwigger靶场之 CSRF where token is not tied to user session通关秘籍
前端·csrf
携欢2 个月前
PortSwigger靶场之CSRF where token validation depends on request method通关秘籍
安全·web安全·csrf
携欢2 个月前
POrtSwigger靶场之CSRF where token validation depends on token being present通关秘籍
前端·csrf