我在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