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

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解决方案系列之四:关于编码的更多相关文章

  1. .NET 4 并行(多核)编程系列之四 Task的休眠

    原文:.NET 4 并行(多核)编程系列之四 Task的休眠 .NET 4 并行(多核)编程系列之四 Task的休眠 前言:之前的几篇文章断断续续的介绍了Task的一些功能:创建,取消.本篇介绍Tas ...

  2. {MySQL数据库初识}一 数据库概述 二 MySQL介绍 三 MySQL的下载安装、简单应用及目录介绍 四 root用户密码设置及忘记密码的解决方案 五 修改字符集编码 六 初识sql语句

    MySQL数据库初识 MySQL数据库 本节目录 一 数据库概述 二 MySQL介绍 三 MySQL的下载安装.简单应用及目录介绍 四 root用户密码设置及忘记密码的解决方案 五 修改字符集编码 六 ...

  3. nginx高性能WEB服务器系列之四配置文件详解

    nginx系列友情链接:nginx高性能WEB服务器系列之一简介及安装https://www.cnblogs.com/maxtgood/p/9597596.htmlnginx高性能WEB服务器系列之二 ...

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

        在讨论数据库之前我们先要明白一个问题:什么是数据库?     数据库是若干对象的集合,这些对象用来控制和维护数据.一个经典的数据库实例仅仅包含少量的数据库,但用户一般也不会在一个实例上创建太多 ...

  5. Red Gate系列之四 SQL Data Compare 10.2.0.885 Edition 数据比较同步工具 完全破解+使用教程

    原文:Red Gate系列之四 SQL Data Compare 10.2.0.885 Edition 数据比较同步工具 完全破解+使用教程 Red Gate系列之四 SQL Data Compare ...

  6. .Neter玩转Linux系列之四:Linux下shell介绍以及TCP、IP基础

    基础篇 .Neter玩转Linux系列之一:初识Linux .Neter玩转Linux系列之二:Linux下的文件目录及文件目录的权限 .Neter玩转Linux系列之三:Linux下的分区讲解 .N ...

  7. 单元测试系列之四:Sonar平台中项目主要指标以及代码坏味道详解

    更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6766994.html 众所周知Sona ...

  8. C++ 提取网页内容系列之四正则

    标 题: C++ 提取网页内容系列之四作 者: itdef链 接: http://www.cnblogs.com/itdef/p/4173833.html 欢迎转帖 请保持文本完整并注明出处 将网页内 ...

  9. " XSS易容术---bypass之编码混淆篇+辅助脚本编写"

    一.前言本文原创作者:vk,本文属i春秋原创奖励计划,未经许可禁止转载!很多人对于XSS的了解不深.一提起来就是:“哦,弹窗的”.”哦,偷cookie的.”骚年,你根本不知道什么是力量.虽然我也不知道 ...

随机推荐

  1. 解决ubuntu16.04下的sublime text3不能使用Fcitx下的搜狗输入法的问题

    Sublime Text 2/3 输入法(Fcitx)修复[Ubuntu(Debian)] 主要目的 安装 Sublime Text 3 安装 Fcitx 输入法 + 皮肤 修复 Sublime Te ...

  2. iOS之应用内跳转系统设置相关界面

    在iOS开发中,有时会有跳转系统设置界面的需求,例如提示用户打开蓝牙或者WIFI,提醒用户打开推送或者位置权限等.在iOS6之后,第三方应用需要跳转系统设置界面,需要在URL type中添加一个pre ...

  3. IEnumerable 和 IQueryable

    共有两组 LINQ 标准查询运算符,一组在类型为 IEnumerable<T> 的对象上运行,另一组在类型为 IQueryable<T> 的对象上运行.构成每组运算符的方法分别 ...

  4. 使用JUnit4与JMockit进行打桩测试

    1. 何为Mock 项目中各个模块,各个类之间会有互相依赖的关系,在单元测试中,我们只关心被测试的单元,对于其依赖的单元并不关心(会有另外针对该单元的测试). 比如,逻辑层A类依赖了数据访问层B类的取 ...

  5. HDU-1052(贪心策略)

    Tian Ji -- The Horse Racing Problem Description Here is a famous story in Chinese history. "Tha ...

  6. Solr配置与简单Demo

    简介: solr是基于Lucene Java搜索库的企业级全文搜索引擎,目前是apache的一个项目.它的官方网址在http://lucene.apache.org/solr/  .solr需要运行在 ...

  7. OC加强-day03

    #program mark - 0_18 分类的使用注意 [掌握] 1.分类的作用 作用:讲一个类分为多个模块,将相似功能的方法写在同一个模块中,方便我们后面代码的维护 "强调 1.分类中只 ...

  8. c语言中的结构体为值类型,当把一个结构体赋值给另一个结构体时,为值传递

    #include <stdio.h> int main() { struct person { int age; }; }; //值传递,将p1中所有成员变量的值赋值个p2中对应的成员变量 ...

  9. cinder

    source /root/openrc 显示云硬盘: cinder list 这只是查看了admin租户下的,要查看所有租户下的云硬盘: cinder list --all-tenant 后台手动强行 ...

  10. SQL的定义与使用

    一.SQL的定义 SQL(structured query language)即结构化查询语句,是关系数据库的标准语言. SQL的特点有: 1.综合统一 SQL集数据定义语言DDL.数据操作语言DML ...