常见Web安全问题记录与总结

XSS

  XSS (Cross Site Script),跨站脚本攻击。

  XSS 的原理是恶意攻击者往 Web 页面里插入恶意可执行网页脚本代码,当用户浏览该页之时,嵌入其中 Web 里面的脚本代码会被执行,从而可以达到攻击者盗取用户信息或其他侵犯用户安全隐私的目的。XSS 的攻击方式千变万化,但还是可以大致细分为几种类型。

  • DOM xss :
    不需要服务器解析响应的直接参与,触发XSS靠的是浏览器端的DOM解析,可以认为完全是客户端的事情。
    具体的危害和防御方法请看这篇腾讯安全应急响应中心的博文《驱散前端安全梦魇——DOMXSS典型场景分析与修复指南》,讲得非常详细,值得仔细阅读。

  • 反射型 xss:
    反射型XSS也被称为非持久性XSS,是现在最容易出现的一种XSS漏洞。一般是通过给别人发送带有恶意脚本代码参数的 URL,当 URL 地址被打开时,特有的恶意代码参数被 HTML 解析、执行。
    例如:攻击者给用户发送一个url:https://www.google.com?abc=<script>alert(document.cookie)</script>;(Markdown编辑器也进行了xss防御,导致我这里无法输入script标签)

为了防止出现非持久型 XSS 漏洞,需要确保这么几件事情:

  1. Web 页面渲染的所有内容或者渲染的数据都必须来自于服务端。
  2. 尽量不要从 URL,document.referrer,document.forms 等这种 DOM API 中获取数据直接渲染。
  3. 尽量不要使用 eval, new Function(),document.write(),document.writeln(),window.setInterval(),window.setTimeout(),innerHTML,document.creteElement() 等可执行字符串的方法。
  4. 如果做不到以上几点,也必须对涉及 DOM 渲染的方法传入的字符串参数做 escape 转义。
  5. 前端渲染的时候对任何的字段都需要做 escape 转义编码。

这是几点防御建议。

  • 存储型 xss:
    存储型XSS又被称为持久性XSS,它是最危险的一种跨站脚本,相比反射型XSS和DOM型XSS具有更高的隐蔽性,所以危害更大,因为它不需要用户手动触发。 允许用户存储数据的web程序都可能存在存储型XSS漏洞,当攻击者提交一段XSS代码后,被服务器端接收并存储,当所有浏览者访问某个页面时都会被XSS,其中最典型的例子就是留言板。

持久型 XSS 有以下几个特点:

  1. 持久性,植入在数据库中
  2. 危害面广,甚至可以让用户机器变成 DDoS 攻击的肉鸡。
  3. 盗取用户敏感私密信息

    防御

    防御方法总得来说就是——输入过滤,输出转码,有cookie的http-only请看这篇博文《解析检查 —— 存储型XSS漏洞解决方案》

CSRF

  跨站点请求伪造(Cross-Site Request Forgeries),也被称为 one-click attack 或者 session riding。冒充用户发起请求(在用户不知情的情况下), 完成一些违背用户意愿的事情(如修改用户信息,删初评论等)。

原理
常见Web安全问题记录与总结_第1张图片

完成 CSRF 攻击必须要有三个条件:

  1. 用户已经登录了站点 A,并在本地记录了 cookie
  2. 在用户没有登出站点 A 的情况下(也就是 cookie 生效的情况下),访问了恶意攻击者提供的引诱危险站点 B (B 站点要求访问站点A)。
  3. 站点 A 没有做任何 CSRF 防御

防御

  1. 验证码;强制用户必须与应用进行交互,才能完成最终请求。此种方式能很好的遏制 csrf,但是用户体验比较差。
  2. 尽量使用 post ,限制 get 使用;上一个例子可见,get 太容易被拿来做 csrf 攻击,但是 post 也并不是万无一失,攻击者只需要构造一个form就可以。
  3. Referer check;请求来源限制,此种方法成本最低,但是并不能保证 100% 有效,因为服务器并不是什么时候都能取到 Referer,而且低版本的浏览器存在伪造 Referer 的风险。(关于Referer的概念和用法可参考这篇文章HTTP_REFERER的用法及伪造)
  4. token;token 验证的 CSRF 防御机制是公认最合适的方案。

    整体思路如下:

第一步:后端随机产生一个 token,把这个token 保存到 session 状态中;同时后端把这个token 交给前端页面;

第二步:前端页面提交请求时,把 token 加入到请求数据或者头信息中,一起传给后端;

后端验证前端传来的 token 与 session 是否一致,一致则合法,否则是非法请求。
若网站同时存在 XSS 漏洞的时候,这个方法也是空谈。

小结

  除了XSS和CSRF,还有DDOS、SQL注入等常见漏洞,我这篇短文就不介绍了,请移步大神的博客。

你可能感兴趣的:(Web安全)