聘我网

新概念招聘3.0

为什么CGI.pm会使用\0来pack multivalued parameters?

vote up0vote downstar

When using this, the thing you must watch out for are multivalued CGI parameters. Because a hash cannot distinguish between scalar and list context, multivalued parameters will be returned as a packed string, separated by the "\0" (null) character. (source)

但问题是在很多脚本语言中\0并不具有C中同样的特殊地位:

print length("a\0b");  #perl
alert("a\0b".length) //javascript

输出是3,这样不会有问题么?

 

1 个答复

vote up0vote downcheck

CGI.pm这么做是始于Perl 4,

那时候还没有引进引用的概念,

所以只能通过某种方式将multivalue pack成单个字符串。

但这么做就必然导致了无法正确一些特殊的参数:

http://example.com/?foo=%00

其中%00是这么来的:

alert(encodeURIComponent('\0'));

也可以反过来验证ASCII码值:

alert(decodeURIComponent('%00').charCodeAt())

还可以看到\0Javascript中确实不表示字符串结束:

alert(encodeURIComponent("1\0002"));
alert(encodeURIComponent("a\0b"));

但是在浏览器里操作的话,

一般不会有这种问题,

因为假如输入了\0

也会被转义成\\0

然后再url_encode

但如果黑客使用脚本来提交表单,

就没有这种限制了~

但一般光靠这点也捞不着太大的好处。

链接

您的回答





不是您要找的问题? 浏览其他含有标签 的问题或者 自己问个.