PHP cookie特殊字符
我正在用javascript在cookies中存储多个信息。信息块用“+”符号分隔,如PHP cookie特殊字符,php,Php,我正在用javascript在cookies中存储多个信息。信息块用“+”符号分隔,如document.cookie='cookie1'+'='+inf1+'+'+inf2 但是当我从PHP中呼出这些cookies时,分隔的“+”符号被替换为空格 我试着用addslashes来回应,但没用。当我从JS向cookie发出警报时,没关系,它显示了分隔的“+”符号 有人知道这个问题的解决方案吗 您可以将+替换为它的url代码%2B document.cookie = 'cookie1' + '=' +
document.cookie='cookie1'+'='+inf1+'+'+inf2
但是当我从PHP中呼出这些cookies时,分隔的“+”符号被替换为空格
我试着用addslashes来回应,但没用。当我从JS向cookie发出警报时,没关系,它显示了分隔的“+”符号
有人知道这个问题的解决方案吗 您可以将
+
替换为它的url代码%2B
document.cookie = 'cookie1' + '=' + inf1 + '%2B' + inf2;
如果
inf1
和inf2
可能包含未编码的字符串(如果是数字,则可以)。只需在谷歌上搜索一下,这很奇怪——没有规定cookie应被视为:
- 声明:
此字符串是一个字符序列,不包括分号、逗号和空格。如果需要在名称或值中放置此类数据,建议使用一些编码方法,如URL样式
编码,但不定义或不需要编码 这就是原貌%XX
- 国家:
其中,attr和value指定为:
和标记和带引号的字符串在中指定,并可分别由以下正则表达式表示:
因此,这也不是application/x-www-form-urlencoded,而是基于HTTP的扩展所首选的另一种格式[!#$%&'*+\-.0-9A-Za-z^_`|~]+ "([ \x21\x23-\x7E\x80-\xFF]|(\r\n)?[ \t]+|\\[\x00-\x7F])*"
- 未指定与RFC 2109不同的cookie语法:
因此,仅在application/x-www-form-urlencoded中替换的
+
,不应被cookie中的空格替换。所以这是PHP的错误行为。我知道这不是新问题,但对于那些也遇到这个问题的人,我的解决方案如下:
要解决此错误,请改用转义字符
在
它说:
此函数对特殊字符进行编码,除了:*@-
_ + . /
这意味着您可以将这些字符插入cookie,但无法通过PHP检索。PHP只接受转义ASCII字符,如''+'%2A'的'*'等的''%2B'。请检查此处的Hx列:
因此,我是如何解决这个问题的(又快又脏),我尝试将转义数据插入cookie的:
function setCookie(c_name,value,exdays){
var exdate=new Date();
var n_value = escape(value).replace(/[+]/g,"%2B").replace(/[*]/g,"%2A").replace(/[@]/g,"%40").replace(/[-]/g,"%2D").replace(/[_]/g,"%5F").replace(/[.]/g,"%2E").replace(/[/]/g,"%2F");
exdate.setDate(exdate.getDate() + exdays);
var c_value = n_value + ((exdays==null) ? "" : "; expires="+exdate.toUTCString());
document.cookie=c_name + "=" + c_value;
}
这将转义其余字符,然后替换异常(+-\@*/)。它是脏的,我很确定它可以通过其他方式完成,比如regexp…等等,但它现在可以工作了
试试看,你会满意的 您知道如何修复此不良行为吗?@Oblivion:使用不同的分隔符或使用JavaScript函数
encodeURIComponent
:document.cookie='cookie1='+encodeURIComponent(inf1++'+inf2)
FYI,w3schools.com通常被认为是一个低于标准的编程信息资源——最好使用其他来源进行验证。
attr = token
value = word
word = token | quoted-string
[!#$%&'*+\-.0-9A-Za-z^_`|~]+
"([ \x21\x23-\x7E\x80-\xFF]|(\r\n)?[ \t]+|\\[\x00-\x7F])*"
cookie = NAME "=" VALUE *(";" set-cookie-av)
NAME = attr
VALUE = value
function setCookie(c_name,value,exdays){
var exdate=new Date();
var n_value = escape(value).replace(/[+]/g,"%2B").replace(/[*]/g,"%2A").replace(/[@]/g,"%40").replace(/[-]/g,"%2D").replace(/[_]/g,"%5F").replace(/[.]/g,"%2E").replace(/[/]/g,"%2F");
exdate.setDate(exdate.getDate() + exdays);
var c_value = n_value + ((exdays==null) ? "" : "; expires="+exdate.toUTCString());
document.cookie=c_name + "=" + c_value;
}