CSRF面试题

什么是CSRF攻击,如何避免

CSRF,跨站请求伪造,是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。

  • Tom 登陆银行,没有退出,浏览器包含了Tom在银行的身份认证信息。
  • 黑客Jerry将伪造的转账请求,包含在在帖子
  • Tom在银行网站保持登陆的情况下,浏览帖子
  • 将伪造的转账请求连同身份认证信息,发送到银行网站
  • 银行网站看到身份认证信息,以为就是Tom的合法操作,最后造成Tom资金损失。
  • 怎么解决CSRF攻击呢?
    同源检测Samesite Cookie
    检查Referer字段。添加校验token。
    需要输入验证码

samesite防御CSRF的原理

SameSite有三个属性Lax, Strict, None

  1. Lax:b站上通过超链接访问a站,会携带a站cookie。b站通过img标签等跨越请求a站时,不会携带cookie,设置的cookie也不会起作用
  2. Strict:b站上通过超链接访问a站,不会携带a站cookie。b站通过img标签等跨域请求a站时,不会携带cookie,设置的cookie也不会起作用
  3. None:b站上通过超链接访问a站,会携带a站cookie。b站通过img标签等跨域请求a站时,会携带cookie,设置的cookie起作用

CSRF分类与防护

1. GET类型的CSRF

在受害者访问含有恶意链接的img等相关恶意链接时,浏览器自动跳转发出http请求。

2. POST类型的CSRF

使用一个自动提交的表单
访问恶意网站时,表单会自动提交相当于模拟用户完成了一次POST操作。

防御手段

  • 将Cookie设置为HttpOnly
  • 使用JWT token进行会话
  • 通过Refer识别,判断是否是本网站域名。
  • 二次验证,验证码或输入密码
### 前端 XSS 防御方法及 CSRF 预防策略面试题整理 #### XSS 防御方法 XSS(跨站脚本攻击)是一种常见的安全漏洞,攻击者可以通过注入恶意脚本窃取用户信息或操控用户行为。以下是防御 XSS 的常见方法: 1. **避免拼接 HTML** 在前端开发中,应尽量避免动态拼接 HTML 内容,改用框架提供的安全绑定机制。例如,在 Vue.js 中不要使用 `v-html`,在 React 中不要使用 `dangerouslySetInnerHTML`[^2]。 2. **转义输出内容** 对所有用户输入的内容进行严格的转义处理,确保特殊字符(如 `<`, `>`, `&` 等)被正确编码为 HTML 实体。可以使用成熟的库(如 `DOMPurify` 或 `he`)来实现这一功能。 3. **使用 Content-Security-Policy (CSP)** 通过设置 HTTP 响应头中的 `Content-Security-Policy`,限制页面可以加载的资源来源,从而防止恶意脚本执行。对于不支持 CSP 的旧版浏览器,可以考虑设置 `X-XSS-Protection` 头。 4. **过滤用户输入** 在后端对用户提交的数据进行严格校验和过滤,确保只接收合法的输入格式。例如,可以使用正则表达式验证邮箱、手机号等字段[^1]。 5. **使用现代框架的安全特性** 现代前端框架(如 Vue.js 和 React)默认会对模板中的数据进行自动转义,减少 XSS 攻击的风险。开发者只需遵循框架的最佳实践即可。 --- #### CSRF 预防策略 CSRF(跨站请求伪造)是一种利用用户身份认证状态发起恶意请求的攻击方式。以下是预防 CSRF 的常见方法: 1. **引入 CSRF Token** 在每个需要保护的表单或 API 请求中加入一个随机生成的 CSRF Token,并将其存储在用户的会话中。服务器在处理请求时验证该 Token 是否匹配。 2. **SameSite Cookie 属性** 设置 Cookie 的 `SameSite` 属性为 `Strict` 或 `Lax`,限制 Cookie 在跨站请求中的发送行为。这可以有效防止大多数 CSRF 攻击[^3]。 3. **验证 Referer 和 Origin** 检查请求的 `Referer` 或 `Origin` 头是否来自可信域名。如果来源不可信,则拒绝处理该请求[^1]。 4. **双重提交 Cookie** 在请求中包含一个与 Cookie 值一致的参数,服务器验证二者是否匹配。这种方法简单易实现,但需注意安全性。 5. **限制 HTTP 方法** 对于敏感操作(如删除账户、修改密码),仅允许使用 `POST` 或其他非幂等性方法,避免通过 `GET` 请求直接触发操作。 --- #### 示例代码 以下是一个简单的 CSRF Token 实现示例: ```javascript // 前端:将 CSRF Token 添加到请求头中 function addCsrfTokenToHeaders() { const csrfToken = document.querySelector('meta[name="csrf-token"]').getAttribute('content'); if (csrfToken) { fetch('/api/protected-endpoint', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-Token': csrfToken }, body: JSON.stringify({ key: 'value' }) }); } } ``` 以下是一个使用 CSP 的 HTTP 响应头配置示例: ```http Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted-cdn.com; style-src 'self' 'unsafe-inline' ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值