2015-07-31 13 views
11

Tôi đang học phòng ngừa xss thông qua ppt này: http://stash.github.io/empirejs-2014/#/2/23 và tôi có câu hỏi trên trang này."JavaScript khử trùng không giúp bạn tiết kiệm từ innerHTML" nghĩa là gì?

Nó nói "sanitization JavaScript không giúp bạn tiết kiệm từ innerHTML", và tôi đã cố gắng một thử nghiệm đơn giản như thế này:

<!doctype html> 
 
<html> 
 
<head> 
 
    <meta charset="utf-8"> 
 
    <title>test</title> 
 
</head> 
 
<body> 
 
    <div id="test"></div> 
 
    <script> 
 
    var userName = "Jeremy\x3Cscript\x3Ealert('boom')\x3C/script\x3E"; 
 
    document.getElementById('test').innerHTML = "<span>"+userName+"</span>"; 
 
    </script> 
 
</body> 
 
</html>

khi tôi mở html này trên trình duyệt của tôi (chrome), tôi chỉ nhìn thấy cái tên "Jeremy", bằng cách sử dụng F12, tôi thấy

<div id="test"><span>Jeremy<script>alert('boom')</script></span></div> 

Mặc dù tập lệnh đã được thêm vào html, hộp cảnh báo không xuất hiện.

"JavaScript khử trùng không giúp bạn tiết kiệm từ innerHTML" Tôi nghĩ điều này có nghĩa là từ "bùng nổ" cần được cảnh báo. Tôi có đúng không?

+3

"* Tôi có đúng không? *". Số * innerHTML * không thực thi các tập lệnh. – RobG

+0

innerHTML * có thể * được thực hiện để thực thi tập lệnh thông qua việc sử dụng các thuộc tính nội dòng. –

Trả lời

7

Theo MDN, innerHTML ngăn <script> yếu tố thực hiện trực tiếp , có nghĩa là kiểm tra của bạn không được cảnh báo bất cứ điều gì. Tuy nhiên, nó không ngăn chặn xử lý sự kiện từ bắn sau này, mà làm cho khả năng sau:

var name = "\x3Cimg src=x onerror=alert(1)\x3E"; 
 
document.getElementById('test').innerHTML = name; // shows the alert
<div id="test"></div>

(kịch bản chuyển thể từ ví dụ trong bài viết, với trình tự thoát mặc dù tôi không đảm bảo đó là bên ngoài có liên quan của các yếu tố <script>)

Kể từ <script> yếu tố không bao giờ thực hiện khi chèn qua innerHTML, nó không phải là rõ ràng với tôi những gì trượt đó là cố gắng truyền đạt với ví dụ đó.


Đây thực sự là quy định tại HTML5. MDN liên kết đến bản nháp năm 2008; trong khuyến cáo của W3C hiện tại, nó nằm ở gần cuối của phần 4.11.1, just before section 4.11.1.1 begins:

Lưu ý: Khi đưa vào sử dụng các phương pháp document.write(), script yếu tố thực hiện (thường là đồng bộ), nhưng khi đưa vào sử dụng innerHTMLouterHTML thuộc tính, chúng không thực thi chút nào.

Các vấn đề liên quan