为什么 %e9 或 %fd 使用 Javascript 中的 decodeURIComponent 解码无效字符串?
这些字符出现在字符串的中间,我不明白问题出在哪里。它们是有效的十六进制字符。
完整字符串(这是客户端应用程序发送到服务器的字符串的一部分,并且被 modsec 阻止):
%61%e9%3d%36%7f%00%00%01%00%00%43%fd%a1%5a%00%00%00%43
解码样本:
decodeURIComponent("%61%e9%3d%36%7f%00%00%01%00%00%43%fd%a1%5a%00%00%00%43")
错误:
VM222:1 Uncaught URIError: URI malformed
at decodeURIComponent (<anonymous>)
at <anonymous>:1:1
我正在使用这两个函数来编码 base64 和从 base64 解码(来自这里:Mozilla):
function c64(t) {
return btoa(encodeURIComponent(t).replace(/%([0-9A-F]{2})/g,
(match, p1) => {
return String.fromCharCode('0x' + p1);
}));
}
function d64(t) {
return decodeURIComponent(atob(t).split('').map(function (c) {
return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
}).join(''));
}
原始字符串在 base64 中:
d64("Yek9Nn8AAAEAAEP9oVoAAABDYek9Nn8AAAEAAEP9oVoAAABD")
返回:
...js:1 Uncaught URIError: URI malformed
at decodeURIComponent (<anonymous>)