Bahasa Indonesia

HTML, chmod, container dan cron

Alasan di balik empat utilitas: mengapa editor HTML memerlukan daftar yang diizinkan dan kotak pasir, mengapa huruf kapital S dalam string chmod penting, apa yang tidak dapat diungkapkan oleh perintah docker run dalam penulisan, dan dua aturan cron yang dapat diterapkan pada semua orang.

Editor HTML: daftar yang diizinkan, bukan filter

Editor menghasilkan HTML, dan HTML yang berasal dari kotak teks adalah vektor injeksi tertua yang pernah ada. Dua pertanyaan berbeda membingungkan di sini, jadi ada baiknya memisahkannya. Yang pertama adalah "dapatkah editor ini diakali dengan mengeluarkan markup yang menjalankan kode di halaman yang menampilkannya?" Yang kedua adalah "apakah ini cara aman untuk membersihkan HTML yang bermusuhan dari sumber yang tidak tepercaya?" Alat ini menjawab ya untuk pertanyaan pertama dan tidak untuk pertanyaan kedua, dan alat ini menyatakan demikian di panel daripada membiarkan Anda berasumsi sebaliknya.

Mekanismenya adalah daftar yang diizinkan. Daftar elemen diperbolehkan; setiap elemen lainnya dibuka bungkusnya, sehingga teksnya tetap ada dan tagnya tidak. Daftar atribut diperbolehkan per elemen; segala sesuatu yang lain dihilangkan, yang membuat setiap event handler tidak mungkin dilakukan dan bukan hanya diblokir. Nama atribut ditulis dengan huruf kecil sebelum pengujian tersebut, jadi oNeRrOr dan ONERROR adalah nama yang ditolak sama dengan onerror. Elemen yang isinya dianggap oleh parser HTML sebagai teks mentah — skrip, gaya, area teks, iframe, judul — akan dihapus bersama dengan kontennya, karena membukanya akan menempelkan sumber skrip ke dalam dokumen sebagai markup.

Alamat tautan mendapatkan ceknya sendiri. Nilainya didekodekan oleh entitas dan dihilangkan spasinya serta karakter kontrolnya sebelum skemanya dibaca, karena itulah yang dilakukan browser saat bernavigasi: javascript:alert(1) dan jav ascript:alert(1) keduanya mencapai tempat yang sama. Hanya alamat http, https, mailto, tel, ftp dan relatif yang bertahan. Referensi karakter yang tidak dapat diselesaikan oleh alat ini — : adalah referensi klasik — menyebabkan seluruh alamat ditolak alih-alih diteruskan, karena filter yang memahami masukan lebih sedikit daripada yang dipahami browser adalah filter berlubang.

Tidak ada tombol gambar, dan img tidak ada dalam daftar yang diizinkan. Tag gambar yang diizinkan adalah permintaan keluar dari mana pun dokumen berakhir, dan muncul kesalahan. Bagi editor yang memproduksi prosa, itu juga tidak layak.

Pertahanan yang tidak bergantung pada kesempurnaan ini adalah pratinjau. Itu dirender dalam iframe dengan atribut sandbox yang tidak memberikan apa pun — tanpa skrip, tanpa formulir, tanpa akses asal yang sama. Jika suatu payload berhasil lolos dari daftar yang diizinkan, browser akan tetap menolak untuk mengeksekusinya di sana. Itu adalah jaminan struktural, bukan janji tentang kode etik kita.

Batasan jujurnya: ini adalah pembersih berbasis string, bukan parser HTML5 lengkap. Diferensial parser — masukan saat browser membuat pohon yang berbeda dari yang dilakukan tokeniser ini — merupakan kelemahan yang diketahui dari setiap sanitiser yang dibuat dengan cara ini. Untuk keluaran yang Anda hasilkan sendiri di editor ini tidak masalah. Untuk membersihkan HTML yang datang dari orang asing, gunakan pembersih yang dijalankan melawan parser asli, di server yang Anda kendalikan.

Chmod: huruf kapital mewakili keseluruhan pesan

Mode file Unix terdiri dari dua belas bit: tiga bit izin untuk masing-masing pemilik, grup, dan lainnya, ditambah setuid, setgid, dan bit lengket. Bentuk oktal adalah pembacaan langsung dari bit-bit tersebut, itulah sebabnya 4 + 2 + 1 = 7 berarti membaca, menulis, dan mengeksekusi.

Bentuk simbolik yang ls cetak adalah dimana bit-bit khusus menjadi menarik, karena tidak mendapatkan kolomnya sendiri. setuid menggantikan karakter eksekusi pemilik, setgid menggantikan karakter eksekusi grup, dan sticky menggantikan karakter eksekusi lainnya. Hurufnya adalah huruf kecil jika bit eksekusi yang mendasarinya juga disetel, dan huruf UPPER jika tidak.

Jadi 4755 adalah rwsr-xr-x — program setuid yang dapat dijalankan — sedangkan 4644 adalah rwSr--r--, file setuid yang tidak dapat dijalankan oleh siapa pun. Huruf kapital S adalah sistem yang memberi tahu Anda bahwa bit itu inert, dan ini hampir selalu merupakan kesalahan, bukan pilihan. Hal yang sama berlaku untuk 1644, yang menunjukkan rw-r--r-T: bit lengket pada file biasa di mana bit eksekusi lainnya jelas, yang pada kernel modern tidak melakukan apa pun.

Dua perbedaan lagi yang perlu diluruskan. String sembilan karakter yang ls cetak bukanlah argumen yang digunakan chmod: chmod menginginkan daftar tugas seperti u=rwx,g=rx,o=rx,u+s. Dan bit yang sama memiliki arti yang berbeda pada direktori dibandingkan pada file — eksekusi berarti "boleh masuk dan melintasi", setgid berarti "file baru mewarisi grup ini", dan bit lengket berarti "siapa pun boleh membuat, hanya pemiliknya yang boleh menghapus", itulah alasannya /tmp adalah 1777.

buruh pelabuhan dijalankan untuk menulis: parsing, dan apa yang tidak dikonversi

Konverter membagi perintah dengan tokeniser yang peka terhadap kutipan yang ditulis untuk alat ini. Tidak ada yang dieksekusi, dievaluasi, atau diserahkan ke shell. Perintah yang berisi backticks, $(...) atau titik koma dibaca sebagai karakter literal, karena satu-satunya hal yang dilakukan alat ini dengan masukan Anda adalah membacanya.

Kebanyakan flag dipetakan dengan rapi: port, volume, lingkungan, label, kebijakan mulai ulang, kemampuan, health check, batasan sumber daya, DNS dan host tambahan semuanya memiliki kunci penulisan dengan arti yang sama. Volume yang diberi nama dan jaringan yang ditentukan pengguna memerlukan deklarasi tingkat atas serta referensi layanan, sehingga outputnya membawa satu — dengan eksternal: true pada jaringan, karena docker jaringan yang dijalankan dapat bergabung dengan yang sudah ada.

Beberapa flag tidak memiliki padanan penulisan, dan di sinilah konverter biasanya gagal secara diam-diam. --rm bukan properti layanan: layanan penulisan tidak dihapus saat keluar. -d menjelaskan cara Anda memanggil CLI, bukan layanannya. --link adalah warisan, --mount memerlukan bentuk yang panjang, alat ini tidak dapat menulis, --gpus tergantung pada driver Anda. Masing-masing menghasilkan peringatan bernama, bukannya menghilang. Bendera yang tidak dikenal juga menghasilkan peringatan, dan dianggap tidak bernilai, karena menebak bahwa bendera tersebut memerlukan peringatan akan mengubah nama gambar Anda menjadi sebuah argumen dan menghasilkan file yang salah.

Outputnya tidak membawa kunci versi tingkat atas:. Compose v2 mengabaikannya dan versi saat ini memperingatkannya; itu sudah usang sejak Spesifikasi Tulis menggantikan versi format file lama.

Mengutip bukanlah kosmetik. Pemetaan port yang ditulis sebagai 8080:80 tanpa tanda kutip dibaca sebagai angka oleh parser YAML 1.1, dan ya, tidak, hidup dan mati adalah boolean dalam dialek yang sama. Segala sesuatu yang mungkin salah dibaca akan dikutip; apa pun yang terbaca dengan jelas sebagai string dibiarkan saja, sehingga file tetap dapat dibaca.

Cron: dua aturan yang berlaku untuk semua orang

Yang pertama adalah aturan harian. Ketika hari dalam sebulan dan hari dalam seminggu disetel ke selain *, cron menjalankan pekerjaan ketika EITHER cocok — bukan ketika keduanya cocok. Jadi 0 0 13 * 5 adalah "tengah malam pada tanggal 13, dan tengah malam setiap hari Jumat", yaitu kira-kira lima kali sebulan, bukan "Jumat tanggal 13", yaitu satu atau dua kali setahun. Generator memperingatkan setiap kali kedua bidang dibatasi, dan kalimat yang ditulisnya mengatakan "atau" daripada "dan".

Yang kedua adalah zona waktu. Cron menggunakan zona mesin yang dijalankannya, yang sering kali UTC di server dan hampir tidak pernah menjadi zona orang yang menulis crontab. Oleh karena itu, pratinjau yang dijalankan berikutnya menanyakan zona mana yang akan digunakan daripada mengasumsikan zona Anda. Waktu dihitung sebagai waktu jam dinding di zona tersebut, sehingga pekerjaan sehari-hari tetap pada waktu lokal yang sama selama pergantian musim panas, bukannya menyimpang satu jam — dan waktu lokal yang tidak ada, dalam jam yang dilewati setiap musim semi, tidak dimasukkan dalam daftar, karena cron juga tidak akan berjalan.

Sintaksnya sendiri kecil: bintang, angka, rentang a-b, daftar a,b,c, langkah */n atau ab/n, dan nama bulan dan hari JAN-DEC Dan SUN-SAT. Keduanya 0 Dan 7 maksudnya hari Minggu. Nilai telanjang dengan langkah, seperti 5/15 di kolom menit, berarti "dari 5 sampai akhir rentang, setiap 15", yang satu menit 5, 20, 35 Dan 50.

Validasi sengaja dilakukan dengan ketat. 60 * * * * ditolak karena menit berhenti pada 59; * * * * 8 ditolak karena kolom hari berhenti di 7; */0 * * * * ditolak karena langkah nol tidak menghasilkan apa-apa. Enam bidang biasanya berarti ekspresi Quartz atau systemd yang bidang pertamanya adalah detik, jadi kesalahannya mengatakan bahwa alih-alih hanya menghitung. Jadwal yang valid secara sintaksis tetapi tidak pernah dapat berjalan — 0 0 30 2 * meminta tanggal 30 Februari — diterima dan ditandai, karena menolaknya akan salah dan berdiam diri akan lebih buruk.

Apa yang terjadi pada apa yang Anda tempel

  • Setiap konversi, hash, decode dan diff berjalan di tab browser Anda. Tidak ada masukan yang diunggah, dicatat atau disimpan di server, karena tidak ada server yang terlibat setelah halaman dimuat.
  • Hash berasal dari implementasi Web Crypto milik browser, dan UUID dari generator acak yang aman secara kriptografis. Tidak ada yang melibatkan panggilan jaringan.
  • Tidak ada yang Anda ketikkan yang ditulis ke penyimpanan lokal atau cookie. Memuat ulang halaman akan membuangnya; menutup tab akan membuangnya.
  • Analisis seluruh situs hanya berjalan pada host produksi kanonik yang dikonfigurasi dan diungkapkan dalam Kebijakan Privasi; host lokal dan pratinjau menolaknya. Nilai, token, URL, dan konten file yang ditempelkan dikecualikan dari peristiwa analisis ToolAcre sendiri. Periklanan dinonaktifkan dalam konfigurasi saat ini.
  • Artinya: kunci JWT atau API adalah kredensial aktif. Kebiasaan yang aman adalah jangan pernah menempelkannya ke halaman web yang tidak Anda tulis, betapapun dapat dipercayanya klaim tersebut — termasuk yang ini.

Pertanyaan

Bisakah saya menempelkan HTML yang tidak bersahabat ke dalam editor untuk membersihkannya?

Anda dapat menempelkannya, dan tidak ada yang akan dijalankan: penangan tempel membersihkan payload clipboard sebelum apa pun dimasukkan, dan pratinjaunya adalah iframe sandbox tanpa skrip yang diizinkan. Namun jangan gunakan hasilnya sebagai kontrol keamanan untuk masukan yang tidak tepercaya. Ini adalah daftar yang diizinkan berbasis string untuk keluaran satu editor, bukan filter XSS tujuan umum, dan parser browser dapat menjangkau pohon yang berbeda dari tokeniser seperti ini. Untuk konten yang tidak tepercaya, lakukan sanitasi di server dengan parser HTML5 yang sebenarnya.

Mengapa editor menghapus gambar dan tabel saya?

Karena mereka tidak termasuk dalam daftar yang diizinkan. Gambar adalah permintaan keluar dan permukaan kesalahan; tabel berada di luar kegunaan editor ini. Konten teksnya bertahan, tagnya tidak. Ini adalah daftar yang diizinkan yang berfungsi, bukan bug — namun ini berarti alat ini bukan alat yang tepat untuk mengedit dokumen rumit yang sudah ada.

Mengapa chmod 4644 menunjukkan huruf kapital S?

Karena setuid disetel dan bit eksekusi pemiliknya tidak. Huruf kapital berarti bit khusus tidak memiliki tindakan apa pun: ini adalah file setuid yang tidak dapat dieksekusi. Huruf kecil s berarti kedua bit disetel. Aturan yang sama memberi Anda S untuk setgid dan T untuk bit lengket, dan membalikkannya adalah satu-satunya kesalahan paling umum dalam mode kalkulator.

Apakah konverter buruh pelabuhan menjalankan perintah saya?

Tidak, dan itu tidak bisa. Perintah ini dibagi oleh tokeniser yang memahami kutipan dan tidak ada yang lain. Tidak ada eval, tidak ada shell, tidak ada proses anak — halaman tidak memiliki cara untuk memulainya. Semua yang Anda tempel akan tetap ada di tab.

Mengapa konverter memberikan peringatan dan bukannya hanya menjatuhkan tanda yang tidak dapat ditanganinya?

Karena file penulisan yang diam-diam melakukan kurang dari perintah asalnya lebih buruk daripada tidak ada keluaran sama sekali: Anda mengetahuinya di produksi. Setiap bendera yang tidak terwakili diberi nama, dan apa yang harus dilakukan untuk mengatasinya. Jika Anda tidak melihat peringatan, tidak ada yang hilang.

Mengapa cron berikutnya berjalan berbeda dari apa yang dilakukan server saya?

Hampir selalu zona waktu. Cron menggunakan zona mesin yang menjalankannya; pratinjau menggunakan zona yang Anda pilih di dropdown. Setel ke zona server Anda — sering kali UTC — dan mereka akan setuju. Kandidat lainnya adalah aturan hari: jika hari dalam bulan dan hari dalam seminggu ditetapkan, cron akan berjalan pada keduanya, dan hal ini lebih sering terjadi daripada yang diinginkan kebanyakan orang.

Keterbatasan

  • Sanitiser HTML adalah daftar yang diizinkan untuk keluaran editor ini, diimplementasikan sebagai tokeniser string, bukan parser HTML5 penuh. Ini bukan filter XSS untuk tujuan umum dan tidak boleh digunakan sebagai filter.
  • Editor tidak memiliki gambar, tabel, warna, atau kontrol font, dan tidak ada cara untuk menambahkannya: semua yang berada di luar daftar yang diizinkan akan dihapus.
  • Permukaan pengeditan menggunakan document.execCommand, yang tidak digunakan lagi dan tidak ada penggantinya. Browser masih mendukungnya; perilakunya sedikit berbeda di antara keduanya, terutama seputar penyusunan daftar.
  • Kalkulator chmod hanya mencakup dua belas bit izin saja. Daftar kontrol akses, atribut yang diperluas, konteks SELinux, aritmatika umask, dan ACL Windows semuanya berada di luar cakupan.
  • Konverter buruh pelabuhan menerjemahkan satu perintah docker run menjadi satu layanan. Itu tidak membaca Dockerfiles, tidak menyelesaikan gambar, dan tidak dapat mengekspresikan --mount, --gpus, --device, --link atau --volumes-from; masing-masing menghasilkan peringatan bernama.
  • Bendera yang tidak dikenali oleh konverter dianggap tidak mempunyai nilai. Jika tanda tersebut benar-benar mengambil salah satunya, nilainya akan salah dibaca — peringatannya menyatakan demikian, dan menghapus tanda tersebut adalah solusinya.
  • Generator cron hanya membaca format crontab lima bidang. Ekspresi Quartz dan systemd enam bidang, @reboot, dan L, W, #, dan ? operator ditolak daripada menebak-nebak.
  • Waktu pengoperasian berikutnya berasal dari database zona waktu browser melalui Intl. Itu hanyalah pratinjau, bukan jaminan: mesin yang menjalankan cron mungkin memiliki zona berbeda, versi database berbeda, atau daemon yang tidak berjalan ketika waktunya tiba.