2011-09-30 35 views
17

Hiện tại Mozillas CSP có chặn thực thi Javascript from a bookmark theo mặc định không?Chính sách bảo mật nội dung có chặn các dấu trang không?

Có thể định cấu hình để làm như vậy không?

+0

Chỉ tò mò, tại sao bạn muốn vô hiệu hóa dấu trang? – ThiefMaster

+0

Tôi không chỉ lo lắng một số người khác có thể làm điều đó bởi vì họ không muốn có Javascript tiêm trên trang web đó. – PiTheNumber

+2

Luôn có những thứ như greasemonkey. Nếu ** người dùng ** quyết định rằng anh ta muốn tiêm javascript vào trang web sẽ chỉ ảnh hưởng đến bản thân thì không ai có quyền ngăn cản anh ta làm điều đó. – ThiefMaster

Trả lời

16

Tính đến năm 2017, câu trả lời là vẫn còn là một dứt khoát "có thể" - giống như khi câu trả lời này ban đầu được đăng tải trong năm 2011. Các specification nói rõ:

Chính sách được thực thi trên một tài nguyên không nên can thiệp với hoạt động của các tính năng tác nhân người dùng như tiện ích mở rộng, tiện ích mở rộng hoặc dấu trang.

Và đây thực sự là hành vi tôi thấy trong Chrome 61: bookmarklet sẽ chạy trên https://addons.mozilla.org/, một trang web mà có một chính sách bảo mật nội dung nghiêm ngặt mà không script-src: 'unsafe-inline'. Tuy nhiên, trong Firefox 56 bookmarklet sẽ không chạy trên trang web này và vi phạm CSP đang được báo cáo.

Có một cuộc thảo luận rất dài về vấn đề này trong số Firefox bug report, cụ thể là liên kết với một số similar discussion on the W3C spec. Vì vậy, bây giờ, bạn không thể thực sự dựa vào bookmarklets không bị ảnh hưởng bởi CSP. Bạn luôn có thể vô hiệu hóa CSP hoàn toàn, nhưng đó là một lớp bảo vệ quan trọng ít hơn cho bạn.

+0

Cảm ơn bạn đã thử nghiệm điều này! NHƯNG bạn chỉ có thể chuyển đổi CSP nếu bạn muốn. Mở about: config và đặt "security.csp.enable" thành "false". Vì vậy, bạn sẽ có thể chạy các tập tài liệu của riêng bạn anyway. – PiTheNumber

+3

@PiTheNumber: Câu trả lời của tôi đã nói rằng bạn có thể tắt CSP - và khuyên không nên làm như vậy. –

+0

Xin lỗi, tôi không thấy bạn chỉnh sửa khi tôi viết nhận xét. – PiTheNumber

5

Vâng, các khối CSP bookmarklets trong Mozilla Firefox. Có một số bug about it.

Tuy nhiên, bạn có thể khắc phục hạn chế này bằng cách tiêm mã JS vào một CSS stylesheet bên ngoài, như Top News Feed bookmarklet tôi làm:

CSS bên ngoài:

#topnewsfeed { font-family: '(function(){/*payload*/})()'; } 

Bookmarklet JS:

(function() { 
    var a = document.createElement("link"); 
    a.rel = "stylesheet"; 
    a.href = "//niutech.github.io/topnewsfeed/topnewsfeed.css"; 
    a.onload = function() { 
     var a = b.currentStyle ? b.currentStyle.fontFamily : document.defaultView.getComputedStyle(b, null).fontFamily; 
     eval(a.replace(/^["']|\\|["']$/g, "")); 
    }; 
    document.body.appendChild(a); 
    var b = document.createElement("div"); 
    b.id = "topnewsfeed"; 
    document.body.appendChild(b); 
})() 

Dấu trang tải một tệp CSS chứa mã JS, thêm phần tử được tạo kiểu bởi CSS này, đọc thuộc tính kiểu phần tử và eval mã.

+5

'Từ chối tải biểu định kiểu 'https: // /bookmarklet.css' vì nó vi phạm chỉ thị Chính sách bảo mật nội dung sau:" style-src 'self' 'unsafe-inline' 'unsafe-eval' assets-cdn.github .com ".' – Michael

0

Tôi đã tạo "sửa lỗi" xung quanh nơi làm việc cho vấn đề này bằng cách sử dụng một người dùng Greasemonkey (trong Firefox). Giờ đây, bạn có thể có dấu trang trên tất cả các trang CSP và https: //, cộng với dấu trang của bạn trong một tệp thư viện đẹp, dễ chỉnh sửa thay vì được phân tách riêng thành dấu trang.

Xem: https://groups.google.com/d/msg/greasemonkey-users/mw61Ynw5ORc/Gl_BNUhtSq0J

+0

Phương pháp này không hoạt động vì không thể thực thi dấu trang (bookmarklet =' unsafe-inline') – mems

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