【问题标题】:setting value of a cookie - colon in the namecookie 的设置值 - 名称中的冒号
【发布时间】:2013-04-29 09:41:43
【问题描述】:

我不熟悉通过 javascript 设置 cookie 值,我对这两者的了解都很基础 - 尽管我对调整 JQuery 感到满意。

总之,我在一个网站上工作,该网站必须依法显示 cookie 政策。

我们有一个第三方解决方案会弹出一个 jquery 控制的 div 容器,其中包含一条消息和几个按钮:“稍后提醒我”和“设置”。如果用户点击设置,他们可以“保存并关闭”或更改安全级别,弹出窗口将消失。

我们已经调整了这个第三方解决方案并添加了一个“接受”按钮,用户只需确认“默认”cookie 设置并继续使用该网站。

到目前为止一切顺利!

我们知道这个第三方解决方案正在写入具有以下基本值的 cookie:

Cookie 名称:wsjnudge_javascript:jQuery_ws.jpecrJs.display(jQuery.ws.jpecrJs())_= true;

如果此值设置为true,则提示更改 cookie 设置的弹出消息将不会再次显示,直到 cookie 过期。

问题是 cookie 名称中有一个冒号(:),当我们通过 javacript 解析 cookiename 时,它​​会创建一个名称为:的 cookie:

wsjnudge_javascript%253AjQuery_ws.jpecrJs.display(jQuery.ws.jpecrJs())_

所以冒号 ( : ) 被替换为 %253A

我们已经编写了一些 Jquery / javascript 代码来设置这个 cookie 的值并尝试对冒号进行编码:

首先通过设置一个变量:

var acceptCookieEncode = encodeURIComponent
 ("wsjnudge_javascript:jQuery_ws.jpecrJs.display(jQuery.ws.jpecrJs())_");

然后通过点击功能写入cookie并关闭弹出窗口:

jQuery(document).on('click','.continue',function(){

jQuery.cookie( acceptCookieEncode, 'true', { expires: 365 });
jQuery('#wsjnudge').remove();

所以,总而言之,关闭函数正在工作,但由于冒号,cookie 名称不正确,所以实际上我们正在创建并将值设置为错误的 cookie 名称..

我知道我可能必须使用 base64,但我完全不知道如何实现它,显然我没有正确使用 encodeURIcomponent 来正确解析 URI。

如果此消息的格式不正确,我深表歉意。第一次发帖,但 StackOverflow 的老用户,在此先感谢您的帮助。

丹。

【问题讨论】:

    标签: javascript jquery cookies jquery-cookie setcookie


    【解决方案1】:

    Cookie 没有标准的转义机制。例如,; 字符根本不能在 cookie 中使用;与 URL 编码或 HTML 编码不同,没有任何方案允许直接从 cookie 中获取的字符表示分号。

    所以人们倾向于做的是 ad-hoc 编码——他们用某种任意形式的编码对 cookie 进行编码,并在将其拉回后再次对其进行解码。 encodeURIComponent() 所做的 URL 编码是最流行的 ad-hoc 编码方法,但仍然不是您可以期望工具无条件使用的一种。

    jQuery cookie 插件采用这种编码形式,并在cookie 名称和值上为您调用encodeURIComponent()。因此,如果您将名称 wsjnudge_javascript:jQuery... 传递给它,您将设置的 cookie 将具有真实名称 wsjnudge_javascript%3AjQuery。当您像在示例代码中那样自己调用 encodeURIComponent() 时,您将获得的输出是双重编码的:wsjnudge_javascript%253AjQuery...

    想必这些名称都对您正在使用的第三方代码没有任何用处,它可能正在寻找具有真实名称wsjnudge_javascript:jQuery... 的cookie。您不能使用 jQuery cookie 插件设置此 cookie,因为它内置了非 cookie 标准的 URL 编码。您可以直接在 JavaScript 中设置,例如:

    document.cookie= 'wsjnudge_javascript:jQuery_ws.jpecrJs.display(jQuery.ws.jpecrJs())_= true';
    

    尽管请注意,您可能需要向其中添加一些参数以匹配第三方代码使用的任何内容 - 如果 pathdomain 参数不匹配,那么您最终可以得到两个副本相同的 cookie。

    理论上,根据RFC 6265(这是我们对 cookie 的标准最接近的内容),不允许在 cookie 名称中包含冒号而不用双引号将名称括起来。但是,实际上浏览器(我已经测试过)确实允许它,并且不要将双引号视为任何特殊的东西 - 所以在这种情况下,真正的 cookie 名称最终会包含双引号,这不会被第三方脚本。

    因此,在 cookie 名称中放置冒号有点不明智,但这可能是第三方脚本的一部分,因此您只能坚持使用它。一般来说,cookie 名称很奇怪,我担心它似乎包含可执行的 JavaScript 代码。

    如果没有第三方源代码,我无法判断这是否真的会发生,但如果第三方脚本确实从 cookie 名称中提取了 JavaScript 代码并使用 eval() 执行它,那么这真的是馊主意。除了严重的丑陋之外,它还允许任何可以将 cookie 注入您的域(例如,来自易受攻击的相关域)的人将 cookie 注入升级为成熟的跨站点脚本漏洞。

    这取决于您的网站做什么,以及您是否担心这种攻击,它有哪些用户数据/交互。就我个人而言,在我的一个网站上这样做会感到不舒服...

    【讨论】:

    • 嗨,鲍勃,非常感谢您提供的信息丰富且很有帮助的回复。因为我们在这里处理的是一个电子商务网站,所以您强调的安全问题是我们真正关心的问题。我们将寻求联系第三方并检查 a) 代码是否可信 b) 我们可以在不影响安全性的情况下利用和调整资源!非常感谢,丹。
    • 只是补充一下,您的上述解决方案有效,非常感谢您的意见。
    • 不用担心。假设您获得了可读的源代码,应该很容易找出该代码的处理方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-01
    • 2016-10-24
    • 1970-01-01
    • 2019-02-25
    相关资源
    最近更新 更多