[英]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&baz=2" />
<script>
// ...
window.location = document.getElementById('foo').value;
// ...
</script>
在這種情況下, foo
是一個C程序,它不理解URL和段錯誤中的編碼字符。
我可以簡單地抓住JavaScript中的值並執行類似value.replace('&', '&')
,但這看起來很糟糕,只適用於&符號。
所以,我的問題是:是否有更好的方法來對注入HTML屬性的數據進行編碼或解碼?
我已經閱讀了所有OWASP的XSS預防秘籍表 ,這聽起來像我只要我小心引用我的屬性,然后我需要編碼的唯一字符是引用本身( "
) - 在這種情況下,我可以使用類似str_replace('"', '"', ...)
- 但是,我不確定我是否正確理解它。
您當前使用htmlentities()
或htmlspecialchars()
的方法是正確的方法。
您提供的示例是正確的HTML:
<input id="foo" type="hidden" value="foo?bar=1&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&baz=2" />
這是正確的,瀏覽器會將foo?bar=1&baz=2
(已解碼&
)發送到服務器。 如果服務器沒有看到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&baz=2'
對此:
decodeHTMLSpecialChars('http://someurl.com/foo?bar=1&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編碼......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.