2012-02-29 80 views
2

讓我先說Javascript並不是我的強項,並且我爲這個主題的信息所做的所有搜索都導致瞭如何處理url編碼/解碼字符串。防止Javascript解碼編碼的HTML

我有一些代碼的麻煩類似以下內容:

<a href="#" onclick="<?php echo "alert('&#039;');"; ?>">test</> 

我預計,由於值傳遞給警報URL編碼,即點擊鏈接時,會顯示一個提示框其中值爲&#039;

事實證明,因爲它位於onclick的引號之間,所以瀏覽器在執行之前將'解碼爲單引號。基本上導致代碼是alert(''');,這顯然破壞可怕。

以下工作正常。

<script>alert('&#039;');</script> 

首先,有沒有辦法來禁用這種行爲或聰明的解決方法? (我猜不是)

我目前的解決方案是解碼html編碼的字符串,應用斜槓引號,然後重新編碼它。顯然不是很優雅。

更好的解決方案將不勝感激。

回答

5

這是預期的行爲。 HTML源代碼中的HTML實體在瀏覽器解析屬性時自動轉換。這允許網站開發人員在不破壞頁面的情況下將特殊字符(例如引號)包含在屬性中。

使用htmlspecialchars取得預期的效果:

<a href="#" onclick="<?php echo htmlspecialchars("alert('&#039;');"); ?>">test</a> 
+0

我實實在在地感受到那種如果密被提醒有關'htmlspecialchars'。這是一天結束,我缺乏caffine。乾杯。 – Leigh 2012-02-29 17:16:03

0

這是因爲&#039;是HTML屬性中解碼。這是您不應該將HTML內聯JavaScript的原因之一。

2

不,你必須做你所描述的,有充分的理由:這是洋蔥層的東西。

鑑於您的特定洋蔥:

<a href="#" onclick="<?php echo "alert('&#039;');"; ?>">test</> 

第一層是PHP,這事情會發送此瀏覽器時:

<a href="#" onclick="alert('&#039;');">test</> 

下一層是瀏覽器的HTML解析器,這是負責各種事情,包括創建DOM元素(和其他類型的節點)和處理字符實體。所以HTML解析器在內存中創建一個a元件:

+------------------------+ 
| a      | 
+------------------------+ 
| href: "#"    | 
| onclick: "alert(''');" | 
|      | 
+------------------------+

下一層是JavaScript執行。當用戶點擊a元素時,瀏覽器將JavaScript引擎所包含的onclick屬性所包含的字符串傳遞給JavaScript引擎,然後JavaScript引擎必須解析  —,當然它會引發語法錯誤。

這個洋蔥的每一層都有它自己的語法規則等等,你必須爲每層的規則編碼,以便當該層看到文本時看起來像什麼。

0

您可以通過兩種與串聯分裂HTML實體:

<a href="#" onclick="alert('&#'+'039;');">test</a>​ 
+0

他可以。但是他不會得到他想要的東西,而且這將涉及在他的來源中擁有一個無效的實體。 – 2012-02-29 17:10:30