有关URL编码你测试对了吗?

背景

对用户而言,使用客户端APP最常用的行为之一是浏览网页。在网页访问这一行为过程中,客户端APP会先对网站进行安全判断,相应的在发送的请求中,会对网页的URL进行编码处理。但由于网页URL的多样化,在测试过程中需要注意网页URL的特殊性和URL编码算法的兼容性。

事件举例:

某次测试中,对特定网站进行访问时,服务端无法对客户端请求中URL编码后的信息进行正确的译码,进而无法得到完整的原始URL信息。网页URL信息为:

http://xxx/index.php?menu=&ms=

URL编码测试

问题分析

产生这一问题的原因,我们首先需要判定是译码处理出错,还是编码操作出错。继而,再进一步定位问题的具体原因。

1、问题原因

在经过问题跟进定位后,发现原因是URL编码出错,具体为开发实际使用的URL编码函数,无法对该URL中包含的特殊字符“&”进行处理。详细阐述如下:

在本次事例中,使用的URL编码函数为encodeURI(),该函数存在一定不足,不会对URL中具有特殊含义的ASCII标点符号(保留字符)进行转义,包括:;/?:@&=+$,#。保留字符是用来分隔URL中的各个部分,所以服务端在对URL译码时,会对这些保留字符进行处理,截取这些符号前的URL信息,因而获取不到完整的URL信息。

2、解决方案

替换URL编码函数,替换成encodeURIComponent()函数,该方法可对这些特殊符号,用一个或多个十六进制的转义序列替换。

问题深度挖掘

通过这个问题,我们可以看出,网页URL具有多样性和特殊性,在使用URL编码算法时,需要考虑各个算法函数对URL各特殊字符的兼容性。那么常见的网URL一般都有那些字符类型呢?常用的URL编码函数都有哪些特点呢?让我们一起来探讨下。

1、网页URL字符信息

网页URL中包含的字符信息,常见的有如下三类:

  • 保留字符(reserved characters):这类字符是URI中的保留关键字符,它们用于分割URI中的各个部分。这些字符是:";" |"/" | "?" | ":" | "@" |"&" | "=" | "+" | "$" |"," 。
  • Mark字符(mark characters):这类字符在RFC-2396中特别定义,但是没有特别说明用途,可能是和别的RFC标准相关。这些字符是:"-" | "_" | "." |"!" | "~" | "*" | "'" | "(" |")" 。
  • 基本字符(alphanum characters):这类字符是URI中的主体部分,它包括所有的大写字母、小写字母和数字 。

2、网页URL常见编码函数

常见的URL编码函数主要有encodeURIComponent()和encodeURI(),两者的区别如下:

前者假定它的参数是URL的一部分(比如协议、主机名、路径或查询字符串)。因此 encodeURIComponent() 函数将转义用于分隔 URL各个部分的标点符号。

encodeURI() 用于编码整个URL,因为URL中的合法字符都不会被编码转换。encodeURIComponent方法在编码单个URIComponent(指请求参数)应当是最常用的,它可以将参数中的中文、特殊字符进行转义,而不会影响整个URL。

URL编码测试

问题总结

除了上述访问网站场景中会涉及到URL编码外,统计数据的发送也会应用到URL的编码。从本次问题中,我们可以总结出网站URL编码的客户端相关测试点及影响因素,具体如下所示:

URL编码测试



留言