Express处理GET请求query参数时部分URL编码未正常解析的原因
问题根源
该解析异常由参数中存在非法URL编码触发,和Express框架本身逻辑无关:
- 按照URL编码规范,转义标识符
%后必须紧跟2位合法十六进制字符(取值范围0-9、a-f、A-F),否则属于无效转义序列。传入的第三个routine参数值中包含%H片段,H不在十六进制合法字符范围内,属于非法转义。 - Express默认依赖
qs库解析query参数,qs解码参数时会调用JS原生decodeURIComponent方法,只要字符串内存在非法转义序列,该方法就会抛出URIError。为了避免服务直接崩溃,qs做了容错处理:单个参数值解码失败时,直接返回未解码的原始字符串,不对该值做任何转义操作。
这就是异常现象的核心原因:其余三个routine参数值里的转义序列全合法,能正常解码,所以%23被正确转换为#;第三个参数因为存在非法转义%H导致整体解码失败,直接返回原始编码串,所以串内本来合法的%23也没有被转义。
修复方式
检查第三个routine参数的传值逻辑:
- 如果参数内容本身需要包含字面量
%字符,必须将%编码为%25再传递。比如需要传递%H这段内容时,在query参数中要写成%25H,保证整个参数值的转义序列全部合法后,qs就能正常完成解码,串内的%23也会被正确转换为#。 - 如果是构造参数时手误写入了多余的
%,直接修正对应片段保证编码格式合法即可。
内容的提问来源于stack exchange,提问作者Minwoo Kim
相关产品推荐
相关产品推荐

