将3字节的数据,先后放入一个24位的缓冲区中,先来的字节占高位。数据不足3字节的话,于缓冲器中剩下的比特用0补足。每次取出6bit对原有数据用Base64字符作为编码后的输出。编码若原数据长度不是3的倍数时且剩下1个输入数据,则在编码结果后加2个=;若剩下2个输入数据,则在编码结果后加1个=。可以看出Base64编码数据大约是原来数据的3/4。
标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的/和+字符变为形如%XX的形式,而这些%号在存入数据库时还需要再进行转换,因为ANSI SQL中已将%号用作通配符。为解决此问题,可采用一种用于URL的改进Base64编码,它不在末尾填充=号,并将标准Base64中的+和/分别改成了-和_,这样就免去了在URL编解码和数据库存储时所要做的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。
window.btoa/window.atob base64编码(binary to ascii)和解码仅支持Latin1字符集。
2.2 JS转义字符
js字符字符串中包含一些反斜杠开头的特殊转义字符,用来表示非打印符、其他用途的字符还可以转义表示unicode、Latin1字符。
转义字符 含义’ 单引号
” 双引号
& 和号
\ 反斜杠
\n 换行符
\r 回车符
\t 制表符
\b 退格符
\f 换页符
\n … \nnn 由一位到三位八进制数(1到377)指定的Latin-1字符
\xnn 以16进制nn(n:0~F)表示一个Latin1字符。\x41表示字符A
\unnnn 以16进制nnnn(n:0~F)表示一个Unicode字符。只限于码点在\u0000~\uFFFF范围内
\u{n} … \u{nnnnnn} Unicode码点值表示一个Unicode字符
特别注意:
换行符\n在innerHTML使用只会展示一个空格并不会换行。
通过\n、\u和\x可以代表任意unicode字符和Latin1字符。通过这个可以对js加密保证js安全和进行隐蔽攻击。
例子:
function toUnicode(theString) { //字符串转换为unicode编码字符串,切记这个字符串是复制用的,不是让你拿来直接执行的。 var unicodeString = ''; for (var i = 0; i < theString.length; i++) { var theUnicode = theString.charCodeAt(i).toString(16).toUpperCase(); while (theUnicode.length < 4) { theUnicode = '0' + theUnicode; } theUnicode = '\\u' + theUnicode; unicodeString += theUnicode; } return unicodeString; } var xssStr = "alert('xss')"; var xssStrUnicode = toUnicode(xssStr); //输出:"\u0061\u006C\u0065\u0072\u0074\u0028\u0027\u0078\u0073\u0073\u0027\u002" eval("\u0061\u006C\u0065\u0072\u0074\u0028\u0027\u0078\u0073\u0073\u0027\u002"); //弹出xss弹窗2.3 URL编码
RFC 1738做出规定”只有字母和数字0-9a-zA-Z、一些特殊符号”$-_.+!*’(),”不包括双引号、以及某些保留字,才可以不经过编码直接用于URL”。所以当链接中包含中文或者其他不符合规定的字符的时候都需要经过编码的。然而由于浏览器厂商众多,对url进行编码的形式多种多样,如果不对编码进行统一处理,会对代码开发造成很大的影响,出现乱码现象。
URL编码规则:需要编码的字符转换为UTF-8编码,然后在每个字节前面加上%。
例如:
'牛'-->UTF-8编码E7899B-->URL编码是%E7%89%9BJS为我们提供了3个对字符串进行URL编码的方法:escape ,encodeURI,encodeURIComponent
escape:由于eccape已经被建议放弃所以大家就不要用了
encodeURI:encodeURI不编码的82个字符:!#$&’()*+,/:;=?@-._~0-9a-zA-Z,从中可以看不会对url中的保留字符进行编码,所以适合url整体编码
encodeURIComponent:这个对于我们来说是最有用的一个编码函数,encodeURIComponent不编码的字符有71个:!, ‘,(,),*,-,.,_,~,0-9,a-z,A-Z。
可以看出对url中的保留字进行的编码,所以当传递的参数中
包含这些url中的保留字(@,&,=),就可以通过这个方法编码后传输
这三个方法对应的解码方法: unescape、decodeURI、decodeURIComponent
2.4 HTML字符实体
HTML中的预留字符必须被替换为字符实体。这样才能当成字符展示,否则会当成HTML解析。
字符实体编码规则:转义字符 = &#+ascii码; = &实体名称;
XSS字符串需要防御字符的实体转换表:
10.png