避免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
相关推荐
小阿宁的猫猫3 天前
CSRF漏洞的原理、防御和比赛中的运用
安全·http·xss·csrf
Neolnfra7 天前
陇剑杯2021-wifi题目解析
网络·安全·web安全·网络安全·系统安全·密码学·csrf
Neolnfra7 天前
跨站请求伪造攻击(CSRF)解析
服务器·网络·系统安全·网络攻击模型·安全威胁分析·csrf·安全架构
petunsecn10 天前
CSRF防护模式选择指南:三种方案的对比与决策
csrf
-曾牛17 天前
CSRF跨站请求伪造:原理、利用与防御全解析
前端·网络·web安全·网络安全·渗透测试·csrf·原理解析
张3蜂18 天前
CSRF Token:网络应用安全的关键防线——深度解析与实战指南
前端·安全·csrf
张3蜂18 天前
跨站请求伪造(CSRF):原理、攻击与防御全解析
网络·安全·csrf
重生之我在番茄自学网安拯救世界19 天前
网络安全中级阶段学习笔记(五):CSRF跨站请求伪造学习笔记(超全总结)
笔记·学习·网络安全·csrf·跨站请求伪造
世界尽头与你23 天前
跨站请求伪造(CSRF)漏洞
web安全·网络安全·渗透测试·csrf
老马爱知1 个月前
第5篇 | Web应用的“外邪”:XSS、CSRF与SSRF漏洞详解
web安全·xss·csrf·零信任·ssrf·信任边界·攻防启示录