2010-01-13 73 views
5

我的問題如下。我有一個XHTML 1.1頁面,它具有表單和輸入字段。其中一個輸入字段包含一個URI值。此URI包含鍵符值對,其中帶&號(&)作爲參數分隔符,它將作爲GET請求由另一個Web應用程序在瀏覽器中傳遞。How-to XHTML 1.1驗證一個&符號而不逃避它?

通常我會用實體&創建與號驗證碼爲XHTML 1.1。我的問題在於應用程序沒有收到GET請求,因爲(如預期的)瀏覽器不知道如何處理URI中的&

所以我的問題是如何在不使用HTML實體的情況下編寫&符號,因此瀏覽器仍然將其識別爲參數分隔符,並且GET請求正確傳遞給了Web應用程序。

我試過十六進制(%26)編碼符號,但瀏覽器仍然沒有「翻譯」它回到適當的&字符。

一個相關的問題,但它並沒有提供確切答案的問題我問:

XHTML and & (Ampersand) encoding

+2

「(如預期)的瀏覽器不知道如何處理''&在URI」 - 這是** **未如預期,你除非您已對其進行雙重編碼,否則不應在地址欄中看到「&」。 –

+0

請重新閱讀問題。 &符是輸入值字段中包含的URI的一部分。表單提交後,用戶將被返回到同一位置,完全按照其寫入。這意味着要麼我將「&」符號保留爲未編碼但未通過驗證,要麼將其編碼爲瀏覽器將在地址欄中收到HTML實體並且未能將查詢字符串傳遞給進程中的下一個應用程序的問題。 –

+1

將HTML轉換爲DOM時,瀏覽器應將'&'解碼爲'&'。它應該在構造URL或x-url-form編碼數據時將'&'編碼爲'%26'。如果它不起作用,那麼我懷疑你是在服務器上錯誤地處理數據。 – Quentin

回答

0

我不能打擾願意花更多的時間。我只是改變參數分離器還包括分號(;),所以我可以用它代替符號的:

#cat .htaccess 
php_value arg_separator.input "&;" 
1

有沒有辦法,包括在屬性值&字符不使用的實體。

沒有辦法在不使用實體或CDATA標記的情況下將&符字符包含爲textNode(但我敢打賭,您將作爲text/html使用,因此您無法使用這些標記)。

這就是說 - 任何不能解碼實體的瀏覽器都被破壞了。沒有主流瀏覽器失敗。您要麼使用晦澀難懂的瀏覽器,要麼會誤診問題。

+0

任何主要瀏覽器(IE或FF都可以)。瀏覽器在HTML中正確處理解碼。我指的是在地址欄中實際使用HTML實體。試試吧...... –

+2

不要那麼做!您在地址欄中輸入純文字網址,而不是HTML編碼的網址。這就像在記事本中打開Microsoft Word文檔。 – Quentin

+0

瀏覽器被重定向到該URI,因爲它被直接輸入到地址欄中,包括HTML實體。這是我的問題。 –

0

如果沒有代碼,很難判斷你試圖保存這些信息的位置,如果你可以發佈代碼,我們可以更好地理解問題。

一個可能的(如果這是事實,你面對什麼)是在查詢字符串中的項目轉移到其他形式的元素,如:

<form action="example.com/?foo=1&bar=2> 
    <!-- ... --> 
</form> 

到:

<form action="example.com"> 
    <input type="hidden" name="foo" value="1" /> 
    <input type="hidden" name="bar" value="2" /> 
    <!-- ... --> 
</form> 
+0

查詢字符串不在實際的表單操作中,而是在輸入字段的值字段中。它是一個傳遞給Web應用程序的值,它稍後將用戶的瀏覽器返回到同一個URI(包含查詢字符串)。這是它失敗的地方,因爲瀏覽器無法理解地址欄中的HTML實體。 –

+0

呃,我的壞。如果是這種情況,當你將它放在輸入字段時(爲避免任何XSS攻擊,這可能是最好的辦法了),然後在重定向服務器端之前解除它,那麼你是不是可以逃避它? – mynameiscoffey

+0

不幸的是,重定向來自第三方。所以我需要發送完全按照我需要的URI返回......第三方只需接收它並在完成其他工作後將用戶的瀏覽器返回給它。 –

1

由於在您引用的其他問題中提及,瀏覽器在處理頁面時將&amp;轉換爲&,因此應在GET請求中將「&」(而不是&amp;)發送到服務器。也許您正在使用Ajax來發出GET請求,在這種情況下,您可能需要解碼HTML。該實體是XHTML所必需的 - 無需替代編碼,只需確保它被正確解碼即可。

參考:The & changes to &amp; in a hyperlink

+0

問題是瀏覽器直接將HTML實體接收到地址欄中(就好像它是直接輸入的一樣)。我不是指自動發生的解碼,例如如果您在錨中使用&符號等效實體。 –

+0

如何將URI放入輸入字段?如果該值是HTML的一部分,那麼它應該是實體名稱,如果使用JavaScript設置,那麼它不應該。 –

1

轉義&應該由客戶端(瀏覽器)的XHTML文檔中到處被轉換。

所以,你應該逃脫&&amp;