【问题标题】:Loss of '+' characters when fetching cookie using perl's CGI::Cookie->fetch使用 perl 的 CGI::Cookie->fetch 获取 cookie 时丢失“+”字符
【发布时间】:2013-06-09 23:45:21
【问题描述】:

Cookie 具有价值:

V7S9qwSUTlYYX0gTVO5edmBVyPZkNyMecr6LuABwN3KSgwTyasj1+0pGiN2OJ6s4Jja9ma+BJ0GCCiCFUc8k/uNk/4hIwsZv0KyHVVjOHFHtOq+PHMFaBKg5wRfXReI3LDmiDnIM6h0Z9hrEO5wYha/RadNqIqfJzUTOQl7q33RqQGcx/aLoiizm3tHs05InbAkUqwusJ1E4HFVLFqyvhEunFWrRO1Y/TfrZR7GvCzNiVYGO6O6E1yhup7CAaM6Lc22TjxNfKp1jGJy4NMQUvbMqCOlWZ75sFA4H3jeuNg0RcIC2zCT7l1JU8ZECGPDqf75FoL4qi+9rO0mgdEGgZL3cFk3dSyIApxXYeAR7RlKGsB0vqd4zxdSjTz5LRWK++SPyVNBsKMcVFfHDv7tv4PAUhK4sDT7bfBow9lIwV1f8slchXEcCgLNI2TYZsr/j/GoqnSb9mxp7VGmL7Z4s7cqWdpNsXEpQ3dMM7k4n1lVKOk2qCrzBrqvJRE7mNeaAz6RVjQuroOj0tJOhLUsZeukVbCxORY6k01fNgwPc1v7xGh7y0x6906WOHlcgti4+ofaSxG4AxwWeaf55loL6vN5d5/UEICGlRuxEjpM8X5og2RYhxr/qQWGVBbiZFBkDDd7esG3rXML63cRJ011Du03UzoS2DxKhFeDmrJM7QinuDEAr0UF1p90kj6hN+PqYqfsRONFXjUS8BqjAMJVEoVnnX5uiAAu1MCZc/xDNDzhu10eiib4Tr+7y6yePw7TQm+bunMMFqYVSMMCIapiAsCS70B96UPSgRQHRbzNzeee9ulDvdtXFxdswf89Bi6LwMaPNdcVdq/Cd5KMziRzwqsCli8jkFF7qATgo5E9wU9OueGPlXCnJzdUBu2BG1JaJEZcsDdfczD3vfrVZXy/xQ66OMbwWUn/R02mr3LTiGU5T6pbcsTNbTQyWwc9gNZsjshqBNh5oJ9ScMBI947Gkatf3fkhlH1NJpXX0GNPQ6OqSg+RALq7EEqBRmy4pszu/9BDmmKck6luJzihaAfeFyZC/SwlcUbg/epGmOSAlJRRUBckj1ufuBFMKKd6hkn1qaZUX1fPrCfNVJ7pzVT66tRurqF4HvX8JIKiC/BTPN5ZAw5fkIUJKn+H7x5o1XG9WMFO/AQ/lUVstaB8/hjY+JC6bZapKwsNj

在 perl 中使用:

%cookies = CGI::Cookie->fetch;
$ticket = $cookies{$ticketKey}->value;
print STDERR $ticket;

我明白了:

V7S9qwSUTlYYX0gTVO5edmBVyPZkNyMecr6LuABwN3KSgwTyasj1 0pGiN2OJ6s4Jja9ma BJ0GCCiCFUc8k/uNk/4hIwsZv0KyHVVjOHFHtOq PHMFaBKg5wRfXReI3LDmiDnIM6h0Z9hrEO5wYha/RadNqIqfJzUTOQl7q33RqQGcx/aLoiizm3tHs05InbAkUqwusJ1E4HFVLFqyvhEunFWrRO1Y/TfrZR7GvCzNiVYGO6O6E1yhup7CAaM6Lc22TjxNfKp1jGJy4NMQUvbMqCOlWZ75sFA4H3jeuNg0RcIC2zCT7l1JU8ZECGPDqf75FoL4qi 9rO0mgdEGgZL3cFk3dSyIApxXYeAR7RlKGsB0vqd4zxdSjTz5LRWK  SPyVNBsKMcVFfHDv7tv4PAUhK4sDT7bfBow9lIwV1f8slchXEcCgLNI2TYZsr/j/GoqnSb9mxp7VGmL7Z4s7cqWdpNsXEpQ3dMM7k4n1lVKOk2qCrzBrqvJRE7mNeaAz6RVjQuroOj0tJOhLUsZeukVbCxORY6k01fNgwPc1v7xGh7y0x6906WOHlcgti4 ofaSxG4AxwWeaf55loL6vN5d5/UEICGlRuxEjpM8X5og2RYhxr/qQWGVBbiZFBkDDd7esG3rXML63cRJ011Du03UzoS2DxKhFeDmrJM7QinuDEAr0UF1p90kj6hN PqYqfsRONFXjUS8BqjAMJVEoVnnX5uiAAu1MCZc/xDNDzhu10eiib4Tr 7y6yePw7TQm bunMMFqYVSMMCIapiAsCS70B96UPSgRQHRbzNzeee9ulDvdtXFxdswf89Bi6LwMaPNdcVdq/Cd5KMziRzwqsCli8jkFF7qATgo5E9wU9OueGPlXCnJzdUBu2BG1JaJEZcsDdfczD3vfrVZXy/xQ66OMbwWUn/R02mr3LTiGU5T6pbcsTNbTQyWwc9gNZsjshqBNh5oJ9ScMBI947Gkatf3fkhlH1NJpXX0GNPQ6OqSg RALq7EEqBRmy4pszu/9BDmmKck6luJzihaAfeFyZC/SwlcUbg/epGmOSAlJRRUBckj1ufuBFMKKd6hkn1qaZUX1fPrCfNVJ7pzVT66tRurqF4HvX8JIKiC/BTPN5ZAw5fkIUJKn H7x5o1XG9WMFO/AQ/lUVstaB8/hjY JC6bZapKwsNj

注意到+ 字符丢失了吗?这可能是什么原因造成的?我们正在使用 perl v5.8.5 和 Apache/2.0.52

【问题讨论】:

  • + 是空格字符的 URL 编码,例如在/?q=hello+world 中,其中qhello world(等效于/?q=hello%20world)。我不知道 HTTP cookie 是否使用 URL 编码,但看起来确实如此。

标签: perl apache cookies cgi mod-perl


【解决方案1】:

Cookie 值是 url 转义的,这意味着空格被替换为 + 字符,其他标点符号被替换为 %xx 代码。 CGI::Cookie::fetch 方法对值进行解码,并恢复 cookie 值中的空格。

如果您不想解码 cookie 值,可以使用 raw_fetch 方法。

【讨论】:

  • 或者,如果您真的希望 cookie 具有文字 +,请将其编码为 %2B
【解决方案2】:

在您的代码中尝试 Request.ServerVariables["HTTP_COOKIE"] 值,它提供 RAW cookie(不删除 cookie 数据中的 + 或 = 字符)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    • 2017-01-04
    • 2013-09-19
    • 2013-09-07
    相关资源
    最近更新 更多