6

Tôi gặp sự cố khi nhận được new Function để làm việc trong Công nhân Web. Tôi có một trang HTML để sinh ra một Web Worker. Web Worker này thực thi mã thông qua new Function(str). Tôi đang cố gắng sử dụng ứng dụng này trong ứng dụng Chrome được đóng gói, ứng dụng yêu cầu một trang sử dụng mã giống như eval được liệt kê rõ ràng dưới dạng trang hộp cát trong tệp kê khai.Bật 'Chức năng mới' trong Công nhân Web với CSP

Giờ đây, có hai lựa chọn:

  • Do danh sách trang được sandboxed. Nếu tôi làm như vậy, tôi có thể sử dụng new Function, nhưng tôi không thể sinh ra một Web Worker vì tôi không thể thực hiện bất kỳ yêu cầu nào (trang sandbox có một nguồn gốc duy nhất). new Worker(...) ném một số SECURITY_ERR.
    • new Function công trình trong sandbox
    • new Worker thất bại trong sandbox do nguồn gốc độc đáo
  • Đừng danh sách trang để được sandboxed. Nếu tôi làm như vậy, tôi có thể sinh ra một Web Worker, nhưng nhân viên không thể sử dụng new Function vì nó không phải là sandboxed. new Function(...) ném một số EvalError phàn nàn về việc sử dụng nó.
    • new Function thất bại trong phi sandbox do là eval -like
    • new Worker công trình phi sandbox

CSP của tôi là như sau:

sandbox allow-scripts script-src 'self' 'unsafe-eval'; object-src 'self' 

gì tôi có thể thế nào để có được new Function làm việc trong một Web Worker?

Trả lời

5

Có một kỹ thuật gọi là công nhân nội tuyến, tôi khuyên bạn nên sử dụng kỹ thuật đó.

  • Tạo một đối tượng Blob có chứa các mã nguồn cho người lao động
  • Chuyển đổi nó vào một "dataurl"
  • Khởi tạo người lao động với dataurl này

này được mô tả với ví dụ mã trên trang web đá HTML5 trong số WebWorkers tutorial của họ. Bằng cách này bạn có thể liệt kê trang web dưới dạng hộp cát, nhưng vì không cần phải thực hiện các yêu cầu bên ngoài, nên nó cũng hoạt động trong chế độ hộp cát.

+0

Hóa ra rằng URL 'dữ liệu:' không hoạt động vì các vấn đề cùng nguồn gốc, nhưng URL 'createObjectURL' từ các đốm màu (từ bài viết) hoạt động. Nó không phải là rất thuận tiện để inline toàn bộ kịch bản công nhân vào trang chính, nhưng nó có vẻ là cách duy nhất để làm cho nó hoạt động. Cảm ơn. – pimvdb

+0

Tôi có thể thấy bây giờ tôi đã sử dụng url dữ liệu thay vì url đối tượng trong câu trả lời, xin lỗi vì điều đó. Bạn có thể làm một bước xây dựng để làm cho nó thuận tiện hơn. – molnarg

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