web开发的安全及其防御 | 青训营笔记

75 阅读4分钟

这是我参与「第四届青训营 」笔记创作活动的第7天

web开发的安全及其防御

XSS攻击

定义:

攻击者通过插入恶意脚本,当用户访问页面时,这些恶意脚本会执行。导致用户的电脑被攻击

原因:

  • 盲目信任用户提交的内容
  • 直接把用户提交的字符串当成DOM元元素

特点:

  • 通常难以从UI上感知(暗地执行)
  • 窃取用户信息
  • 绘制UI,诱骗用户点击/填写表单

分类:

  • 存储型XSS攻击(Stored XSS):脚本会被存到数据库中,当用户访问页面时,回去服务端读取数据到浏览器,进而存储的脚本就会被执行。
  • 反射型XSS攻击(Reflected XSS):不涉及数据库,从攻击者将脚本代码插入到url中,当用户访问该页面时,就会被攻击。脚本在服务端被注入
  • 基于DOM的XSS攻击(DOM-based XSS):类似于反射型XSS攻击,不同的是诸如脚本的地方就是在浏览器页面,不涉及服务端。
  • 基于浏览器的XSS攻击(Mutation-based XSS):利用不同浏览器的渲染机制进行攻击。

防御措施:

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

同源策略:

  • 设置响应头部:
    • 服务器响应头部:
    Content-Security-Policy:script-sre 'self'
    Content-Security-Policy:script-sre 'self' https://domain.com
    
    • 浏览器响应头部:
    <meta http-equiv="Content-Security-Policy" content="script-sre 'self'">
    

跨站伪造请求(CSRF)

攻击者构造一个链接或者图片又或者表单,当点击链接或者图片加载以及变淡被提交就会触发跨站伪造请求。

特点:

  • 在用户不知情的前提下
  • 利用用户权限
  • 构造指定HTTP请求,窃取或修改用户敏感信息

防御措施:

  • 通过判断请求头部判断是否是跨站伪造请求
  • 通过token校验,token必须和具体用户绑定
  • 针对iframe攻击在服务器设置X-Frame-Options:DENY/SAMEORIGIN
  • 避免用户信息被携带

注入(Injection)

SQL Injection

攻击者恶意注入SQL参数,发送到服务端,服务端读取参数构造出一个SQL语句并执行。

防御措施:

  • 找到项目中查询SQL的地方,正确使用prepared statement
  • 针对其他注入攻击:
    • 避免使用sudo命令,
    • 建立白名单,拒绝高危操作
    • 对url类型参数进行协议、域名、ip等限制

服务拒绝(DoS)

攻击者通过某种方式,导致服务器资源被显著消耗,来不及响应更多的请求,导致请求挤压,进而无法响应更多的请求。

基于正则表达式的DoS

若服务端写了一个贪婪的正则表达式,攻击者传入一个容易发生回溯的字符串,导致服务器响应时间极大延长、吞吐量减少、响应用户的请求次数极大下降

DDos

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

防御措施:

  • 针对基于正则表达式的DoS:
    • 完善代码review工作,避免写出贪婪匹配的正则表达式
    • 使用代码扫描工具对代码进行规整
    • 拒绝用户使用正则
  • 针对DDoS
    • 流量治理,在负载均衡这一层,或API网关层进行流量识别,把会进行攻击进行过滤。
    • 快速扩容,以承载更多的流量
    • 降级非核心服务,腾出更多计算资源去应对集中的流量

中间人攻击

在浏览器与服务器之间插入一个主机,服务器与浏览器交互时,该主机能够获取并篡改双方发出来的数据。

发生原因:

  • 明文传输
  • 信息篡改不可知
  • 对方身份未验证

防御措施

  • 使用https,https的特征:
    • 可靠性:加密
    • 完整性:MAC验证
    • 不可抵赖性:数字签名 内容大致就是这些,如有错误望指正