除了XSS攻击外,还有一种叫CSRF的攻击不容小视。
什么是CSRF攻击呢?
CSRF攻击又称跨站请求伪造,攻击者利用用户在网站的登录状态,并通过第三方站点实施攻击的一种手段。
与XSS攻击的不同之处在于,CSRF攻击不需要往用户的页面中注入恶意脚本。
常见的CSRF攻击有自动发起get请求
,自动发起post请求
,诱导用户点击链接
三种方式。
get类型的CSRF攻击
在一个img
标签里构建一个get
请求,当页面被加载时,浏览器便会自动发起一个get
请求。
<img src="http://xxx.org?value=100">
post类型的CSRF攻击
在页面中隐藏一个表单,当用户打开页面时,自动提交这个表单。
如:
<form id="hacker" action="http://xxx.com" method=POST>
<input type="hidden" name="user" value="100" >
</form>
<script>document.getElementById("hacker").submit()</script>
链接类型的CSRF攻击
在a
标签的href
属性里构建一个请求,然后诱导用户去点击。
<body>
<img src="xxx.jpg">
<a href="http://xxx.org?value=100"></a>
</body>
如何防止CSRF攻击呢?
发起CSRF攻击有两个条件,分别是用户登录了目标站点,且浏览器保留了用户的登录状态;用户打开了第三方站点。
- 使用
sameSite
属性
攻击者会利用登录状态来发起CSRF攻击,而Cookie
是保持登录状态的关键数据,所以,可以在Cookie
上想办法防止CSRF攻击。
在Cookie
中加入sameSite
属性,samesite有三种值。
- strict
第三方站点发起的请求都不会携带cookie`。 - lat
get请求会携带cookie,post请求不会。 - none
任何请求都会携带cookie
- 验证请求来源
服务端验证请求源,如果请求来自非指定源,则服务端不做响应。
- CSRF Token
浏览器向服务端发送请求时,服务端生成一个CSRF Token
,并将它植入到返回的页面中。当再次发起请求时,就需要携带这个CSRF Token
,如果没有这个token,则请求失败。