PHP cookie特殊字符

PHP cookie特殊字符,php,Php,我正在用javascript在cookies中存储多个信息。信息块用“+”符号分隔,如document.cookie='cookie1'+'='+inf1+'+'+inf2 但是当我从PHP中呼出这些cookies时,分隔的“+”符号被替换为空格 我试着用addslashes来回应,但没用。当我从JS向cookie发出警报时,没关系,它显示了分隔的“+”符号 有人知道这个问题的解决方案吗 您可以将+替换为它的url代码%2B document.cookie = 'cookie1' + '=' +

我正在用javascript在cookies中存储多个信息。信息块用“+”符号分隔,如
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指定为:

    和标记和带引号的字符串在中指定,并可分别由以下正则表达式表示:

    [!#$%&'*+\-.0-9A-Za-z^_`|~]+
    "([ \x21\x23-\x7E\x80-\xFF]|(\r\n)?[ \t]+|\\[\x00-\x7F])*"
    
    因此,这也不是application/x-www-form-urlencoded,而是基于HTTP的扩展所首选的另一种格式

  • 未指定与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;
    }