Web开发安全

Web开发安全

参加字节跳动的青训营时写的笔记。这部分是刘宇晨老师讲的课。

个人博客(欢迎光临)Web开发安全(赤蓝紫)

1. 攻击

1.1 跨站脚本攻击(XSS)

XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。

如填写表单信息时,如果盲目相信用户的提交内容,那么假如用户填写了类似<script>alert("注入恶意代码")</script>的信息,然后直接通过element.innerHTML把用户提交的代码存起来的话,那么工具者就可以实现攻击了。

比较巧妙的攻击方式:

image-20220127180108501

XSS特点

  • 通常难以从UI上发现,因为是在暗地里执行脚本
  • 可以窃取用户信息(cookie、token)
  • 还可以绘制UI(如弹窗),诱骗用户点击

demo:

image-20220127173357726

1.1.1 Stored XSS

把恶意脚本存储在被攻击网站的数据库中。当其他人访问页面时,回去读数据,然后就会执行到数据库中的恶意脚本,从而被攻击。危害最大,对全部用户可见

1.1.2 Reflected XSS
  • 不涉及数据库
  • 从URL上进行攻击

image-20220127174047613

1.1.3 DOM-based XSS
  • 不需要服务器的参与
  • 恶意攻击的发起、执行,都在浏览器完成

image-20220127174625118

和Reflected XSS很像,不过,Reflected XSS的恶意脚本是注入到服务器中,而DOM-based XSS的恶意脚本是注入到浏览器中,而且攻击不需要服务器的参与

1.1.4 Mutation-based XSS
  • 利用浏览器渲染DOM的特性(独特优化)
  • 按浏览器进行攻击

2. 跨站伪造请求CSRF

CSRF攻击:在用户不知情的前提下,利用用户权限(cookie),构造HTTP请求,窃取或修改用户敏感信息。

image-20220127180459599

经典例子:银行转账

首先,a为了转账给b10000元,于是a登录银行页面进行转账操作, 还没有推出登录,又收到中奖通知链接(假的或者是只有小额鱼饵),a点击链接,并点击领奖按钮。然后发现钱被转走了100000元了。

CSRF攻击原理:利用cookie的自动携带特性,在其他网站向你的网站发送请求时,如果网站中的用户没有退出登录,而发送的请求又是一些敏感的操作请求(如转账),则会给用户带来巨大的损失。

3. 注入攻击injection

3.1 SQL注入

image-20220127202310672

demo

image-20220127202606829

4. Dos

通过某种方式(构造特定请求),导致服务器资源被显著消耗,来不及响应更多请求,导致请求挤压,进而引起雪崩效应。

4.1 ReDoS

例子:上网找到了讲的非常好的文章

正则表达式所引发的DoS攻击(ReDoS)

4.2 Distributed DOS(DDoS)

短时间内,来自大量僵尸设备的请求,服务器不能及时响应全部请求,导致请求堆积,进而引发雪崩效应,无法响应新请求。

攻击特点:

  • 直接访问IP
  • 任意API
  • 消耗大量带宽(耗尽)

DDoS攻击 demo:SYN Flood

原理:TCP的三次握手

image-20220127205207771

如果客户端给服务器发送的ACK丢失的话,服务器不知道丢失,会等客户端的ACK,超时后重新发送SYN-ACK消息给客户端,直到重试超过一定次数才会放弃。

而SYN Flood就是通过发送大量的SYN,但是不给服务器发送ACK,从而耗尽服务器的资源。

image-20220127205705566

5. 中间人攻击

image-20220127205738271

2. 防御

2.1 XSS

方案:

  • 永远不信任用户的提交内容
  • 不把用户提交内容直接转换成DOM

现成工具:

  • 前端:
    • 主流框架默认防御XSS
    • google-closure-library
  • 服务端(Node):
    • DOMPurify

2.2 CSRF

2.2.1 同源政策

浏览器的同源政策:A网页设置的 Cookie,B网页不能打开,除非这两个网页"同源"。所谓"同源"指的是"三个相同"。(出自阮一峰的网络日志)

  • 协议相同
  • 域名相同
  • 端口相同

同源政策的目的,是为了保证用户信息的安全,防止恶意的网站窃取数据。

image-20220127230913468

2.2.2 CSP

CSP(Content Security Policy):内容安全策略

  • 决定好哪些源(域名)是安全的
  • 来自安全源的脚本可以执行,否则直接报错
  • 对于eval / inline script 直接禁止

两种形式:

  • 服务器的响应头部:

    image-20220127232201451

  • 浏览器meta

    image-20220127232216808

2.2.3 CSRF防御(token)

image-20220127232639659

2.2.4 SameSite Cookie

避免用户信息被携带

下面的部分参考自Cookie 的 SameSite 属性

Cookie的SameSite属性用来限制第三方Cookie,从而减少安全风险。

可以设置成三个值:

  • Strict:最严格。完全禁止第三方Cookie,跨站点时,任何情况都不会发送Cookie

    Set-Cookie: CookieName=CookieValue; SameSite=Strict;
    

    用户体验不会很好。比如访问别人的项目网站时,有个fork me链接到github,然后点击跳转不会带有github的token,所以跳转过后,都会是未登录状态

  • Lax:大多数情况不发送第三方Cookie,但是导航到目标地址的GET请求会发送。

    Set-Cookie: CookieName=CookieValue; SameSite=Lax;
    

    导航到目标地址的GET请求:链接、预加载、GET表单

    image-20220127234433512

    设置了Strict或Lax之后,基本杜绝了CSRF攻击。

  • None:显示关闭SameSite属性。前提是需要同时设置Secure属性(Cookie只能通过HTTPS协议发送),否则无效

    Set-Cookie: widget_session=abc123; SameSite=None; Secure	
    

    应用场景是依赖Cookie的第三方服务:如网站内嵌其他网站的播放器,开启SameSite属性后,就识别不了用户的登录态,也就发不了弹幕了

2.2.5 SameSite和CORS的区别

image-20220127235222723

2.3 Injection

image-20220127235528020

貌似是Java中的,我没用过,也不好说。不过查了下资料,prepareStatement对象防止sql注入的方式是把用户非法输入的单引号用\反斜杠做了转义,从而达到了防止sql注入的目的。

在SQL语句外做的防御

image-20220127235830052

2.4 Dos

2.4.1 ReDoS
  • Review代码
  • 代码扫描 + 正则性能测试
  • 拒绝使用用户提供的正则
2.4.2 DDoS

image-20220128000235944

2.5 防御中间人攻击

HTTPS防止中间人攻击

HTTPS 其实是SSL+HTTP的简称,当然现在SSL基本已经被TLS取代了

image-20220128000730701

HTTPS的一些特性

  • 可靠性:加密(非明文)
  • 完整性:MAC验证(防篡改),通过hash算法来实现,所以就算只有很小的改变,hash输出结果也会变化很大
  • 不可抵赖性:数字签名(确定身份)
1. 背景 4 2. 编码安全 4 2.1. 输入验证 4 2.1.1. 概述 5 2.1.2. 白名单 5 2.1.3. 黑名单 5 2.1.4. 规范化 5 2.1.5. 净化 5 2.1.6. 合法性校验 6 2.1.7. 防范SQL注入 6 2.1.8. 文件校验 6 2.1.9. 访问控制 6 2.2. 输出验证 6 2.2.1. 概述 6 2.2.2. 编码场景 6 2.2.3. 净化场景 7 2.3. SQL注入 7 2.3.1. 概述 7 2.3.2. 参数化处理 7 2.3.3. 最小化授权 7 2.3.4. 敏感数据加密 7 2.3.5. 禁止错误回显 8 2.4. XSS跨站 8 2.4.1. 输入校验 8 2.4.2. 输出编码 8 2.5. XML注入 8 2.5.1. 输入校验 8 2.5.2. 输出编码 8 2.6. CSRF跨站请求伪造 8 2.6.1. Token使用 9 2.6.2. 二次验证 9 2.6.3. Referer验证 9 3. 逻辑安全 9 3.1. 身份验证 9 3.1.1. 概述 9 3.1.2. 提交凭证 9 3.1.3. 错误提示 9 3.1.4. 异常处理 10 3.1.5. 二次验证 10 3.1.6. 多因子验证 10 3.2. 短信验证 10 3.2.1. 验证码生成 10 3.2.2. 验证码限制 10 3.2.3. 安全提示 11 3.2.4. 凭证校验 11 3.3. 图灵测试 11 3.3.1. 验证码生成 11 3.3.2. 验证码使用 11 3.3.3. 验证码校验 11 3.4. 密码管理 12 3.4.1. 密码设置 12 3.4.2. 密码存储 12 3.4.3. 密码修改 12 3.4.4. 密码找回 12 3.4.5. 密码使用 12 3.5. 会话安全 13 3.5.1. 防止会话劫持 13 3.5.2. 会话标识符安全 13 3.5.3. Cookie安全设置 13 3.5.4. 防止CSRF攻击 13 3.5.5. 会话有效期 14 3.5.6. 会话注销 14 3.6. 访问控制 14 3.6.1. 跨权访问 14 3.6.2. 控制方法 14 3.6.3. 控制管理 14 3.6.4. 接口管理 15 3.6.5. 权限变更 15 3.7. 文件上传安全 15 3.7.1. 身份校验 15 3.7.2. 合法性校验 15 3.7.3. 存储环境设置 15 3.7.4. 隐藏文件路径 16 3.7.5. 文件访问设置 16 3.8. 接口安全 16 3.8.1. 网络限制 16 3.8.2. 身份认证 16 3.8.3. 完整性校验 16 3.8.4. 合法性校验 16 3.8.5. 可用性要求 17 3.8.6. 异常处理 17 4. 数据安全 17 4.1. 敏感信息 17 4.1.1. 敏感信息传输 17 4.1.2. 客户端保存 17 4.1.3. 服务端保存 17 4.1.4. 敏感信息维护 18 4.1.5. 敏感信息展示 18 4.2. 日志规范 18 4.2.1. 记录原则 18 4.2.2. 事件类型 18 4.2.3. 事件要求 18 4.2.4. 日志保护 19 4.3. 异常处理 19 4.3.1. 容错机制 19 4.3.2. 自定义错误信息 19 4.3.3. 隐藏用户信息 19 4.3.4. 隐藏系统信息 19 4.3.5. 异常状态恢复 20 4.3.6. 通信安全 20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值