什么是URL编码
url编码是一种浏览器用来打包表单输入的格式
URL编码与解码
最近做题经常碰到二次编码绕过,于是打算系统总结一下关于URL编码
相关内容
为什么URL要编码
URL之所以要编码是因为URL中有些字符会引起歧义
情况一url参数字符串使用key=value键值来传参,键值之间用&分隔,如/?admin=123&password=123可是如果是/?admin=12=3&password=12&3这样value字符串包含了=或&,会造成接收Url服务器解析错误,所以必须要将&和=进行转义
情况二url的编码格式是ASCII码,而不是Unicode,也就是说Url中不能包含中文
编码原则
使用安全字符(没有特殊意义或者特殊意义的可打印字符)表示不安全字符
哪些字符需要编码
url中只允许包含英文字母(a-zA-Z)、数字(0-9)、特殊字符-_.~、保留字符(: / ? # [ ] @ ! $ & ’ ( ) * + , ; =)
不安全字符和US-ASCII码中的非可打印字符(10-7F字节表示控制字符,80-FF字节的字符)
关于保留字符
(: / ? # [ ] @)用于分隔不同组件
- :用于分隔协议和主机
- /用于分隔主机和路径
- ?用于分隔路径和查询参数
(!$&’()*+,;=)用于在每个组件中起到分隔作用
- =用于 表示查询参数中的键值对
- &符号用于分隔查询多个键值对
特别的组件中的普通数据包含这些数据时,需要对其进行编码
关于不安全字符
不安全字符:可能会引起解析程序的歧义的字符
- 空格:Url在传输的过程,或者用户在排版的过程,或者文本处理程序在处理Url的过程,都有可能引入无关紧要的空格,或者将那些有意义的空格给去掉
- 引号以及<>:引号和尖括号通常用于在普通文本中起到分隔Url的作用
- #:通常用于表示书签或者锚点
- %:百分号本身用作对不安全字符进行编码时使用的特殊字符,因此本身需要编码(经常被拿来做考点比如结合urldecode()的二次编码绕过,当传入参数时,浏览器在后面会对非ASCII码的字符(比如中文)进行一次urlencode
然后在这段代码中运行时,会自动进行一次urldecode将先前urlencode的码给解码了) - {}|^[]`~:某一些网关或者传输代理会篡改这些字符
三个编码函数
escape,encodeURI,encodeURIComponent——均用于将不安全不合法的url字符转换为合法的字符表示
不同点:
- 安全字符不同(函数不会对这些字符进行编码)
- escape(69个):*/@±._0-9a-zA-Z
- encodeURI(82个):!#$&’()*+,/:;=?@-._~0-9a-zA-Z
- encodeURIComponent(71个):!’()*-._~0-9a-zA-Z
- 兼容性不同
- 对Unicode字符的编码方式不同
- 适用场合不同:encodeURI被用作对一个完整的URI进行编码,而encodeURIComponent被用作对URI的一个组件进行编码
最后是常用的编码表
放到这方便查