Bagaimana cara menonaktifkan CSP di Firefox hanya untuk bookmarklet?

26

Hari ini saya perhatikan bahwa saya tidak dapat menjalankan bookmarklet di https://github.com/ karena pembatasan Kebijakan Keamanan Konten (CSP). Apakah ada cara untuk menonaktifkan CSP di Firefox hanya untuk bookmarklet, dan tidak semua yang lain?

Saya perhatikan security.csp.enableopsi di about:config, tapi ini akan menonaktifkan CSP sepenuhnya. Pesan berikut dicatat ke konsol saat mengaktifkan bookmarklet:

Timestamp: 04/22/2013 02:39:05 PM
Warning: CSP WARN:  Directive inline script base restriction violated

Source File: https://github.com/
Line: 0
Source Code:
javascript:...
Lekensteyn
sumber

Jawaban:

8

Anda dapat mencoba mengubah bookmarklet Anda menjadi skrip pengguna GreaseMonkey . Mereka berjalan di lingkungan istimewa dan tidak tunduk pada CSP.

Namun tentu saja maksud skrip pengguna dan bookmarklet berbeda - skrip pengguna berjalan secara otomatis saat bookmarklet diminta. Anda dapat menghindari hal ini misalnya dengan membuat a <button>dalam skrip pengguna, menambahkannya ke halaman, dan mengatur onclickpendengar acara pada tombol itu untuk memecat kode bookmarklet.

Kode harus seperti ini:

// ==UserScript==
// @name            Name
// @description     Description
// @version         0.1
// @namespace       example.Lekensteyn
// @grant           none
// @include         http*://github.com/*/*/commit/*
// ==/UserScript==

var myBookmarklet = function () {
    // here goes the code of the bookmarklet
};

var newButton = document.createElement('button');
newButton.innerHTML = 'Execute my bookmarklet';

newButton.addEventListener('click', function(evt) {
    myBookmarklet();
});

document.getElementById('someElement').appendChild(newButton);

Diambil hampir secara harfiah dari skrip pengguna saya yang juga menargetkan GitHub. Anda dapat men-debug debugger;skrip pengguna di Firebug menggunakan kata kunci dalam skrip.

Perhatikan bahwa Firebug sendiri untuk saat ini juga tunduk pada CSP, jadi Anda tidak dapat mis. Mengeksekusi kode di konsol (tetapi Anda dapat memeriksa skrip pengguna Anda dalam mode "read-only"). Ini sedang dirawat di bug ini .

jakub.g
sumber
1
Fitur berdasarkan permintaan sangat penting. Saya memiliki bookmarklet yang menyisipkanare eval-textarea cepat dengan beberapa fitur yang tidak mengisi sebagian besar halaman, satu untuk membuat kode QR untuk halaman saat ini dan beberapa bagian kecil lainnya. Itu tidak spesifik GH. Kekuatan bookmarklet adalah mereka dapat dibuat dan dihapus dengan sangat mudah. GreaseMonkey sudah diinstal, tetapi itu tidak akan menyelesaikan masalah CSP. Terima kasih atas sarannya, mungkin solusi untuk Firebug juga akan bermanfaat bagi bookmarklet.
Lekensteyn
4
Sayangnya perbaikan Firebug hanya akan memperbaiki Firebug itu sendiri. Dari entri blog Github di CSP : Seperti yang dijelaskan oleh spesifikasi CSP, bookmarklet browser tidak boleh terpengaruh oleh CSP. (..) Tapi, tidak ada browser yang mendapatkan ini dengan benar. Semua menyebabkan pelanggaran CSP dan mencegah bookmarklet berfungsi. Mungkin Anda harus menyelidiki kasus ini lebih teliti dan melaporkan masalah pada Bugzilla.
jakub.g
2
BTW, Anda dapat menggunakan GM_registerMenuCommand untuk melakukan pemanggilan fungsi berdasarkan permintaan. Jangan lupa @grant GM_registerMenuCommand. Ia menambahkan entri ke menu Greasemonkey, dapat diakses di bawah (GM logo) > User Script Command.... Dengan begitu Anda dapat dengan mudah mengkonversi bookmarklet Anda menjadi skrip pengguna.
jakub.g
Saya tidak mengerti ... membuat tombol pada halaman untuk memuat kode ketika diklik tidak berfungsi, itu masih melempar pengecualian CSP
Michael
7

Github mengatakan bahwa itu harus bekerja sesuai dengan spesifikasi, tetapi tidak ada browser yang melakukannya dengan benar:

https://github.com/blog/1477-content-security-policy#bookmarklets

Anda harus membuka bug untuk peramban favorit Anda untuk masalah ini, atau memilihnya:

cweiske
sumber
2
Sebagai catatan, ada bug Firefox lain yang khusus untuk fungsionalitas bookmarklet dasar (kecil kemungkinannya untuk macet dalam diskusi): bugzilla.mozilla.org/show_bug.cgi?id=1478037
djpohly
Untuk menyelamatkan yang lainnya klik, bug 1478037 yang disebutkan oleh @djpohly dalam komentar di atas adalah tentang membiarkan bookmarklet untuk dijalankan selama mereka tidak memuat sumber daya eksternal.
Waldyrious
1

Banyak jawaban merekomendasikan skrip pengguna (seperti TamperMonkey atau GreaseMonkey) tetapi saya ingin mengingat, bahwa beberapa halaman dimasukkan daftar hitam karena alasan ekstensi ini. (Tentu, Anda dapat mengesampingkan daftar hitam, tetapi para devs telah memikirkan keamanan dan mengunci halaman-halaman ini).

Misalnya, saya ingin menggunakan bookmarklet untuk dengan cepat pergi ke ReviewMeta dari sembarang daftar Amazon, tetapi Amazon memblokir sumber skrip yang tidak aman (pembaruan: tidak diblokir, tetapi saya tidak memiliki skrip aktif, itu memalukan). Ekstensi skrip pengguna secara daftar hitam di situs perbankan dan belanja secara default untuk mencegah skrip pengguna yang berbahaya diinstal / digunakan.

(PS Ini bukan jawaban sendiri, tetapi saya pikir akan sangat berguna untuk mengingat hal ini sebelum mendapatkan skrip pengguna hanya untuk menemukan halaman tersebut masuk daftar hitam dan ragu-ragu karena tidak memasukkannya ke daftar hitam.)

DBX12
sumber
0

Saya telah membuat "perbaikan" untuk masalah ini dengan menggunakan skrip pengguna Greasemonkey (di Firefox). Anda sekarang dapat memiliki bookmarklet di semua CSP dan https: // situs, ditambah bookmarklet Anda dalam file perpustakaan yang bagus, mudah diedit dan bukannya dimasukkan secara individual ke dalam bookmark.

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

William Donnelly
sumber
-1

Jika Anda ingin menjalankan bookmarklet di situs web yang mendukung CSP di Firefox, Anda dapat menggunakan lembar gaya CSS, lihat jawaban saya di StackOverflow .

niutech
sumber