最近在做项目中的漏洞修复工作,在短时间内接触到很多关于web开发需要防范的漏洞,例如SQL injection , XSS, CSRF等等,这些漏洞对web开发的项目来说的破坏还是比较大的,其实在网上有很多这些漏洞的介绍和防范,像SQL injection这些漏洞的注入已经很少见了。作为一个初学者我认为还是要能够弄清楚为什么会产生这个漏洞,这样才能从原理上理解漏洞的发生,才能更好的去修复它,本文就对XSS漏洞做一个简单的笔记,仅供大家相互交流不断的提升web开发的安全性。

    XSS的全称Cross-site Scripting,夸脚本攻击,其实它的缩写应该是CSS,但是和web开发使用的css重名了,所以就简称为XSS了,该漏洞在web开发中比较常见,下面演示一个XSS漏洞的过程,我自己写了一个很简单的web页面(大家不要拍砖),两个输入框,姓名和个人介绍。

                     

    web开发中的常见漏洞,一般都发生在这些输入框中,一般情况我们会对这些输入域进行客户端的校验和服务器端的校验,但是在客户端的校验基本上起不来什么作用,因为客户端的所有代码我们都可以进行更改,防止漏洞的发生还是需要服务器端的校验,但是一般服务器端的校验都是校验你输入的字符或者是数字的长度等等。下面就演示一个XSS的漏洞注入,当我们写入姓名和个人介绍之后,后台代码的处理就是进行一个简单的转发,然后把我们刚才的信息转发到一个info.jsp页面进行显示,代码如下(不要拍砖):

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException { String username = req.getParameter("username");
String describe = req.getParameter("describe"); req.setAttribute("username", username);
req.setAttribute("describe", describe); req.getRequestDispatcher("/info.jsp").forward(req, resp);
}

  我们在输入框中这样输入:

                        

    大家看一下个人介绍里边写的是一段javascript代码,目前我们后台没有对javascript代码做任何的处理,直接把输入的信息输出到info.jsp页面,这个时候我们点击提交按钮,页面跳转到info.jsp页面之后,就坏事了,直接把我们写的javascript代码运行了,直接弹出 hello world 提示框了。如果我们在个人介绍写上<script>document.location.href='http://www.baidu.com'</script>,那么提交之就跳转到百度了,如果跳转到xxoo网站呢,这不就坏事了嘛。

    如果你使用的是chrome 和 firefox浏览器演示例子,会发现不会出现上边的情况,主要原因是chrome和firefox浏览器进行了拦截,看一下chrome浏览器console中的错误提示:

The XSS Auditor refused to execute a script in 'http://127.0.0.1:8080/javaweb/helloworld' because its source code was found within the request. The auditor was enabled as the server sent neither an 'X-XSS-Protection' nor 'Content-Security-Policy' header. helloworld:24

    如果在request的请求和response响应中包含相同的script可执行的脚本,chrome会进行拦截,难道我们使用chrome浏览器就可以防止XSS的出现吗?答案肯定不是这样的,一般情况下我们会把用户输入的表单内容存到数据库中,然后再查询的时候进行显示,现在让我们模拟一下查询数据库,显示用户的输入,看看chrome会进行拦截吗?

后台的代码改一下,模拟查询数据库,是模拟:

protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException { String username = req.getParameter("username");
String describe = req.getParameter("describe");
if(username == null || describe == null){
username ="aaaa";
describe="helloworld<script>alert('hello world');</script>";
}
System.out.println(username +" : "+ describe); req.setAttribute("username", username);
req.setAttribute("describe", describe);
req.getRequestDispatcher("/info.jsp").forward(req, resp);
}

    在这里我们直接请求这个servlet然后再info.jsp页面显示信息,这个时候你会发现,我们  describe="helloworld<script>alert('hello world');</script>";这里的javascript脚本执行了,弹出的hello world 窗口。所以仅仅依靠浏览器防止XSS是不行的。我们需要自己在后台对这些特殊的字符进行转码,当这些字符再次显示到页面的时候不执行脚本。

    使用什么样的方法才能阻止这种情况的发生,就是对HTML 中的预留字符替换为字符实体,例如:对< 进行替换成 &lt,对>替换成&gt  等等。在这里把我们的代码进行一下完善防止XSS的出现:

protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException { String username = req.getParameter("username");
String describe = req.getParameter("describe");
if(username == null || describe == null){
username ="aaaa";
describe="helloworld<script>alert('hello world');</script>";
}
//HTML 中的预留字符必须被替换为字符实体
username = StringEscapeUtils.escapeHtml4(username);
describe = StringEscapeUtils.escapeHtml4(describe); System.out.println(username +" : "+ describe); req.setAttribute("username", username);
req.setAttribute("describe", describe); req.getRequestDispatcher("/info.jsp").forward(req, resp);
}

    这个时候我们再次使用chrome浏览器直接访问请求的servlet在info.jsp中显示的结果为:

                  

    这样我们就可以简单的防止XSS夸脚本攻击,代码中的 StringEscapeUtils是apache common-lang 包下的一个工具类,这个工具类也可以对sql中的保留字符进行转换,同时我们自己也可以自己实现一个对html中的预留字进行替换的程序。在后台打印的describe的字符已经被替换为:

    helloworld&lt;script&gt;alert('hello world');&lt;/script&gt;  把这些内容显示在html中是不会执行javascript脚本的。

    本人也是刚刚接触XSS漏洞的原理,上边举得例子是目前最简单的例子,一些很深入的XSS漏洞的方法还需要不断的学习和研究,希望大家有这方面的资料可以进行一下共享。到此结束。

浅谈XSS的更多相关文章

  1. 浅谈xss原理

    近日,论坛上面XSS满天飞,各处都能够见到XSS的痕迹,前段时间论坛上面也出现了XSS的迹象.然后我等小菜不是太懂啊,怎么办?没办法仅仅有求助度娘跟谷歌这对情侣了. 能够说小菜也算懂了一些.不敢藏私, ...

  2. 浅谈xss攻击

    近期学习过程中提到xss攻击的问题,便想要了解一下,总结如下: XSS攻击:跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, ...

  3. [转]以新浪为例浅谈XSS

    随着网络时代的飞速发展,网络安全问题越来越受大家的关注,而SQL注入的攻击也随着各种防注入的出现开始慢慢的离我们而去,从而XSS跨站脚本攻击也慢慢的开始在最近几年崛起,也应对了’没有绝对的安全’这句话 ...

  4. 浅谈XSS攻击原理与解决方法

    概述 XSS攻击是Web攻击中最常见的攻击方法之一,它是通过对网页注入可执行代码且成功地被浏览器 执行,达到攻击的目的,形成了一次有效XSS攻击,一旦攻击成功,它可以获取用户的联系人列表,然后向联系人 ...

  5. 浅谈xss漏洞

    0x00 xss漏洞简介 XSS漏洞是Web应用程序中最常见的漏洞之一.如果您的站点没有预防XSS漏洞的固定方法, 那么很可能就存在XSS漏洞. 跨站脚本攻击是指恶意攻击者往Web页面里插入恶意Scr ...

  6. 浅谈CDN、SEO、XSS、CSRF

    CDN 什么是CDN 初学Web开发的时候,多多少少都会听过这个名词->CDN. CDN在我没接触之前,它给我的印象是用来优化网络请求的,我第一次用到CDN的时候是在找JS文件时.当时找不到相对 ...

  7. 【ASP.NET MVC系列】浅谈ASP.NET MVC 视图

    ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...

  8. 【转】浅谈常用的几种web攻击方式

    浅谈常用的几种web攻击方式 一.Dos攻击(Denial of Service attack) 是一种针对服务器的能够让服务器呈现静止状态的攻击方式.有时候也加服务停止攻击或拒绝服务攻击.其原理就是 ...

  9. django 浅谈CSRF(Cross-site request forgery)跨站请求伪造

    浅谈CSRF(Cross-site request forgery)跨站请求伪造(写的非常好) 本文目录 一 CSRF是什么 二 CSRF攻击原理 三 CSRF攻击防范 回到目录 一 CSRF是什么 ...

随机推荐

  1. C--控制语句循环例子

    C的三种循环while.for和do  while 先说一下scanf()函数的返回值问题 当scanf("%d,%d",&a,&b);如果用户正确输入了俩个整形变 ...

  2. 2014牡丹江区域赛H(特里)ZOJ3826

    Hierarchical Notation Time Limit: 2 Seconds      Memory Limit: 131072 KB In Marjar University, stude ...

  3. Hack 语言学习/参考---1.1 What is Hack?

    What is Hack?¶ Hack is a language for HHVM that interopates seamlessly with PHP. The barrier to entr ...

  4. [SQLXML]FOR XML语法导出XML的易错之处

    原文:[SQLXML]FOR XML语法导出XML的易错之处 [SQLXML]FOR XML语法导出XML的易错之处 Version Date Creator Description 1.0.0.1 ...

  5. 多线程编程 (1) -NSThread

    每个iOS应用程序都有个专门用来更新显示UI界面.处理用户触摸事件的主线程,因此不能将其他太耗时的操作放在主线程中执行,不然会造成主线程堵塞(出现卡机现象),带来极坏的用户体验.一般的解决方案就是将那 ...

  6. vs.net 2013 Saffolding功能扩展

    vs.net 2013 Saffolding功能扩展 Asp.net mvc 5 CRUD代码自动生成工具 -Visual Studio.net2013 Saffolding功能扩展 上次做过一个&l ...

  7. 接口自动化测试:参数化封装(excel文件读取)

    log4j.properties文件配置 log4j.rootLogger = DEBUG,stdout,F log4j.appender.stdout = org.apache.log4j.Cons ...

  8. 第4章2节《MonkeyRunner源码剖析》ADB协议及服务: ADB服务SERVICES.TXT翻译参考(原创)

    天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文“寻求合作伙伴编写<深入理解 MonkeyRunner>书籍“.但因为诸多原因,没有如愿.所以这里把草稿分享出来,所以错误在 ...

  9. How to:installshield安装包怎样才能出现选择路径的界面?

    原文:How to:installshield安装包怎样才能出现选择路径的界面? 这个问题新手问的很多,installshield的安装包默认设置下选择路径的界面藏在Custom安装类型下.在做完安装 ...

  10. PCL点云库中怎样读取指定的PCD文件,又一次命名,处理后保存到指定目录

    我一直想把处理后的pcd文件重命名,然后放到指定的目录,尝试了好久最终做到了: 比方我想读取  "table_scene_lms400.pcd" 把它进行滤波处理,重命名为 &qu ...