2012-06-08 51 views
11

Tôi đang cố gắng sử dụng MathJax như một phần của ứng dụng web của chúng tôi sử dụng khá nghiêm ngặt Content Security Policy (CSP). Vấn đề là MathJax được mã hóa để sử dụng eval() [chính xác, dưới dạng Function()] không được CSP coi là an toàn theo mặc định.CSP: Cách cho phép không an toàn-eval cho một tiền tố URI cụ thể (Firefox)

Tôi đang sử dụng tiêu đề CSP sau hiện:

X-Content-Security-Policy: allow 'self'; img-src *; media-src *; frame-src *; font-src *; frame-ancestors 'none'; style-src *; report-uri '/:save-csp-violation'; 

nào gây ra đang MathJax 2.0 thất bại vì nó sử dụng Function(). Tôi đã cố gắng cho phép không an toàn-eval (tức là Function()) chỉ cho MathJax nằm trong cùng một nguồn gốc dưới đường dẫn /:static/math/. Để làm điều đó, tôi cố gắng thêm

unsafe-eval '/:static/math/*' 

để làm cho tiêu đề đầy đủ giống như

X-Content-Security-Policy: allow 'self'; img-src *; media-src *; frame-src *; font-src *; frame-ancestors 'none'; style-src *; report-uri '/:save-csp-violation'; unsafe-eval '/:static/math/*' 

nhưng tôi vẫn không thể Firefox 13.0 để chạy mã. Tôi nhận được một thông báo lỗi Firefox Web Console (nằm trong Tools - Web Developer):

[10:09:59.072] call to Function() blocked by CSP @ http://localhost:8080/:static/math/2.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML:29 

Tuy nhiên, tôi không nhận được một báo cáo CSP đến 'báo cáo-uri'. (Như bạn thấy, tôi hiện đang chạy thử nghiệm thông qua cổng localhost tùy chỉnh mà không có SSL, trong trường hợp tạo nên sự khác biệt. Dấu hai chấm trước static không phải là lỗi đánh máy, tôi đặt trước tất cả các phần đường dẫn bắt đầu bằng dấu hai chấm để sử dụng nội bộ ứng dụng, tất cả nội dung của người dùng có thể tự do xác định các URL khác.)

Việc tôi sử dụng thuộc tính unsafe-eval không chính xác hoặc không thể cho phép không an toàn chỉ cho tập con 'tự'? Mục đích là để cho phép không an toàn-eval chỉ cho cùng một tiền tố đường dẫn gốc /:static/math, thực thi mã CSP JS nghiêm ngặt cho 'self' và không có mã JS cho bất kỳ phương pháp nào khác.

Trả lời

13

Như vậy là nhiều vấn đề: tiêu đề

  1. CSP không làm việc theo cách này. CSP chỉ có mức độ chi tiết của một kết hợp máy chủ + cổng đơn (nguồn gốc). Nếu bạn không thể cho phép bất kỳ tập lệnh nào trong máy chủ lưu trữ của mình có số unsafe-eval, thì không có tập lệnh nào có thể có tập lệnh đó. Cách giải quyết duy nhất có thể là không sử dụng tập lệnh yêu cầu unsafe-eval (chúc may mắn viết một bản thay thế MathJax của chính bạn).

  2. Cú pháp allow là phiên bản Mozilla cũ và không nên sử dụng. Cú pháp hiện tại là để nói default-src theo sau là tên lược đồ hoặc tên máy chủ hoặc nguồn gốc được phép làm nguồn của mọi thứ và sau đó ghi đè giá trị mặc định cho mỗi loại phụ (ví dụ: script-src) khi cần. Một số nguồn có thể hỗ trợ các từ khóa nguồn bổ sung ngoài self. Ví dụ: script-src hỗ trợ unsafe-eval có nghĩa là bất kỳ tập lệnh nào được phép thực thi được phép chạy eval() hoặc Function() và unsafe-inline có nghĩa là bất kỳ phần đánh dấu nào có thể hỗ trợ một số loại tập lệnh nội tuyến đều được phép thực thi . Cho phép unsafe-eval có thể chấp nhận được nhưng unsafe-inline là khá nhiều không đi với script-src (nếu không, bạn không nên bận tâm với CSP ở tất cả).

  3. Cú pháp đúng cho script-src như sau:

    script-src 'self' 'unsafe-inline' 
    
  4. MathJax cũng sử dụng phong cách nội tuyến thuộc tính nên sau đây là cần thiết (trừ khi đã được cho phép) hoặc MathJax sẽ nhấn Exception s trong khi cố gắng để làm cho toán học:

    style-src 'self' 'unsafe-inline' 
    

    Không thể sử dụng CSP để cho phép JS chèn thuộc tính kiểu và không có thuộc tính kiểu đã được chèn vào nguồn HTML để có hiệu lực.

  5. Dường như Firefox 13.0 (ít nhất) không ngay lập tức "gọi về nhà" trong trường hợp vi phạm CSP. Hầu hết các báo cáo vi phạm được gửi một thời gian sau sự kiện. Chrome dường như tích cực hơn nhiều với việc gửi báo cáo, điều này sẽ giúp thử nghiệm dễ dàng hơn một chút. Theo kinh nghiệm của tôi, Firefox không phải lúc nào cũng gửi báo cáo CSP - nó có thể sử dụng một số loại heuristic để không gửi tin nhắn lặp đi lặp lại.

Phần thưởng: Để hỗ trợ webkit, bạn phải lặp lại cấu hình với tiêu đề HTTP X-WebKit-CSP.

Cuối cùng, để làm cho MathJax làm việc với Content-An ninh-Bảo vệ, bạn không cần sau tiêu đề (giả sử bạn đang phân phối thư viện MathJax một mình, thay vì thông qua MathJax CDN):

X-Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; options eval-script 
X-WebKit-CSP: default-src 'self'; script-src 'self' 'unsafe-eval'; style-src 'self' 'unsafe-inline' 
Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-eval'; style-src 'self' 'unsafe-inline' 

đây thuộc tính options là bắt buộc đối với Firefox 13.0 và ít hơn. Tôi đã báo cáo vấn đề CSP cho MathJax tại https://github.com/mathjax/MathJax/issues/256.

+1

Firefox 13.0 cũng chứa một lỗi hoặc thiếu tính năng mà tiêu đề CSP của nó không khớp với biến thể W3C. Xem lỗi tại đây: https://bugzilla.mozilla.org/show_bug.cgi?id=746978 –

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