Java防止Xss注入json_前端进阶,你必须要了解的安全问题之XSS攻击

前端安全一直是一个老生常谈的话题,但是在实际的工作过程中,我发现大部分的前端同学对此了解不多,或者说知道一些但从没有在意识层面真正重视过。今天我们就来扒一扒前端到底有哪些安全问题,我们到底该以什么样的态度怎么去看待它。

在深入分析之前我们还是按照惯例先大概介绍下什么是XSS攻击。

XSS-跨站脚本攻击

跨站脚本(Cross-site scripting,通常简称为XSS)是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响。这类攻击通常包含了HTML以及用户端脚本语言。可通过页面执行脚本并请求外部服务器发生数据交互,从而达到攻击目的。

以上是我们从百度百科中摘取的一段对于XSS的描述,接下来我们通过一个实际的案例来具体说明下XSS到底是如何实现攻击的。

我们模拟一个表单提交和数据展示的逻辑。

前端代码:

Java防止Xss注入json_前端进阶,你必须要了解的安全问题之XSS攻击_第1张图片
Java防止Xss注入json_前端进阶,你必须要了解的安全问题之XSS攻击_第2张图片

从图中我们可以看到,我们在表单中输入了一串Javascript代码,接下来我们写一下相应的后台处理的逻辑。

Nodejs代码:

Java防止Xss注入json_前端进阶,你必须要了解的安全问题之XSS攻击_第3张图片

接下来我们看看提交数据后的表现:

Java防止Xss注入json_前端进阶,你必须要了解的安全问题之XSS攻击_第4张图片

浏览器窗口中弹出了一个窗口,里面显示1,这说明我们提交的代码在浏览器端执行了。在上述例子中我再服务端代码中省略了存储和查询的逻辑,这种攻击在XSS攻击中叫做存储型攻击,既然说到XSS的分类,我们就来总结一下XSS攻击都有哪些常见的类型。

  1. 存储型攻击:比如上述的例子,数据提交后被存储到了网站数据库,当这篇内容被任意用户访问的时候即会出发脚本执行,达到攻击的目的。比如用户发布一篇文章,文章中包含恶意代码,那其他用户在访问这篇文章时就会触发恶意代码执行。
  2. 反射型攻击:恶意代码并没有存储在服务端,一般通过诱导用户点击来达到攻击的目的。
  3. Dom-Based:有些客户端脚本可以对页面进行动态修改且不依赖服务端数据,而如果这部分数据包含恶意脚本且没有经过必要的过滤处理的话,就有可能遭受Dom-based的攻击。

XSS攻击的危害

在上述的例子中,我们的恶意代码只执行alert语句,对客户端应用本身来说并不会造成多大的危害。但是我们可以设想一下,假如一个用户登录了某网站,一般来说我们会使用cookie来记录客户端与服务端的会话ID从而在后续的请求中保持登录状态。如果这个会话ID被恶意的JS脚本窃取,那攻击者就可以通过这个会话ID伪装成合法用户进行信息窃取。更有甚者,如果窃取的是某个应用的后台管理账号,那对应的危害之大可想而知。

我们结合XSS攻击的原理来总结一下XSS攻击的可能危害性:

  • 会话劫持:窃取会话信息,伪造合法用户身份进行攻击(如修改用户密码,获取用户私密信息等);
  • 钓鱼:通过动态修改网页内容来欺骗用户;
  • 结合CSRF攻击:比如我们防御CSRF攻击用csrftoken,那如果这个token被窃取了呢?

如何防御

我们讲了这么XSS的原理和危害,那么我们在日常开发当中到底该如何预防呢?

1、安全意识

方法说得再说,不执行都是空话,所以解决安全问题的第一步是培养我们的安全意识:

  • 学会敬畏:敬畏每一行代码、敬畏生产环境、敬畏用户;
  • 不可信原则:要坚信任何输入都是不可信的,无论前端还是后端;
  • 安全检查:针对常见安全漏洞制定测试计划,确保每一次开发都是有安全保障的;

2、输入输出过滤(XSS Filter)

XSS攻击的主要原理是注入恶意的脚本,所以我们对任何输入和输出一定要坚持不可信原则,常用的过滤手段有:

  • HtmlEncode:转换后的文本将不会被浏览器当做html文档来解析执行,也就不会将script标签当做js语法来执行;
  • UrlEncode:对url中的参数进行编码,比如“
  • JavascriptEncode:常用的JavaScript编码函数为:escapeJavascript()。该函数的功能为:将 ‘ ” < > & # 这些个危险字符进行转义。

3、Cookie HttpOnly

如果攻击者是通过远程加载脚本来窃取cookie信息,那标记为HttpOnly的cookie可以通过浏览器的同源保护策略来阻止,因此通过劫持会话为目的的攻击手段也就失效了。

4、指定HTTP头中内容的类型(Content-Type)

在部分场景下,我们会通过异步请求的方式从服务端获取数据渲染到页面上,如果在开发过程中不够严谨,将请求的Response Header设置成了text/html,而返回的数据中恰好又包含恶意代码的话,那不好意思,你中招啦!针对这种情况,我们对数据返回的格式一定要明确并输出对应的数据类型来告诉浏览器用什么样的方式解析。比如json格式我们用application/json,纯文本类型用text/plain格式。

结语

好了,今天关于XSS的问题就讲到这了,你是否明白了呢?如果对安全这块还有疑问的话,欢迎关注私信我互相交流。后续针对其他安全问题都会在安全系列的文章中为大家一一讲解,希望能对大家的学习有所帮助!

你可能感兴趣的:(Java防止Xss注入json)