Web开发的安全之旅 | 青训营笔记

177 阅读3分钟

Web开发的安全之旅 | 青训营笔记

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

Web开发安全在前端开发是一个很重要的部分,让我们来学习了解一下吧

问题

关于Web安全问题很常见,那都会危害到什么?

  • 用户
  • 公司
  • 程序员

可以从哪两个角度看Web安全?

  • 假如你是一个hacker--攻击
  • 假如你是一个开发者--防御

攻击篇

Cross-Site Scritpting(XSS)

<script>alert("xss");</script>

XSS 主要利用了

盲目信任用户的提交内容

string->DOM -document.write -element.innerHTML = anyString; -SSR(user_data) //伪代码

XSS的一些特点

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

Stored XSS

Stored XSS

  • 恶意脚本被存在数据集中
  • 访问页面->读数据==被攻击
  • 危害最大,对全部用户可见

Reflected XSS

Reflected

  • 不涉及数据库
  • 从URL上攻击

DOM-based XSS

DOM-based XSS

  • 不需要服务器的参与
  • 恶意攻击的发起+执行,全在浏览器完成

Mutation-based XSS

Mutation-based XSS

  • 利用了浏览器渲染DOM的特性(独特优化)
  • 不同浏览器,会有区别 (按浏览器进行攻击)

Cross-site request forgery(CSRF)

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

CSRF demo

①用户没有访问银行页面

②银行页面中的特定接口被请求

③请求执行成功

SQL injection

请求 SQL参数(恶意注入)->Server 参数->SQL 运行SQL code ->获取其他信息、修改数据、删除数据

injection不至于SQL

  • CLI
  • OS command
  • Server-Side Requset Forgery(SSRF),服务端伪造请求
  • 严格而言,SSRF不是injection,但是原理类似

Denial of Service(DoS)

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

防御篇

XSS--现成工具

前端

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

CSRF的防御

if 伪造请求==异常来源 then限制请求来源->限制伪造请求

请求头部

  • Origin
  • 同源请求中,GET+HEAD不发送
  • Referer

Samesite VS CORS

Samesite

  • Cookie 发送
  • domain VS 页面域名
  • “我跟你说个事儿,出这屋我可就不认了”

CORS

  • 资源读写(HTTP请求)
  • 资源域名 VS 页面域名
  • 白名单

Injection

  • 找到项目中查询SQL的地方
  • 使用prepared statement

image (39).png

Injection beyond SQL

最小权限原则

  • sudo || root

建立允许名单 + 过滤

  • rm

对URL类型参数进行协议、域名、ip等限制

  • 访问内网

Regex Dos

  • code Review(X/(ab*)+/)
  • 代码扫描 + 正规性能测试
  • X用户提供的使用正则

Logical DoS

不是非黑即白

  • 有些case,只有在请求量达到一定之后,才会体现

分析代码中的性能瓶颈

  • 同步调用
  • 串行逻辑
  • CPU密集型操作

限流

DDoS

流量治理

  • 负载均衡
  • API网关
  • CDN

快速自动扩容

非核心服务降级

SRI--demo

标签hash(原始内容hash) vs 实际内容hash

<script src="http://example/app.js"
           integrity="sha384-{some-hash-value}"
           crossorigin="anonymous"></script>
//伪代码
const remoteHash = hash(content);
if(tagHash !== remoteHash){
    throw new Error("wrong hash");
}

总结

有了今天的学习,对于Web开发安全有了更多的认识,也了解了安全的重要性

还有就是安全无小事,我们要学好Web有关的安全知识,还有就是保持良好的学习心态,一步一步走下去。

如果你有任何建议都可以在评论区留言,或发电子邮箱,欢迎大家评论留言(ˆ⌣ˆ)

作者:Yifan

日期:2022年7月24日

电子邮箱:1279640748@qq.com