web安全 - CSRF

跨站请求伪造CSRF (Cross Site Request Forgery):是一种利用用户身份认证漏洞,骗取服务器信任,让受害者在不知情的情况下,执行攻击者指定的恶意请求。

攻击原理

  1. 用户登录A网站,浏览器保存了用于身份认证的Cookie
  2. 攻击者诱导用户访问B网站。
  3. B网站"静悄悄"地向A网站发送请求,浏览器自动携带用户的Cookie进行身份认证。
  4. 用户账号被攻击者"控制",例如转账、删除资源等。

示例

用户在 meow.com 登录账号(此时Cookie仍然有效)

攻击者在自己的钓鱼网站上嵌入了一张恶意图片:

html 复制代码
<img src="https://meow.com/transfer?to=attacker&amount=5000">

或构造一个form表单,然后利用Javascript自动提交

html 复制代码
<p>只是和你开个小玩笑👿,新年快乐🎉</p>

<form id="myForm" action="https://meow.com/transfer">
    <input type="hidden" name="to" value="attacker">
    <input type="hidden" name="amount" value="5000">
</form>

<script>
    document.getElementById('myForm').submit()
</script>

用户访问后链接后,浏览器会自动带上会话数据(Cookie),导致用户的账户向攻击者转账!

防御

  • 二次认证:在进行某些关键操作时(如转账、删除用户),要求用户进行二次登录或者输入验证。
  • 设置sameSite=Strict,限制Cookie只能在同源站点提交,防止跨站滥用。

Koa设置CookieSameSite属性:

javascript 复制代码
ctx.cookies.set('sessionId', sessionId, {
    path: '/',
    httpOnly: true,
    secure: false,
    sameSite: 'strict',
})
  • Token认证:服务器生成随机的Token,并在表单或请求中携带,服务器在收到请求时验证Token。

前端提交服务器返回的CSRF Token

html 复制代码
<form method="POST" action="https://meow.com/login">
  <input type="hidden" name="_csrf" value="token">
  <input type="submit" value="登录">
</form>
相关推荐
kidding7233 分钟前
gitee新的仓库,Vscode创建新的分支详细步骤
前端·gitee·在仓库创建新的分支
听风吹等浪起6 分钟前
基于html实现的课题随机点名
前端·html
leluckys12 分钟前
flutter 专题 六十三 Flutter入门与实战作者:xiangzhihong8Fluter 应用调试
前端·javascript·flutter
kidding72326 分钟前
微信小程序怎么分包步骤(包括怎么主包跳转到分包)
前端·微信小程序·前端开发·分包·wx.navigateto·subpackages
Huazie27 分钟前
在WSL2 Ubuntu中部署FastDFS服务的完整指南
服务器·后端·ubuntu
霖檬ing29 分钟前
Linux——系统安全及应用
安全·系统安全
微学AI40 分钟前
详细介绍:MCP(大模型上下文协议)的架构与组件,以及MCP的开发实践
前端·人工智能·深度学习·架构·llm·mcp
AORO_BEIDOU1 小时前
北斗短报文终端与5G融合:构建空天地海一体化通信新生态
科技·5g·安全·智能手机·信息与通信
半升酒1 小时前
Day-1 漏洞攻击实战
安全·网络安全
liangshanbo12151 小时前
CSS 包含块
前端·css