设置cookie的值 - 名称中的冒号

时间:2013-04-29 09:41:43

标签: javascript jquery cookies jquery-cookie setcookie

我是通过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:

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();

因此,总结一下close函数是有效的,但由于冒号,cookie名称不正确,所以实际上我们正在创建并将值设置为错误的cookie名称。

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

如果此邮件的格式不正确,我道歉。第一次发布海报,但是StackOverflow的常规用户,并提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

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

所以人们倾向于做的是ad-hoc编码 - 他们用一些任意形式的编码对cookie进行编码,并在将其拉回后再次对其进行解码。 URL编码是encodeURIComponent()所做的,是最流行的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注入升级为完整的跨站点脚本漏洞。

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