2010-09-11 39 views
18

Tôi đang tạo một trình chỉnh sửa trang HTML nhỏ. Trình chỉnh sửa tải tệp vào iframe. Từ đó, nó có thể thêm, sửa đổi hoặc xóa các phần tử trên trang với thuộc tính, kiểu mới, v.v. Vấn đề với điều này, là JavaScript (và/hoặc các ngôn ngữ lập trình khác) có thể sửa đổi hoàn toàn trang khi tải, trước đó bạn bắt đầu chỉnh sửa các phần tử. Vì vậy, khi bạn lưu, nó sẽ không lưu đánh dấu ban đầu, nhưng trang sửa đổi + thay đổi của bạn.Tắt JavaScript trong iframe/div

Vì vậy, tôi cần một số cách để vô hiệu hóa JavaScript trên khung nội tuyến hoặc bằng cách nào đó xóa tất cả JavaScript trước khi JavaScript bắt đầu sửa đổi trang. (Tôi nghĩ tôi sẽ phải phân tích cú pháp tệp cho PHP, nhưng điều đó không quá khó) Tôi đã xem xét viết một kịch bản để lặp qua tất cả các phần tử, xóa bất kỳ thẻ nào, onclick's, onfocus's, onmouseover's, v.v. đó sẽ là một nỗi đau thực sự.

Có ai biết cách dễ dàng hơn để loại bỏ JavaScript chạy bên trong iframe không?

CẬP NHẬT: trừ khi tôi đã bỏ lỡ điều gì đó, tôi tin rằng không có cách nào để chỉ đơn giản là 'tắt JavaScript'. Nêu tôi sai vui long chân chỉnh tôi. Tuy nhiên, tôi đoán cách duy nhất để làm điều đó là phân tích bất kỳ thẻ tập lệnh và sự kiện JavaScript nào (nhấp, di chuột qua, v.v.) từ một chuỗi trang được yêu cầu.

+0

này nói về đi qua trang web với javascript và loại bỏ sự xuất hiện từng cái một: http://www.manticmoo.com/articles/jeff/programming/javascript/removing -javascript-with-javascript.php – Dan

+0

Bài viết đó đề cập đến việc xóa các nút tập lệnh, mà tôi không tin rằng sẽ "bỏ chạy các js" đã được thực hiện khi tập lệnh được tải. Tôi thực sự không hiểu câu hỏi. Tệp được tải vào iframe là gì? Bạn có cho phép người dùng nhập bất kỳ html nào vào khung nội tuyến không? Tất cả javascript này trên trang của bạn đến từ đâu? Có vẻ như bạn có quyền kiểm soát nội dung của tệp –

+0

URL "manticmoo" dường như không hoạt động, nhưng vẫn có sẵn qua Wayback Machine (archive.org): http://web.archive.org/web/ 20070128100901/http: //www.manticmoo.com/articles/jeff/programming/javascript/removing-javascript-with-javascript.php – calvinf

Trả lời

1

Bạn có thể thử cùng một giải pháp được thông qua bởi ckeditor, trong đó bạn có một bản demo here.
Bằng cách chuyển từ chế độ RTE sang chế độ xem nguồn, bạn có thể nhập một số JavaScript và xem kết quả, đó là thay thế nút JS trong chuỗi được mã hóa an toàn.
Nếu bạn đang ở trong xem nguồn chế độ, bằng cách nhập một số dòng JS như:

<script type="text/javascript"> 
// comment 
alert('Ciao'); 
</script> 

bạn sẽ thấy nó trả lại theo cách này khi trở lại soạn thảo văn bản giàu chế độ:

<!--{cke_protected}%3Cscript%20type%3D%22text%2Fjavascript%22%3E%0D%0A%2F%2F%20comment%0D%0Aalert('Ciao')%3B%0D%0A%3C%2Fscript%3E--> 

Tôi nghĩ rằng đó là một trong những cách dễ nhất và hiệu quả, vì RegExp phân tích cú pháp các nút JS không phức tạp.
Một ví dụ:

var pattern = /<script(\s+(\w+\s*=\s*("|').*?\3)\s*)*\s*(\/>|>.*?<\/script\s*>)/; 
var match = HTMLString.match(pattern); // array containing the occurrences found 

(Tất nhiên, để thay thế nút kịch bản bạn nên sử dụng phương pháp thay thế()).

Trân trọng.

+0

Trả lời cập nhật của bạn: có, nhiệm vụ xác thực phía máy chủ là bắt buộc, nhưng vấn đề bạn có thể muốn giải quyết trong môi trường phía máy khách là hành vi không chính xác của iframe mà người dùng có thể tiêm một số JavaScript đơn giản để làm điều gì đó được cho phép. Trải nghiệm thực tế của tôi về vấn đề này là với người dùng đã nhập bên trong iframe có thể chỉnh sửa một tập lệnh đơn giản để nhập biểu mẫu bên trong khung nội tuyến khác từ một tên miền khác, dẫn đến chuyển hướng của trang trình chỉnh sửa sang trang trống. Mặc dù iframe được nhập hoạt động hoàn hảo trong bản xem trước, trình chỉnh sửa không thể truy cập được sau khi chèn mã. –

4

Có, bản cập nhật của bạn là chính xác. Bạn phải giả định rằng bất kỳ đầu vào nào bạn nhận được từ người dùng đều có thể chứa các phần tử độc hại. Vì vậy, bạn phải xác nhận trên máy chủ trước khi chấp nhận đầu vào của họ :-)

19

HTML5 giới thiệu thuộc tính "sandbox" trên khung nội tuyến (nếu trống) sẽ vô hiệu hóa việc tải và thực thi javascript.

https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe#attr-sandbox

+0

Trong khi đây là giải pháp tôi đang tìm kiếm, lưu ý rằng nó làm nhiều hơn là chỉ vô hiệu hóa javascript như OP đang yêu cầu. [Xem tại đây để biết chi tiết (w3schools)] (http://www.w3schools.com/tags/att_iframe_sandbox.asp) – MikeThomson

+1

[liên kết tốt hơn] (https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe # attr-sandbox) [mozilla.org] – Damien

1

Bạn có thể đặt Content Security Policy như script-src 'tự' trong tiêu đề. CSP sẽ chặn bất kỳ tập lệnh nào khác ngoài các trang web của chúng tôi. Bằng cách này, chúng tôi có thể ngăn chặn bất kỳ tập lệnh nào từ khung nội tuyến thay đổi các yếu tố trong trang của chúng tôi.

Bạn có thể nhận được thêm thông tin từ đây http://www.html5rocks.com/en/tutorials/security/content-security-policy/

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