XSS解决方案系列之四:关于编码

本文准备说明以下几个问题:

1. 关于重复编码的问题
2. 关于编码的多种形式的问题
3. 关于编码的几个常见问题

【说明】

本文所述编码是指encode,可以理解为转义,而不是编程序写代码。

编码或者转义机制替我们解决两个问题:

a. 避免保留字冲突问题,对于web应用来说,XSS问题也是其中一类

b. 表达不可输入字符问题,比如我想在程序当中表达一个键盘上没有不可输入的字符,可以通过编码来解决。

【进入正题】

1. 关于重复编码的问题:

我看了一些第三方的decoder/encoder库函数,相当一部分函数是不进行重复编码的,也就是说,当中函数发现【&#】后面带几个数字再带一个【;】号形式时,就不再对其进行HTML编码,同样,对于URL/JS的处理也这样,这肯定是不对的,它违背了浏览器解码的规律,因为浏览器只会在需要解码的地方进行解码而忽略你给它的字符串是什么形式,为何你要在编码的时候去避免重复编码呢?

我知道部分同行不进行重复编码的原因有许多,有的因为使用了一些第三方的库函数,有的是没搞清楚为谁而编码,编码解决的是什么样根本问题……原因列不全,总之在需要重复编码地方你就进行重复编码是没问题的,放心好了。似乎没有例子,总不能让人看着舒心,好吧,举一个小例子:

http://a.b.c/admin.jsp?d=x&e=6
------redirect-1------->http://a.b.c/login.jsp?backurl_1=http%3A%2F%2Fa.b.c%2Fadmin.jsp%3Fd%3Dx%26e%3D6
------redirect-2-------> http://a.b.c/sso.jsp?backurl_2=http%3A%2F%2Fa.b.c%2Flogin.jsp%3Fbackurl_1%3Dhttp%253A%252F%252Fa.b.c%252Fadmin.jsp%253Fd%253Dx%2526e%253D6

以上redirect-2后面的URL第一次会返回到redirect-1被解码一次,如果redirect-1到redirect-2没有对backurl_1进行重复编码的话,那么再一次由——redirect-2—–>返回到——redirect-1的时候,就会被解码到原型状态,此时如果backurl_1里的参数值含有URL敏感字符,可能就出问题了。

2. 关于编码的多种形式的问题

看一段敏感字符串: 【</>”&#=-’”】

HTML编码-3: 【&#lt;…..】

JS编码-1: 【\<\/\>\”\&\#\=\-\’\”】

JS编码-2: 【\x3C\x2F\x3E\x22\x26\x23\x3D\x2D\x27\x22】

JS编码-3:【\u003C\u002F\u003E\u0022\u0026\u0023\u003D\u002D\u0027\u0022】

URL编码:【%3C%2F%3E%22%26%23%3D-%27%22%3F】

仔细观察以上编码,值得看一下的是:HTML编码-1:
,它的中间位置的数字其实就是当前字符ISO8859-1的编码表示,第二种形式则是基于HTML-1的16进制表示,HTML-3则是别名法表示

对于JS编码,通常对于任何敏感可见字符,你都可以通过【\】+【字符来表达】,所以JS编码-1就是如此,对于-2、-3我觉得也应该一目了然了,与HTML-2都是类似的。

URL编码,应该也不难了吧。

总结一下:浏览器默认会使用ISO8859-1来作为解码的基础,对于HTML/JS/URL只是使用了不同的形式而已,给大家留点问题:

a.
如果Web应用在编程实现时自己指定了字符集,但是却在HTTP
Response的Stream里没有指定字符集,会怎么样,浏览器会不会解码出错?

b. 关于编码的问题,是您不好越却不得不越过的一个小砍,望读者下功夫把字符集、编码的历史沿革及不同编码之间的关系搞清楚,许多问题都迎刃而解了。

3.
关于编码的几个常见问题

a.
有时候只使用一种编码尽管不正确,但是似乎是可以解决XSS问题的,为什么还要使用组合编码?

a) 敏感字符集不同,对于HTML来说,可能【?】号不是敏感字符,但是对于URL来说,它是敏感字符

b)
避免改变用户的输入,只有遵循浏览器解码机制,才是完全正确的,否则都会有这样那样的问题

b. URL编码与URL参数编码的问题:

a)  允不允许使用【Javascript:】+
【javascript函数】类似这样的形式URL的问题是我们进行URL合法性检查的重要部分, 还有ftp://等多种协议

b)
关于URL编码与URL参数的编码,希望你多做实验,找找感觉。我个为认为我们只需要对URL的参数值进行真正意义上的URL编码,而类似于【href】【src】【replace】里一级URL,我们主要是对URL
进行合法性检查,至于为什么,一时半会说不明白,你亲自做实验,效果会更好。

c. 可以重复编码,只要你编码环境没判断错误,重复多少次都没问题。

d.
关于基于JSON数据进行前端复杂的UI绘制的web应用所涉及到的XSS问题,原理完全一致,只是由于语法环境不能一目了然而增加了开发人员判断的难度,但是搞清楚了原理,做对了,在你你fix
XSS问题后就不会遇到诸多bug或者fix不彻底的问题

关于XSS问题,至此告一段落,我相信有了这一系列的纲要,虽然不能保证你可以灵活使用,但是至少你有一条明确的路线可以去走。

还引用那句话:

“知识”与“知识运用”就如牛郎星与织女星,二者之间似乎关系密切,实则相隔甚远!

XSS解决方案系列之四:关于编码,布布扣,bubuko.com

时间: 2024-08-09 02:58:38

XSS解决方案系列之四:关于编码的相关文章

「视频直播技术详解」系列之四:推流和传输

关于直播的技术文章不少,成体系的不多.我们将用七篇文章,更系统化地介绍当下大热的视频直播各环节的关键技术,帮助视频直播创业者们更全面.深入地了解视频直播技术,更好地技术选型. 在上一期中,我们介绍了讲解编码和封装. 本篇是<解密视频直播技术>系列之四:推流和传输.推流是直播的第一公里,直播的推流对这个直播链路影响非常大,如果推流的网络不稳定,无论我们如何做优化,观众的体验都会很糟糕.所以也是我们排查问题的第一步,如何系统地解决这类问题需要我们对相关理论有基础的认识. 本系列文章大纲如下: (一

企业内部IT一体化系列之四:WEB平台 SharePoint服务配置

上文中我们只是简单的安装完了SharePoint,其实最最重要的服务配置还在后面,SharePoint自己单独拿出来就可以讲很久,而我这里的目的只是方便大家部署一个可以承载System Center Service Manager自助门户站点的平台,所以我尽量捡重点说: 一:创建服务应用程序: 1:服务应用程序说明 所有的服务数据库命名规则为:SharePoint_WebApp_站点名,SharePoint_App_服务名 命名规则仅供参考 SharePoint 2010中默认有以下服务应用程序

oracle学习入门系列之四 oracle数据库简介

oracle学习入门系列之四 oracle数据库简介 终于平滑过渡到oracle了,我们在第一篇中黑了拉里一次,这里就需要给拉里洗白了.话说当年钱钟书先生写完<围城>之后,无意中说,一个鸡蛋就算好吃,也没必要知道下蛋的母鸡是哪只.蛤蟆觉得有点不妥,钱钟书先生那是文人,自然要清高,而且他本是"下蛋"的母鸡当然不愿意被吃蛋的俗人打扰的,况且当时也没有统计粉丝一说.可是我们是吃蛋的啊,而且是大老粗,现在还统计粉丝数量,我们就需要知道谁下的蛋,是不是毒蛋,对不对?也得看看下了这么好

TCP/IP网络编程系列之四(初级)

TCP/IP网络编程系列之四-基于TCP的服务端/客户端 理解TCP和UDP 根据数据传输方式的不同,基于网络协议的套接字一般分为TCP和UDP套接字.因为TCP套接字是面向连接的,因此又称为基于流的套接字.在了解TCP之前,先了解一下TCP所属的TCP/IP协议栈. 如图所示,TCP/IP协议栈共分为4层,可以理解成数据收发分成了4个层次化过程. 链路层 它是物理链接领域标准化结果,也是最基本的领域,专门定义LAN.WAN.MAN等网络标准.若两台计算机通过网络进行数据交换,链路层就负责整个物

Sql Server来龙去脉系列之四 数据库和文件

在讨论数据库之前我们先要明白一个问题:什么是数据库? 数据库是若干对象的集合,这些对象用来控制和维护数据.一个经典的数据库实例仅仅包含少量的数据库,但用户一般也不会在一个实例上创建太多的数据库.一个数据库实例最多能创建32767个数据库,但是按照实际情况,一般设计是不会达到这个限制值. 为了更明显地说明数据库,数据库包含了以下属性和功能: *. 它是很多对象的集合,比如表.视图.存储过程.约束.对象集合的最大值是2(31) - 1(超过2百亿).一般对象的数量在几百至一万. *. 它维持拥有的用

ggplot2绘图入门系列之四:再说散点图

1 色彩和形状的控制 数据特征不仅可以用坐标来表示,也可以用不同的色彩或形状来表示.仍以mpg数据集为例,所用到的变量有cty(城市中行驶距离),hwy(高速路行驶距离),displ(排量大小),year(生产年份) 1 library(ggplot2) 2 p <- ggplot(mpg, aes(cty, hwy)) 3 p1 <- p + geom_point(aes(colour = factor(year),shape = factor(year), size = displ), a

SCCM2012 R2实战系列之四:初始化配置

在之前的文章中,我们已经完成了SCCM 2012 R2 独立主站点的部署.为了客户端代理软件的顺利安装和OSD操作系统的分发,我们需要配置组策略及DHCP服务.在本系列的第四部分,跟大家一起分享下如何去实现SCCM的初始化配置. 1. 针对计算机OU的重定向 默认情况下,所有加域的计算机会自动存放到名为"computer"的容器中,为了方便对计算机的管理,我们需要重定向,让加域的计算机自动存放在名为"CMP"的OU中. 打开Active Directory用户和计算

&quot; XSS易容术---bypass之编码混淆篇+辅助脚本编写&quot;

一.前言本文原创作者:vk,本文属i春秋原创奖励计划,未经许可禁止转载!很多人对于XSS的了解不深.一提起来就是:"哦,弹窗的"."哦,偷cookie的."骚年,你根本不知道什么是力量.虽然我也不知道,哈哈.好了,不瞎扯了,进入今天的主题:XSS易容术---bypass之编码混淆 二.正文1.总括很多时候,我们的一些关键字被过滤.直接闭合前面payload,插入测试语句<script>alert(/xss/)</script>,是弹不出窗的.

Java【基础系列】-文件编码与格式

本章主题: 简要的回顾java的基础知识 读文件: BufferedReader 从字符输入流中读取文本,缓冲各个字符,从而提供字符.数组和行的高效读取. 可以指定缓冲区的大小,或者可使用默认的大小.大多数情况下,默认值就足够大了. 通常,Reader 所作的每个读取请求都会导致对基础字符或字节流进行相应的读取请求.因此,建议用 BufferedReader 包装所有其 read() 操作可能开销很高的 Reader(如 FileReader 和 InputStreamReader).例如, B