簡體   English   中英

PHP:HTML屬性編碼/ JavaScript解碼

[英]PHP: HTML Attribute Encoding / JavaScript Decoding

對HTML屬性上下文編碼不受信任數據的正確方法是什么? 例如:

<input type="hidden" value="<?php echo $data; ?>" />

我通常使用htmlentities()htmlspecialchars()來執行此操作:

<input type="hidden" value="<?php echo htmlentities($data); ?>" />

但是,我最近遇到了一個問題,當我需要傳遞的數據是一個需要傳遞給JavaScript以更改頁面位置的URL時,這會破壞我的應用程序:

<input id="foo" type="hidden" value="foo?bar=1&amp;baz=2" />
<script>
    // ...
    window.location = document.getElementById('foo').value;
    // ...
</script>

在這種情況下, foo是一個C程序,它不理解URL和段錯誤中的編碼字符。

我可以簡單地抓住JavaScript中的值並執行類似value.replace('&amp;', '&') ,但這看起來很糟糕,只適用於&符號。

所以,我的問題是:是否有更好的方法來對注入HTML屬性的數據進行編碼或解碼?

我已經閱讀了所有OWASP的XSS預防秘籍表 ,這聽起來像我只要我小心引用我的屬性,然后我需要編碼的唯一字符是引用本身( " ) - 在這種情況下,我可以使用類似str_replace('"', '&quot;', ...) - 但是,我不確定我是否正確理解它。

您當前使用htmlentities()htmlspecialchars()的方法是正確的方法。

您提供的示例是正確的HTML:

<input id="foo" type="hidden" value="foo?bar=1&amp;baz=2" />

value屬性中的&符確實需要進行HTML編碼,否則您的HTML無效。 大多數瀏覽器會使用&在那里正確地解析它,但這並沒有改變它無效的事實,你編碼它是正確的。

你的問題不在於值的編碼,這很好,但事實上你正在使用不能正確解碼它的Javascript代碼。

事實上,我對此感到驚訝,因為你的JS代碼正在訪問DOM,DOM應該返回解碼的值。

我寫了一個JSfiddle來證明這一點: http//jsfiddle.net/qRd4Z/

運行它,它給了我一個警告框,其中包含我所期望的解碼值。 將它更改為console.log也會給出我期望的結果。 所以我不確定你為什么得到不同的結果? 也許你正在使用不同的瀏覽器? 可能值得指定您正在測試哪一個。 或許你錯誤地對實體進行了雙重編碼? 你能否證實情況並非如此?

對HTML屬性上下文編碼不受信任數據的正確方法是什么?

如果在屬性值周圍添加雙引號,htmlspecialchars()就足夠了。

  <input id="foo" type="hidden" value="foo?bar=1&amp;baz=2" /> 

這是正確的,瀏覽器會將foo?bar=1&baz=2 (已解碼&amp; )發送到服務器。 如果服務器沒有看到foo?bar=1&baz=2 ,則必須將值編碼兩次。

獲取javascript中的值應返回foo?bar=1&baz=2 (例如document.getElementById('foo').value必須返回foo?bar=1&baz=2 )。

使用瀏覽器查看頁面源,並查看輸入字段的實際來源。

如果要使用Javascript修改輸入字段的值,則腳本必須對其進行雙重編碼。

順便說一句,你的程序不應該因用戶輸入錯誤而導致段錯誤;)

您可以使用DOM來解碼值:

function decodeHTMLSpecialChars(input){
  var div = document.createElement('div');
  div.innerHTML = input;
  return div.childNodes.length === 0 ? "" : div.childNodes[0].nodeValue;
}

這將呈現以下字符串:

'http://someurl.com/foo?bar=1&amp;baz=2'

對此:

decodeHTMLSpecialChars('http://someurl.com/foo?bar=1&amp;baz=2');
// => 'http://someurl.com/foo?bar=1&baz=2

不,對於HTML編碼和解碼, htmlspecialchars和html轉義是標准方法,並且正在為您完成工作。

難道你不只是使用html_entity_decode在PHPJS功能:

http://phpjs.org/functions/html_entity_decode

除此之外,你可以對你的數據進行base64編碼......

請注意,使用htmlentities並沒有幫助!

默認情況下,它只編碼" < > &

它不會逃脫'這可能會產生問題!

確保使用Flags作為函數,您可以在此處找到用法和示例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM