ECMAScriptjs中的八个编码函数:escape,encodeUPRADOI,encodeU纳瓦拉IComponent

  1. eacape(): 该方法不会对 ASCII 字母和数字实行编码,也不会对上面这么些ASCII 标点符号实行编码: * @ – _ + . /
    。别的具有的字符都会被转义系列替换。其余境况下escape,encodeUEvoqueI,encodeU帕杰罗IComponent编码结果一致。

   escape对0-255以外的unicode值实行编码时输出%u****格式

   能够接纳
unescape()
escape() 编码的字符串进行解码。

   ECMAScript v3 反对使用该方法,应用使用 decodeU冠道I() 和
decodeU福特ExplorerIComponent() 替代它。

  1. encodeURI 和 encodeURIComponent

encodeU纳瓦拉I 和
encodeUXC90IComponent都以ECMA-262正经中定义的函数,全数包容这么些专业的语言(如JavaScript,
ActionScript)都会兑现那多个函数。它们都以用来对UEscortI
(福特ExplorerFC-2396)字符串进行编码的大局函数,可是它们的处理方式和选择情况有所差异。为驾驭释它们的例外,大家首先需求通晓HavalFC-2396中对此
U本田UR-VI中的字符分类:
1>保留字符(reserved
characters):这类字符是UXC60I中的保留首要字符,它们用于分割U汉兰达I中的各样部分。那几个字符是:”;”
| “/” | “?” | “:” | “@” | “&” | “=” | “+” | “$” | “,”
2>Mark字符(mark
characters):那类字符在奥德赛FC-2396中特意定义,但是从未特意表达用途,或许是和别的LX570FC标准相关。
那几个字符是:”-” | “_” | “.” | “!” | “~” | “*” | “‘” | “(” | “)”
3>基本字符(阿尔法num
characters):这类字符是U揽胜极光I中的主体部分,它总结富有的大写字母、小写字母和数字。

在介绍完下面三类字符串后,我们就相当不难来解释encodeU锐界I和encodeU酷威IComponent函数的区别之处了:

encodeURI:
该函数对传播字符串中的全数非(基本字符、马克字符和保留字符)举办转义编码(escaping)。富有的须要转义的字符都依据UTF-8编码转化成
为四个、三个大概多少个字节的十六进制转义字符(%xx)
。例如,字符空格”
“转换到为”%20″。在那种编码情势下边,需求编码的ASCII字符用五个字节转义字符代替,在\u0080和\u007ff之间的字符用五个字节转义字符代替,其余16为Unicode字符用四个字节转义字符代替。

encodeURIComponent:
该函数处理格局和encodeU福特ExplorerI唯有五个不一致点,那正是对此保留字符平等做转义编码。那样url中的参数和值才不会被#等特殊字符截断。
比如:http://localhost:8080/xss/XssServlet?username=A&T
Plastic,该url,后台的代码:

String username = request.getParameter(“username”);

得到的username值为A,而不是大家期待的 A&T Plastic。因为 username=A&T
Plastic,在那之中蕴藏了保存字符&,并且没有举行编码,所以username的值被其给截断了。所以正确的做法是,对其开始展览编码:encodeU揽胜极光IComponent(“A&T
Plastic”) == A%26T%20Plastic,然后将地方的连天改为:

http://localhost:8080/xss/XssServlet?username=A%26T%20Plastic,后台才能获得正确的值:username==A&T
Plastic。

因为username的值含有了uri的保存字符,所以要求进行编码。

 

譬如,字符”:”被转义字符”%3A”代替

所以有地点七个不等的函数,是因为我们在写JS代码的时候对U普拉多I进行三种不相同的编码处理须要。encodeUSportageI能够用来对完全的U大切诺基I字符串举办编码处理。而encodeU奥迪Q3IComponent能够对U中华VI中2个局地开始展览编码,所以让这一有的能够包涵部分URubiconI保留字符。那在大家日常编制程序中是老大实惠的。比如上面包车型大巴U路虎极光I字符串:
http://www.mysite.com/send-to-friend.aspx?url=http://www.mysite.com/product.html

这些U奥迪Q5I字符串中。send-to-friend.aspx页面会创制HTML格式的邮件内容,里面会含有一个链接,这么些链接的地点正是上边URAV4I字符
串中的url值。分明上面包车型地铁url值是UPAJEROI中的二个部分,里面含有了URubiconI保留主要字符。大家务必调用encodeU福睿斯IComponent对它举行编
码后接纳,否则上边的U汉兰达I字符串会被浏览器认为是八个失效的UHavalI。正确的U奥迪Q3I应该如下:
http://www.mysite.com/send-to-friend.aspx?url=http%3A%2F%2Fwww.mysite.com%2Fproduct.html

最多选取的应为encodeU奥迪Q5IComponent,它是将粤语、希伯来语等特殊字符转换来utf-8格式的url编码,所以假使给后台传递参数需求选择encodeU奥迪Q3IComponent时需求后台解码对utf-8支持(form表单中的编码格局和当下页面编码方式相同

escape不编码字符有六15个:*,+,-,.,/,@,_,0-9,a-z,A-Z

encodeU大切诺基I不编码字符有捌十四个:!,#,$,&,’,(,),*,+,,,-,.,/,:,;,=,?,@,_,~,0-9,a-z,A-Z

encodeU库罗德IComponent不编码字符有柒十五个:!,
‘,(,),*,-,.,_,~,0-9,a-z,A-Z

例子:

alert(encodeURIComponent("A&T Plastic"));    //A%26T%20Plastic
alert(escape("A&T Plastic"));                //A%26T%20Plastic
alert(encodeURI("A&T Plastic"));            //A&T%20Plastic
alert(escape("A&T Plastic中"));                //A%26T%20Plastic%uFFFD%uFFFD

大家见到 encodeUHighlanderI 没有编码uri的保存字符
&,’中’被编码成了 %uFFFD%uFFFD

encodeU奥迪Q5IComponent
就编码了保留字符&。

url的编码日常会被应用在XSS攻击中来绕过服务端的 xss filter,
对有威逼的url进行伪装,让不明用户去点击

参考:

http://www.jb51.net/article/22880.htm

http://www.cnblogs.com/goody9807/archive/2009/01/16/1376913.html

 

=========

因而一旦只是处理 get 提交时url地址中的乱码难点,能够应用 encodeU哈弗I
来编码整个url;

尽管参数中隐含保留字符须求展开编码,那么应该选拔 encodeUSportageIComponent
来编码部分参数;

比方应用encodeU途胜IComponent来拍卖普通话乱码,那么前端须求运用一遍encodeUHavalIComponent(encodeURIComponent(‘你好’)),Java后端使用:

java.Net.URLDecoder.decode(param,”UTF-8″);

来解码;