之前所提及XSS攻击最终都是将恶意脚本注入到页面中,进行后续操作。还有另一种类型,跨站请求伪造(CSRF)攻击。
CSRF攻击
- 在用户登录了A网站后,拥有了A网站的登录状态。
- 这时就可进行一些和当前账户相关的请求,伪造请求就可模拟真实用户进行操作。
- 伪造请求通常在被诱导打开的第三方网站进行。
伪造请求的形式
- 伪造请求在打开的第三方页面中进行,可能会隐藏在各种加载第三方资源的方式中。
- 比如img标签src属性、表单数据的提交、诱导性超链接等,get类型、post类型都可伪造。
防止CSRF攻击
依据上述CSRF特点:
- 基于用户登录状态。
- 在第三方页面伪造请求。
防范可有如下方面:
Cookie中SameSite字段
- 伪造的请求之所以可以利用用户登录状态,是因为发送请求时会携带Cookie信息,而Cookies中常常存有用户登录状态。
- 在Cookie字段中设置SameSite字段值,声明是发送请求时是否允许携带Cookie。
SameSite字段值
Strict
完全禁止第三方的Cookie发送。
Lax
额外允许第三方网站发起Get请求时发送Cookie,是当前的默认值。
None
不做任何限制,任意情况下都可发送Cookie,是以前的默认值。
验证请求的来源站点
- 如果伪造请求成功发送到了服务器端,服务器可检验请求的来源是否可靠,是否有伪造的可能性。
- 可通过报文的Origin字段和Referer字段获取到请求的来源。
- 其中,Origin字段不包含来源的路径信息,Referer包含完整的路径信息。
- 优先判断Origin更为合理。
CSRF Token
- 用户在请求页面时,服务端可生成Token(也就是一串字符),插入到返回的页面中。
- 在发送请求时,需携带页面中的Token。而第三方网站获取不到页面中的内容,获取不到Token。
- 服务端接收到请求时,验证Token,不正确时拒绝请求。