CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种常见的网络安全攻击方式。它利用了受害者浏览器的认证信息(如登录状态)向受信任的网站发起恶意请求,导致用户在不知情的情况下执行不希望的操作。
工作原理:
-
攻击者:首先,攻击者诱使用户访问恶意网站,通常通过点击链接、嵌入图片或通过脚本发起请求。
-
受害者:受害者已经在另一个网站(例如网上银行、社交平台等)登录。
-
恶意请求:攻击者在其恶意网站上构造一个伪造的请求,利用受害者的登录状态,向目标网站(如银行网站)发送请求。由于浏览器会自动附带之前的认证信息(如 cookies),所以目标网站认为这是合法的用户请求,并执行相应的操作(如转账、修改个人信息等)
举个例子:
假设你已经登录了你的银行账户,并且银行网站没有启用 CSRF 防护。
-
攻击者网站:攻击者创建了一个带有恶意脚本的页面,诱使你点击链接。
-
伪造请求:当你点击链接时,恶意网站向银行网站发送了一条请求,命令银行转账资金给攻击者的账户。由于你已经登录了银行账户,浏览器会自动附带银行网站的 cookie,银行服务器认为这是真正的用户操作,从而执行了转账操作。
如何防范 CSRF 攻击:
-
CSRF Token:最常见的防护方式是使用 CSRF Token(跨站请求伪造令牌)。在提交表单或发送请求时,服务器生成一个唯一的 token,嵌入到页面中。每次请求时,客户端必须附带这个 token。服务器会验证这个 token 是否匹配,从而确保请求是合法的。
-
在 Django、Flask 等框架中,框架会自动生成并验证 CSRF Token。
-
如果请求中的 CSRF Token 与服务器生成的不匹配,则该请求被视为恶意请求并拒绝。
-
-
SameSite Cookies:浏览器通过设置
SameSite
属性来防止浏览器自动将 cookies 发送到第三方网站,进一步减少 CSRF 攻击的风险。通过将 cookies 设置为SameSite
,可以限制它们仅在相同网站的请求中被发送。 -
Referer 检查:一些系统会检查 HTTP 请求的
Referer
头部,确保请求是从信任的源发出的。但这种方式不如 CSRF Token 可靠,因为Referer
可以被伪造或隐藏。 -
使用 HTTPS:HTTPS 确保数据在传输过程中是加密的,降低了通过中间人攻击(MITM)伪造请求的风险。