2011-03-19 156 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