【问题标题】:How to unescape the value of a cookie using CGI in Perl on the Server Side?如何在服务器端的 Perl 中使用 CGI 取消 cookie 的值?
【发布时间】:2013-11-24 00:05:07
【问题描述】:

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

【问题讨论】:

  • 是的,逗号被转义,任何其他特殊字符也是如此。你有什么问题?
  • 当列表到达浏览器时,我不希望逗号被转义。
  • 我是 Perl 中的 CGI 新手,如何?我无法更改客户端应用程序。
  • 啊,现在有个问题......
  • 如果您需要在浏览器中取消转义,则必须在 javascript 中进行。

标签: perl cookies cgi return-value comma


【解决方案1】:

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

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

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

【讨论】:

    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2015-04-27
      • 1970-01-01
      • 2014-03-27
      • 2017-10-18
      • 2018-01-21
      • 1970-01-01
      • 2011-11-25
      • 2021-11-07
      • 1970-01-01
      相关资源
      最近更新 更多