我在JavaScript中存储cookie中的多个信息。这些信息由“+”号分开,如document.cookie ='cookie1'+'='+inf1+'+'+inf2
。PHP cookie特殊字符
但是,当我从PHP回应这些cookie时,分隔符“+”被替换为一个空格。
我试着用addslashes回声,没有工作。当我提醒来自JS的cookie时,它是正常的,它显示分隔符“+”。
任何人都知道这个解决方案吗?
我在JavaScript中存储cookie中的多个信息。这些信息由“+”号分开,如document.cookie ='cookie1'+'='+inf1+'+'+inf2
。PHP cookie特殊字符
但是,当我从PHP回应这些cookie时,分隔符“+”被替换为一个空格。
我试着用addslashes回声,没有工作。当我提醒来自JS的cookie时,它是正常的,它显示分隔符“+”。
任何人都知道这个解决方案吗?
您可以用它的网址代码%2B
来代替+
。
document.cookie = 'cookie1' + '=' + inf1 + '%2B' + inf2;
你也应该编码inf1
和inf2
如果它们可能含有未编码字符串(如果他们是数字,它的罚款)。只要搜索谷歌为"JavaScript urlencode"
这是不可思议的 - 没有规范,指出一个cookie应被视为application/x-www-form-urlencoded:
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的错误行为。
我知道这不是新问题,但对于那些,谁也运行到这个问题,这是我的解决方案:
为了解决这个错误使用转义字符,而不是!
在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]*./)。它很脏,我很确定它可以做其他的一些其他的东西,比如正则表达式...等,但它现在可以工作。
试试吧,你会满意的!
仅供参考,w3schools.com是通常被认为是用于编程信息的次级资源 - 与其他来源进行验证是一个好主意。 – MikeTheLiar 2012-11-30 16:20:36
你有什么想法如何修复这种不良行为? – Oblivion 2011-03-19 23:35:13
@Oblivion:使用不同的分隔符或通过使用JavaScript函数'encodeURIComponent'正确地编码值:'document.cookie ='cookie1 ='+ encodeURIComponent(inf1 +'+'+ inf2)' – Gumbo 2011-03-19 23:39:22