-1

我正在尝试使用 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”。提前致谢。

4

2 回答 2

3

当 CGI::Cookie 将 cookie 呈现为字符串时,它会自动转义 cookie 名称和值中的任何特殊字符。它没有提供任何禁用或绕过它的方法,因为尽管 cookie 规范不需要转义,但 cookie 规范声明服务器不应发送包含未转义逗号(以及其他字符)的 cookie。另外,这只是简单的良好安全实践。

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

use CGI::Util 'unescape';
print "Set-Cookie: " . unescape "$cookie_ud" . "\n";
于 2013-11-12T09:37:19.863 回答
2

您实际上确定客户端没有正确处理转义的逗号吗?如果没有,那就是客户端的错误。Cookie 值应该是 url 转义的,并且在有效 cookie 中尤其禁止使用非转义逗号:

https://www.rfc-editor.org/rfc/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
于 2013-11-12T17:38:19.940 回答