如何在服务器端使用Perl中的CGI来消除cookie的价值?

时间:2013-11-12 01:03:44

标签: perl cookies cgi return-value comma

我正在尝试使用Perl中的CGI将cookie值中的逗号分隔的单词列表发送回浏览器,但逗号符号始终转换为“%2C”:

top%2Cchay%2Cpisi

代码如下:

$ud        = 'top,chay,pisi';
$cookie_ud = CGI::Cookie->new(
-name    => 'ud',
-value   => $ud,
-expires => '+25y'
);
print "Set-Cookie: $cookie_ud\n";

我这样做是因为我必须将这些数据传递给我尚未开发的程序。 如何避免在服务器端应用程序中转义逗号?我希望cookie的值等于“top,chay,pisi”而不是“top%2Cchay%2Cpisi”。 提前谢谢。

2 个答案:

答案 0 :(得分:3)

CGI :: Cookie在将cookie呈现为字符串时会自动转义cookie名称和值中的任何特殊字符。它没有提供任何禁用或绕过此方法的方法,因为,虽然cookie规范不需要转义,但 cookie规范规定服务器不应发送包含未转义逗号(包括其他字符)的cookie。此外,这只是一个很好的安全实践。

如果你真的,真的需要发送包含未转义原始数据的cookie(这是推荐),你需要在打印之前取消cookie字符串

use CGI::Util 'unescape';
print "Set-Cookie: " . unescape "$cookie_ud" . "\n";

答案 1 :(得分:2)

您是否确实客户端无法正确处理转义的逗号?如果没有,则是客户端中的错误。 Cookie值应该是url转义的,特别是未转义的逗号在有效的Cookie中被禁止:

http://tools.ietf.org/html/rfc6265#section-4.1.1

cookie-value      = *cookie-octet / ( DQUOTE *cookie-octet DQUOTE )
cookie-octet      = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E
                   ; US-ASCII characters excluding CTLs,
                   ; whitespace DQUOTE, comma, semicolon,
                   ; and backslash