InputString:
$value = "ACM=1,1+eval(1+name+(+ACM-1),ACM)";
使用mb_convert_encoding的方法
mb_convert_encoding($value, 'UTF-8', 'UTF-7');
使用iconv的方法
iconv("utf-7", "utf-8//IGNORE", $value);
结果因mb_convert_encoding
而异ACM=1,1競(1鶩(#1),ACM)
ACM=1,1競뗺皦(#1),ACM)
我的问题是,我想运行一个用JS实现的PHP-IDS离心机,我没有mb功能。这个字符串是PHP-IDS的测试用例,我无法得到相同的结果。
有人知道,我如何得到与jb相同的结果?或者它是mb中的错误?
答案 0 :(得分:0)
在阅读RFC 2152后,在我看来mb_convert_encoding在处理格式错误的输入时非常严格,而且iconv正在尝试进行硬消毒。 但我认为我得到了想要的行为:
function convertUTF7toUTF8(string) {
var b64Token = /\+([a-z\d\/+]*\-?)/gi,
hex, len, replace, i;
return string.replace(b64Token, function(match, grp) {
hex = Buffer(grp, 'base64');
len = hex.length >> 1 << 1;
replace = '';
i = 1;
for(i; i < len; i = i + 2) {
replace += String.fromCharCode(hex.readUInt16BE(i - 1));
}
return replace;
});
}
最小化:
function convertUTF7toUTF81(s){return s.replace(/\+([a-z\d\/+]*\-?)/gi,function(m,a){var i=0,c='',h=Buffer(a,'base64'),l=h.length>>1<<1-1;while(i<l)c+=String.fromCharCode(h.readUInt16BE(i++*2));return c})};