PHP htmlspecialchars不能防禦前端innerHTML產生的XSS注入

來源:互聯網
上載者:User
不要在JS裡直接用innerHTML輸出未經JS過濾的使用者內容,
即使這些內容已經經過伺服器端PHP的htmlspecialchars或者HTMLPurifier過濾.
比如下面的代碼,頁面將alert彈出字串/xss/,因為JS會把變數中的Unicode字元\u003c和\u003e轉換成<和>輸出.

//
$xss = '\u003cimg src=1 onerror=alert(/xss/)\u003e';
//XSS
$xss = '\u003ca href=javascript:alert(String.fromCharCode(88,83,83))\u003eXSS\u003c/a\u003e';
header('Content-Type: text/html;charset=utf-8');
?>



$(#xss).append(xss)跟$("#xss").html(xss)輸出的都是HTML.

解決方案:
http://segmentfault.com/q/1010000004067521
你說的對,畢竟很多時候要把AJAX載入的資料用innerHTML添加到頁面.
值得注意的是,innerHTML本質也是輸出HTML,
所以我們可以在輸出前用JS像PHP的htmlspecialchars那樣
把特殊字元(&,",',<,>)替換為HTML實體(&"'<>).
或者乾脆直接用innerText(IE)和textContent(Firefox),也就是jQuery的text()來輸出常值內容.
Firefox不支援IE的innerText,但支援textContent.
StackOverflow上找到的兩個實現:
function htmlspecialchars(str) {
return str
.replace(/&/g, "&")
.replace(/ .replace(/>/g, ">")
.replace(/"/g, """)
.replace(/'/g, "'");
}
function htmlspecialchars(str) {
var map = {
'&': '&',
'<': '<',
'>': '>',
'"': '"',
"'": '''
};
return str.replace(/[&<>"']/g, function(k) { return map[k]; });
}
其中g表示全域(global)替換的意思,也就是把字串中的所有匹配的內容都進行替換.

不過JS模仿PHP的htmlspecialchars是一刀切的方法,資料將喪失HTML特性.
請教下,對於前端AJAX(PJAX)過來後的HTML資料大家是怎麼過濾XSS輸出的呢?
  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.