2011-03-19 115 views
0

我在JavaScript中存储cookie中的多个信息。这些信息由“+”号分开,如document.cookie ='cookie1'+'='+inf1+'+'+inf2PHP cookie特殊字符

但是,当我从PHP回应这些cookie时,分隔符“+”被替换为一个空格。

我试着用addslashes回声,没有工作。当我提醒来自JS的cookie时,它是正常的,它显示分隔符“+”。

任何人都知道这个解决方案吗?

回答

0

您可以用它的网址代码%2B来代替+

document.cookie = 'cookie1' + '=' + inf1 + '%2B' + inf2; 

你也应该编码inf1inf2如果它们可能含有未编码字符串(如果他们是数字,它的罚款)。只要搜索谷歌为"JavaScript urlencode"

2

这是不可思议的 - 没有规范,指出一个cookie应被视为application/x-www-form-urlencoded

  • Netscape’s original draft说:

    NAME=VALUE 
    

    此字符串是一个序列字符不包括分号,逗号和空格。如果需要将这些数据放在名称或值中,建议使用一些编码方法,例如URL风格%XX编码,尽管没有定义或要求编码。

    所以这是普通的percent-encoding

  • RFC 2109状态:

    cookie   =  NAME "=" VALUE *(";" cookie-av) 
    NAME   =  attr 
    VALUE   =  value 
    

    ATTR被指定为:

    attr   =  token 
    value   =  word 
    word   =  token | quoted-string 
    

    令牌引用字符串HTTP/1.1指定,并且可以通过这些正则表达式分别表示:

    [!#$%&'*+\-.0-9A-Za-z^_`|~]+ 
    "([ \x21\x23-\x7E\x80-\xFF]|(\r\n)?[ \t]+|\\[\x00-\x7F])*" 
    

    因此,这不是应用/ X WWW的窗体-urlencoded任但一种基于HTTP的扩展所偏好的不同格式。

  • RFC 2965不指定有关饼干语法什么比RFC 2109不同:

    cookie   =  NAME "=" VALUE *(";" set-cookie-av) 
    NAME   =  attr 
    VALUE   =  value 
    

因此+,即只被替换应用程序/ x -www-form-urlencoded,不应该由cookie中的空格替换。所以这是PHP的错误行为。

+0

你有什么想法如何修复这种不良行为? – Oblivion 2011-03-19 23:35:13

+0

@Oblivion:使用不同的分隔符或通过使用JavaScript函数'encodeURIComponent'正确地编码值:'document.cookie ='cookie1 ='+ encodeURIComponent(inf1 +'+'+ inf2)' – Gumbo 2011-03-19 23:39:22

3

我知道这不是新问题,但对于那些,谁也运行到这个问题,这是我的解决方案:

为了解决这个错误使用转义字符,而不是

http://www.w3schools.com/jsref/jsref_escape.asp 它说:

该功能将特殊字符编码,以下除外:* @ - _ +。/

所以这意味着你可以插入这些字符到cookie,但不能通过PHP检索。 PHP仅仅接受转义的ASCII字符,如'%2B'为'+''%2A'为'*'等。检查Hx列在这里:http://www.asciitable.com/

所以我如何解决它(快速和肮脏)我试图逃脱数据插入到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; 
    } 

这个逃脱字符的其余部分,则更换例外([email protected]*./)。它很脏,我很确定它可以做其他的一些其他的东西,比如正则表达式...等,但它现在可以工作。

试试吧,你会满意的!

+1

仅供参考,w3schools.com是通常被认为是用于编程信息的次级资源 - 与其他来源进行验证是一个好主意。 – MikeTheLiar 2012-11-30 16:20:36