2010-10-13 34 views
5

Chúng tôi có một ứng dụng web nội bộ hoạt động như một kho lưu trữ mà người dùng có thể tải lên các tệp. Các tệp này có thể là bất kỳ định dạng nào, bao gồm các trang HTML. Chúng tôi đã thử nghiệm hơn trong IE8, nếu bạn tải xuống tệp HTML chứa một số tập lệnh cố gắng truy cập cookie của bạn và sau khi tải xuống, bạn chọn tùy chọn "Mở", tập lệnh thực thi và nhận thông tin cookie của bạn mà không vấn đề.Làm cách nào để tránh XSS trong tải xuống HTML?

Thực ra, tập lệnh đó có thể sử dụng đối tượng XmlHttpRequest để gọi máy chủ và thực hiện một số thao tác độc hại trong phiên của người dùng đã tải xuống tệp.

Có cách nào để tránh điều này không? Chúng tôi đã thử nghiệm rằng cả Chrome và Firefox đều không cho phép điều này xảy ra. Làm cách nào để tránh hành vi này trong bất kỳ trình duyệt nào, bao gồm IE8?

+2

"Mở" thực sự làm gì? Hiển thị trang trong trình duyệt? Nếu có, URL của trang sẽ xảy ra khi nào? – bzlm

+0

@ bzlm: Giống như bất kỳ tệp đính kèm nào; nếu bạn buộc trình duyệt nhắc cửa sổ tải xuống (có bố cục nội dung), bạn vẫn có thể nhấp vào mở và mở bằng url được sử dụng để tải nó, hiển nhiên trên cùng tên miền với cookie của anh ấy, do đó đề xuất của tôi về chạy (tải xuống) trên miền thay thế. –

+0

@bzlm đang đi đúng hướng: Nếu bạn mở một tệp HTML cục bộ, nó sẽ không thể truy cập cookie, cũng như không đưa ra các yêu cầu Ajax, đến một máy chủ từ xa do chính sách miền đơn. Chỉ khi nó được mở trực tiếp trên máy chủ có thể. –

Trả lời

5

Không cho phép tải lên nội dung không xác định. Đó là một ý tưởng khủng khiếp.

Một "giải pháp" tiềm năng có thể chỉ lưu trữ các video tải lên không đáng tin cậy trên tên miền không có bất kỳ cookie nào và người dùng không liên kết bất kỳ tin tưởng nào theo bất kỳ cách nào. Đây sẽ là một "giải pháp", nhưng chắc chắn không phải là một giải pháp lý tưởng.

Một số tùy chọn thực tế hơn có thể là quy trình dựa trên ủy quyền, trong đó mỗi tệp trải qua quá trình đánh giá tự động và sau đó xác nhận thủ công giai đoạn làm sạch/phân tích tự động.

Tất cả trong tất cả mọi thứ, đó là một ý tưởng rất xấu để cho phép công chúng để làm điều này.

+1

+1 để lưu trữ video tải lên trên miền khác và khái niệm chung rằng điều này luôn nguy hiểm –

+0

Chúng tôi sẽ xem xét tùy chọn tải xuống tệp từ một miền khác và sẽ theo dõi hệ thống để xem liệu chúng tôi có buộc phải từ chối bất kỳ tải lên nguy hiểm nào. cảm ơn rất nhiều về sự giúp đỡ của bạn. –

+0

[GitHub release] (https://github.com/cirosantilli/test/releases/tag/3.0) cho phép bất kỳ phần mở rộng nào và dường như sử dụng giải pháp miền thông qua S3. Dropbox cũng cho phép các kiểu tập tin tùy ý. –

1

Nếu bạn thực sự cần người dùng tải lên tệp HTML, bạn nên đảm bảo tệp HTML trong thư mục này được phân phát bằng văn bản/văn bản kiểu mime thay vì văn bản/html hoặc tương tự.

Điều này sẽ ngăn các tệp được mở thực thi tập lệnh trong trình duyệt. Nếu bạn đang sử dụng apache, hãy xem chỉ thị AddType.

+0

Đây là một gợi ý hay và có thể làm điều này. Tôi vẫn muốn được quan tâm về việc phục vụ nội dung từ cùng một tên miền, nhưng tôi nghĩ rằng điều này có lẽ nên được thực hiện bất kể. –

+0

Cẩn thận với nội dung đánh hơi. Bởi vì Apache tàu với 'text/plain' theo mặc định cho các tệp không xác định, trình duyệt buộc phải xử lý' text/plain' làm lời mời đoán loại thực tế. – Kornel

4

Đó thực sự là ý tưởng tồi từ quan điểm bảo mật. Tuy nhiên, nếu bạn muốn thực hiện điều này, hãy bao gồm tiêu đề phản hồi HTTP Content-disposition: attachment Nó sẽ buộc trình duyệt tải xuống tệp thay vì mở tệp. Trong Apache, nó được thực hiện bằng cách thêm Header set Content-disposition "attachment" vào tệp .htaccess.

Lưu ý rằng ý tưởng tồi là chỉ thêm Content-type: text/plain như đã đề cập trong một trong các câu trả lời, vì nó sẽ không hoạt động cho Internet Explorer. Khi IE nhận được tệp có tiêu đề kiểu văn bản/văn bản thuần túy, nó sẽ bật trình nén MIME cố gắng xác định loại nội dung thực của tệp (vì một số máy chủ gửi tất cả các tệp có văn bản/đồng bằng). Trong trường hợp nó đáp ứng mã HTML bên trong một tệp, nó sẽ buộc trình duyệt phân phát tệp dưới dạng văn bản/html và hiển thị nó.

+0

[Bài đăng trên blog này] (http://i8jesus.com/?p=64) nói rằng chỉ 'Nội dung-Bố cục' là không đủ, nhưng tôi không biết đủ để nói mức độ tin cậy của nó và nếu vẫn áp dụng. –

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