URL编码

什么是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的一个组件进行编码

最后是常用的编码表
放到这方便查

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值