转---如何让前端更安全?——XSS攻击和防御详解

前言

平时很少关注安全这块的技术,曾经也买过一本《Web前端黑客技术揭秘》但至今还没翻过,尴尬。今天的早读文章由腾讯优测@小吉带来的分享。

正文从这开始~

最近深入了解了一下XSS攻击。以前总浮浅的认为XSS防御仅仅只是输入过滤可能造成的XSS而已。然而这池子水深的很呐。

XSS的类型

总体来说,XSS分三类,存储型XSS、反射型XSS、DOM-XSS。

存储型XSS

数据库中存有的存在XSS攻击的数据,返回给客户端。若数据未经过任何转义。被浏览器渲染。就可能导致XSS攻击;

反射型XSS

将用户输入的存在XSS攻击的数据,发送给后台,后台并未对数据进行存储,也未经过任何过滤,直接返回给客户端。被浏览器渲染。就可能导致XSS攻击;

DOM-XSS

纯粹发生在客户端的XSS攻击,比如:http://www.some.site/page.html?default=French

页面代码:

该XSS攻击实现条件:

  • 用户点击了如下连接:

http://www.some.site/page.html?default=<script>alert(document.cookie)</script>

  • 后台对URL参数未做任何过滤处理,返回给客户端,前端直接从url上获取参数。
  • 打开网址的浏览器是低版本浏览器,常见ie8以下

满足以上三者,就会导致URL上的js代码执行:alert(document.cookie),但是攻击者可以利用这个,做你无法想象的事情。在现代浏览器中,已经做了xss过滤,一旦检测到xss,会提示报错如下:

以上便是学术上的划分的XSS攻击类型,2、3类型其实都是反射型的攻击。了解了这些,意识到XSS攻击无处不在啊。那么如何对XSS进行防御?从输入到输出都需要过滤、转义。

XSS防御—输入输出的过滤和数据转义

 

输入

客户端求情参数:包括用户输入,url参数、post参数。

  • 在产品形态上,针对不同输入类型,对输入做变量类型限制。

如,http://xss.qq.com?default=12,Default值强制限制为整形。

我们的后台是node,使用joi对于输入做类型限制:

  • 字符串类型的数据,需要针对<、>、/、’、”、&五个字符进行实体化转义。

输出

即使在客户端对用户的输入做了过滤、转义,攻击者一样可能,通过截包,转发等手段,修改你的请求包体。最终还是要在数据输出的时候做数据转义。

好啦,到数据转义啦,不就是对<>,‘&"这些字符做实体化转义吗?如果你认为这么简单,NO NO NO…因为浏览器解析中html和js编码不一样,以及上下文场景多样,所以对于后台输出的变量,不同的上下文中渲染后端变量,转码不一样。

下面的HTML片段显示了如何安全地在多种不同的上下文中渲染不可信数据。

情况一

数据类型:String

上下文:HTML Body

示例代码:<span>UNTRUSTED DATA</span>

防御措施:HTML Entity编码

情况二

数据类型:String

上下文:安全HTML变量

示例代码:<input type="text" name="fname" value="UNTRUSTED DATA">

防御措施

1. HTML Attribute编码

2. 只把不可信数据放在安全白名单内的变量上(白名单在下文列出)

3. 严格地校验不安全变量,如background、id和name

情况三

数据类型:String

上下文:GET参数

示例代码:<a href="/site/search?value=UNTRUSTED DATA">clickme</a>

防御措施:URL编码

情况四

数据类型:String

上下文:使用在src或href变量上的不可信URLs

示例代码:

  • <a href="UNTRUSTED URL">clickme</a>
  • <iframe src="UNTRUSTED URL" />

防御措施:

1. 对输入进行规范化

2. URL校验

3. URL安全性认证

4. 只允许使用http和https协议(避免使用JavaScript协议去打开一个新窗口)

5. HTML Attribute编码

情况五

数据类型:String

上下文:CSS值

示例代码:<div style="width: UNTRUSTED DATA;">Selection</div>

防御措施:

1. 使用CSS编码

2. 使用CSS Hex编码

3. 良好的CSS设计

情况六

数据类型:String

上下文:JavaScript变量

示例代码:

  • <script>var currentValue=‘UNTRUSTED DATA‘;</script>
  • <script>someFunction(‘UNTRUSTED DATA‘);</script>

防御措施:

1. 确保所有变量值都被引号括起来

2. 使用JavaScript Hex编码

3. 使用JavaScript Unicode编码

4. 避免使用“反斜杠转译”(\"、\‘或者\)

情况七

数据类型:HTML

上下文:HTML Body

示例代码:<div>UNTRUSTED HTML</div>

防御措施:

[HTML校验 (JSoup, AntiSamy, HTML Sanitizer)]

(https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet#RULE_.236_-_Use_an_HTML_Policy_engine_to_validate_or_clean_user-driven_HTML_in_an_outbound_way)

情况八

数据类型:String

上下文:DOM XSS

示例代码:<script>document.write("UNTRUSTED INPUT: " + document.location.hash);<script/>

防御措施:

基于DOM操作的XSS漏洞防御措施

所有输出的数据转义都应该遵守上表的规则,而针对同步数据和异步数据,有较大的使用区别做了区分:

同步数据

  • React页面主动屏蔽掉XSS,非react则需要对不可信任数据,要进行输出转义。
  • 对于html白名单需求,可以使用SanitizeHelper模块提供了一个方法集合来处理非预期的HTML元素。
  • 不同的使用方式,编码方式不同,java现成的工具可以用——ESAPI,不同位置如何转义可参照ESAPI文档,比如属性值转义:

String safe = ESAPI.encoder().encodeForHTMLAttribute(

request.getParameter( "input" ) );

异步、后台直出给js使用的json数据

对于不可信任的json数据。因为json数据可能用到不同的地方,所以转义可以放在前端js去转义。

  • 参与运算的动态变量,最好转化为对应类型后再运算。如number型.
  • 如果是字符串操作,保证字符串被引号包裹。
  • 不能使用eval ,new fuction,settimeout执行动态字符串,因为这个字符串很可能就是一个xss代码,如果无法避免,那么也要转义之后再参与运算。
  • 输出到页面上的数据必须使用相应方法转义,前端可以考虑寻找js插件处理。目前jquery-encoder,可用于前端json转义。使用方式与ESAPI类似,在需要渲染的时候进行转义。

前端XSS防御方案大致如上,整理了这么多干货内容,作为小前端的我,表示要吸收好几天。

最后,再跟大家分享个实际工作中的案例吧

除了上面的XSS攻击,分享一个让你意想不到的安全漏洞。

在优测项目,早期研发环境中,我们的测试人员提出了如下的安全漏洞:

如下登录页面我们为了用户能在登录之后访问到之前浏览的页面,所以在url加入了一个service参数,但是未对它做任何校验,可能会被钓鱼网站利用。

该攻击实现条件:

  • 用户点击了如下连接:

https://cas.utest.qq.com/qqlogin?service=http%3A%2F%2Fpianzi.com;

  • 后端未对service参数做校验,这个连接可以正常跳转到上图的页面;
  • 用户输入帐号登录后,跳转到http://pianzi.com;
  • 这是个钓鱼网站,通过网站风格欺骗,对用户进行引导性操作;
  • 用户输入一些有用的信息;
  • 在不知不觉之间,用户泄漏了自己的信息。

好深的套路啊~~研发哥哥赶紧寻找解决办法,最终确认方案为:对登录后跳转地址采用白名单机制。

对于这个老生长谈的XSS攻击,WEB开发者,只是了解其一,前端出身的孩子,对这方面了解甚少,跟我一样几乎没这方面意识的同学怕是也有不少。

作为懒人一枚,做什么都想找一个一劳永逸的办法,但是对于XSS攻击,无处不在,没有一个很好的全局处理方案。前端小朋友多了解了解常规的XSS攻击,在码代码的时候有这个防攻击意识,也是极好的。

前端安全还有许多了解的方面,如何预防csrf攻击,启用现代浏览器安全防御等等,都需要去了解。

最后,如果你是前端开发,腾讯优测H5测试绝对是你的开发好助手,提升开发效率那是杠杠滴!有机会大家可以玩玩。

时间: 2024-10-18 14:06:28

转---如何让前端更安全?——XSS攻击和防御详解的相关文章

前端安全(XSS、CSRF防御)

一.网络安全 OWASP:开放式Web应用程序安全项目(OWASP,Open Web Application Security Project) OWASP是一个开源的.非盈利的全球性安全组织,致力于应用软件的安全研究.http://www.owasp.org.cn/ 二.XSS攻击 1.总述 2.XSS攻击原理 XSS攻击(Cross-Site Scripting)跨站脚本攻击. 被OWASP评为十大安全漏洞中的第二威胁漏洞. 特点:能注入恶意的HTML/JavaScript代码到用户浏览的网

WEB安全实战(三)XSS 攻击的防御

前言 上篇文章中提到了 XSS 攻击,而且,也从几个方面介绍了 XSS 攻击带来的严重影响.那么,这篇文章中,主要是针对 XSS 攻击做一个基本的防御,看看可以通过几种方式来修复这个特别常见的安全漏洞. 由于公司用的是 SpringMVC,因此,这次就主要基于 SpringMVC 来解决这些漏洞.当然,其实这些解决方案都是大同小异,对于什么环境来说根本无所谓.了解了原理,什么环境.什么语言都可以运用自如了.废话就不多说了,直接上解决方案. 解决方案 方案一 方案一主要是利用了 SpringMVC

XSS攻击及防御链接整理

XSS攻击及防御:http://blog.csdn.net/ghsau/article/details/17027893 Web攻防系列教程之跨站脚本攻击和防范技巧详解:http://www.rising.com.cn/newsletter/news/2012-04-25/11387.html Web安全测试之XSS:http://www.cnblogs.com/TankXiao/archive/2012/03/21/2337194.html xss攻击入门:http://www.cnblogs

前端安全之XSS攻击

转自:http://www.cnblogs.com/lovesong/p/5199623.html XSS(cross-site scripting跨域脚本攻击)攻击是最常见的Web攻击,其重点是"跨域"和"客户端执行".有人将XSS攻击分为三种,分别是: 1. Reflected XSS(基于反射的XSS攻击) 2. Stored XSS(基于存储的XSS攻击) 3. DOM-based or local XSS(基于DOM或本地的XSS攻击) Reflected

XSS攻击及防御

本文来自:高爽|Coder,原文地址:http://blog.csdn.net/ghsau/article/details/17027893,转载请注明.       XSS又称CSS,全称Cross SiteScript,跨站脚本攻击,是Web程序中常见的漏洞,XSS属于被动式且用于客户端的攻击方式,所以容易被忽略其危害性.其原理是攻击者向有XSS漏洞的网站中输入(传入)恶意的HTML代码,当其它用户浏览该网站时,这段HTML代码会自动执行,从而达到攻击的目的.如,盗取用户Cookie.破坏页

XSS 攻击实验 &amp; 防御方案

XSS 攻击&防御实验 不要觉得你的网站很安全,实际上每个网站或多或少都存在漏洞,其中xss/csrf是最常见的漏洞,也是最容易被开发者忽略的漏洞,一不小心就要被黑 下面以一个用户列表页面来演示xss攻击的实验 假设某个恶意用户在注册时输入的用户名中包含攻击代码 首先准备一个jsp页面来显示用户列表 <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ t

XSS 攻击的防御

xss攻击预防,网上有很多介绍,发现很多都是只能预防GET方式请求的xss攻击,并不能预防POST方式的xss攻击.主要是由于POST方式的参数只能用流的方式读取,且只能读取一次,经过多次尝试,也只做到了能够接受GET.POST方式的参数并进行相关转义,但是最终通过方法获取的参数仍是未转义的参数.很是遗憾.目前先把综合了网上介绍的方法的相关代码在这里整理一下,有了新的突破再来更新. 参考主要网址: http://blog.csdn.net/Lan_Xuan/article/details/738

学习前端前必知的——HTTP协议详解

前端人士必备的知识点,无论你是否有经验,看了此文绝对有收获 此文针对前端爱好者,前端求职者(话说面试时很容易考到哦) 原文参考博客园http://kb.cnblogs.com/page/130970/#statecode 什么是HTTP协议 协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器 目前我们使用的是HTTP/1.1 版本 Web服务器,浏览器,代理服

经典面试题:xss攻击和防御

XSS 分为三种:反射型,存储型和 DOM-based 如何攻击 XSS 通过修改 HTML 节点或者执行 JS 代码来攻击网站. 例如通过 URL 获取某些参数 <!-- http://www.domain.com?name=<script>alert(1)</script> --> <div>{{name}}</div> 上述 URL 输入可能会将 HTML 改为 <div><script>alert(1)</s