【问题标题】:Encoding java Cookie value编码 java Cookie 值
【发布时间】:2010-12-04 15:24:42
【问题描述】:

您应该如何编码 Java Cookie 对象的实际值?我无法传递“=”之类的字符或 US-ASCII 以外的任何字符。

/Br 乔恩斯

【问题讨论】:

    标签: java encoding cookies


    【解决方案1】:

    如何做并不重要,但通常Base64 应该可以正常工作。

    注意事项:

    这听起来像是您想在 cookie 中存储任意设置。这通常不是一个好主意,因为 cookie(就像所有客户端输入一样)是不受信任的。考虑将数据服务器端存储在某个生成的(随机!)标识符下,并将其放入 cookie 中。这样一来,人们就无法绕过访问限制或通过操纵 cookie 将任意数据注入您的系统。

    如果您不能使用此方法,请将 cookie 值视为不受信任的输入并照常进行验证。

    编辑:

    Base64 不合适,因为它使用 Java cookie 不支持的“=”。而是使用

    java.net.URLEncoder.encode
    

    只使用适合 cookie 的字符。

    【讨论】:

    • 注意事项:如果您想防止人们操纵它们但又不想将它们存储在服务器上,则可以对 cookie 的内容进行加密。
    • 与问题无关,但加密 cookie 并不能阻止客户端对其进行操作。加密只会对客户端隐藏 cookie 实际包含的内容。如果您要求客户端不能操纵 cookie 的内容,则必须在从客户端接收到 cookie 时对其签名并验证服务器端内容是否与签名匹配。跨度>
    • @jambjo:好吧,如果客户端操纵加密 cookie 的内容,它将解密为随机垃圾(至少使用任何像样的加密算法)。因此,虽然客户端确实可以在技术上操纵 cookie,但它们实际上不可能完成比 DOS 更多的事情(仍然需要考虑)。
    • (cont) 如果对 cookie 进行加密,则不需要对值进行签名。一个简单的校验和(沿着 cookie 的值加密)就足够了。如果加密值被篡改,校验和将不再匹配,没有密钥就无法修复。
    • 由于不同的原因,我不能真正采用服务器端标识符解决方案。我可以进行加密,但我真的不需要。如果 Base64 足够好,我可以使用它,只要这些字符不会破坏 cookie 值(不能包括像 = 和 " 这样的字符)。
    【解决方案2】:

    如果您有不安全的字符,请使用十六进制或 URL 安全版本的 Base64 对其进行编码。常规 Base64 不能用作 cookie 值。旧的 Tomcat 过去允许在其中使用非法字符,例如“=”,但新版本现在开始强制执行 cookie 规则。

    【讨论】:

      【解决方案3】:

      我最终使用了没有填充的 Base64 编码。这意味着后面的等号被省略了,这样问题就解决了。

      创建一个无填充的 Base64 编码器java.util.Base64.getEncoder().withoutPadding()

      创建一个无填充的 Base64 解码器java.util.Base64.getDecoder()

      【讨论】:

        【解决方案4】:

        据我了解,您需要这样的字符串 name="Женя";Cookie cookie=new Cookie("name",new String(name.getBytes("cp1251"),"utf8"));response.addCookie(饼干);

        【讨论】:

        • 这只会破坏数据。
        【解决方案5】:

        我的 php cookie 值编码函数:

        <?
        function encode_cookie_value($value)
                 {return strtr($value,
                               array_combine(str_split($tmp=",; \t\r\n\013\014"),
                                             array_map('rawurlencode', str_split($tmp))
                                            )
                              );
                 }
        setrawcookie('kk', encode_cookie_value('jk=jk?jk-/":jk;jk jk,jk'));
        ?>
        

        【讨论】:

        • @eis,正则表达式是关键
        • 具有讽刺意味的是,“最错误”的答案是唯一正确的答案(其他只是常规错误)。 base64 不是 cookie 规范所要求的。这里@diyism 正在映射 rawurlencode,这是错误的方法,但是基于规范(对于 URI)进行编码,类似于 cookie 的编码方式。
        猜你喜欢
        • 2011-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-18
        • 2018-10-30
        • 2017-05-01
        • 2011-02-11
        • 2015-04-04
        相关资源
        最近更新 更多