Mampu mengurai HTML bukan berarti bisa menampilkan HTML dengan aman
Artikel ini mengklarifikasi bahwa BeautifulSoup hanya diposisikan sebagai parser, bukan pembersih keamanan, dan menunjukkan cara menghapus kejadian skrip dan URL berbahaya melalui strategi daftar putih. Memberikan kode tutorial pembersihan memori yang dapat dijalankan, kasus uji batas, dan kriteria pemicu tinjauan manual, dan menjelaskan cara yang benar untuk mengintegrasikan OmniDoc ke dalam alur kerja terjemahan dokumen untuk mengevaluasi kemampuan pemrosesan konten campuran.
BeautifulSoup berhasil diurai, tetapi bukan berarti HTML-nya aman. Untuk pengembang dan tim dokumentasi yang perlu memproses HTML eksternal, artikel ini menjelaskan mengapa parser dan pemurni harus dilihat secara terpisah, dan memberikan serangkaian ide pembersihan daftar putih, kasus pengujian, dan kriteria peninjauan manual.
Contoh dalam artikel ini adalah sampel sintetis dan hanya digunakan untuk mendemonstrasikan metode pemrosesan. Kode telah diperiksa sampelnya di lingkungan yang terisolasi, namun ini tidak berarti kode tersebut dijamin berfungsi dengan semua file atau produk asli. Sebelum memproses dokumen-dokumen penting, harap menyimpan aslinya dan kemudian memeriksanya satu per satu sesuai dengan batasan dan item penerimaan dalam dokumen tersebut.
Kesimpulan dalam satu kalimat: Setelah analisa, pembersihan harus dilakukan secara terpisah
Atribut berbahaya seperti <img src=x onerror=alert(1)> tetap utuh dalam keluaran setelah BeautifulSoup menguraikannya. Pembersihan harus menjadi lapisan logika bisnis tambahan yang diterapkan setelah penguraian.
| situasi Anda | Praktik yang direkomendasikan | alasan |
|---|---|---|
| Cukup ekstrak atau ubah data dari HTML | Menggunakan BeautifulSoup untuk menguraikan dan melintasi | BS4 dirancang untuk mengekstrak dan memodifikasi struktur pohon |
| Untuk menyematkan HTML eksternal ke dalam sistem internal atau menerjemahkan hasil kerja | Tambahkan lapisan pembersih daftar putih setelah penguraian | BS4 tidak menentukan apakah tag dan atribut aman |
Menemukan properti seperti onclick, javascript:, atau data: | Hapus atribut atau biarkan href kosong | Properti ini mungkin membawa konten yang dapat dieksekusi |
| Siap untuk produksi | Gunakan perpustakaan sanitasi khusus (seperti bleach) dan eksternalkan daftar putih | Kode sampel tidak mencakup detail seperti atribut multi-nilai, normalisasi kasus, pengkodean entitas, dll. |
| Hasil pembersihan tidak normal atau teks tiba-tiba mengecil. | Pindah ke tinjauan manual | Aturan otomatis tidak dapat mencakup semua situasi dunia nyata |
Ketidakselarasan antara kemampuan analitis dan tanggung jawab keselamatan
BeautifulSoup Dokumentasi resmi mendefinisikannya sebagai "perpustakaan untuk mengekstraksi data dari file HTML dan XML" dengan fokus pada navigasi, pencarian, dan modifikasi struktur pohon. Oleh karena itu, mereka netral mengenai keamanan semantik konten. Ketika <a href="javascript:void(0)">Click</a> dimasukkan, BS4 akan membuat objek Tag dengan atribut href dengan benar, tetapi tidak akan menentukan apakah protokol tersebut diizinkan.
Dalam pengolahan dokumen, netralitas ini menimbulkan pro dan kontra. Keunggulannya adalah dapat menangani berbagai penanda sejarah yang tidak beraturan. Risikonya adalah jika pengembang berasumsi bahwa "BS4 diproses" sama dengan "disanitasi", HTML yang tidak divalidasi dapat langsung masuk ke antarmuka pratinjau atau hasil terjemahan.
Pembersihan keamanan yang sebenarnya memerlukan strategi daftar putih yang eksplisit: hanya simpan nama tag aman dan nama atribut yang diketahui, dan verifikasi format nilai atribut, dan hapus sisanya. Ini bukan fitur bawaan BS4, melainkan logika yang harus dilapis sendiri oleh pengguna.
Masukan batas dalam contoh sintesis
Untuk menggambarkan perlunya pembersihan, serangkaian sampel sintetis digunakan di bawah ini untuk mencakup vektor serangan umum dan konten yang sah. Masukan ini hanya untuk demonstrasi kondisi batas dan bukan merupakan statistik lalu lintas nyata dan juga tidak mewakili ambang batas standar industri. Untuk menguji dokumen asli, pertama-tama kurangi kepekaan data bisnis Anda untuk menghapus informasi pribadi dan tautan sensitif.
Masukkan dengan benar
<p>See <a href="https://example.com/doc">reference</a>.</p>
Output yang diharapkan harus membiarkan paragraf dan tautan tetap utuh, karena p dan a masuk daftar putih, dan href menggunakan protokol HTTPS.
Masukan batas 1: pengendali kejadian
<div onclick="steal()">Safe text</div>
Meskipun teksnya tidak berbahaya, onclick merupakan atribut event handler dan harus dihilangkan seluruhnya, hanya menyisakan <div>Safe text</div>. Jika div tidak ada dalam daftar putih tag, seluruh tag harus diganti dengan konten teks biasa.
Batas masukan 2: data: protokol
<a href="data:text/html,<script>alert(1)</script>">Link</a>
URI data: dapat membawa konten yang dapat dieksekusi. Meskipun tag itu sendiri legal, href harus dikosongkan atau dihapus. Pembersih tidak hanya dapat memeriksa apakah awalan protokol adalah http, tetapi juga memverifikasi bahwa konten yang didekodekan merupakan konteks eksekusi bersarang.
Kasus-kasus ini menggambarkan bahwa penilaian keamanan terjadi pada tahap peninjauan tingkat atribut setelah penguraian. BS4 bertanggung jawab untuk mengubah string menjadi objek yang dapat dilintasi, dan logika pembersihan bertanggung jawab untuk memutuskan objek mana yang dapat dipertahankan.
Implementasi pembersihan memori berbasis daftar putih
Contoh Python berikut menunjukkan cara melakukan ini di memori. Kode ini hanya untuk demonstrasi pengajaran. Itu tidak menangani detail seperti atribut multi-nilai, normalisasi kasus, pengkodean entitas, dll. Dilarang keras untuk digunakan secara langsung di lingkungan produksi. Itu tergantung pada beautifulsoup4, yang perlu diinstal sendiri dan disarankan untuk mengunci versinya. Kode ini tidak membuat permintaan jaringan, juga tidak membaca atau menulis ke sistem file. Pernyataan hanya mengungkapkan perilaku yang diharapkan, dan hasil sebenarnya bergantung pada lingkungan dan versi ketergantungan Anda.
# 教学示例:演示BS4配合白名单清洗原理,非生产级实现
from bs4 import BeautifulSoup, Comment
import re
ALLOWED_TAGS = {'p', 'a', 'b', 'i', 'ul', 'li'}
ALLOWED_ATTRS = {'href'}
SAFE_URL_PATTERN = re.compile(r'^https?://', re.IGNORECASE)
def sanitize_html(raw: str) -> str:
soup = BeautifulSoup(raw, 'html.parser')
# 移除注释
for comment in soup.find_all(string=lambda t: isinstance(t, Comment)):
comment.extract()
# 遍历所有标签
for tag in soup.find_all(True):
if tag.name not in ALLOWED_TAGS:
tag.unwrap() # 保留子节点,移除标签本身
continue
# 清理属性
attrs_to_remove = [k for k in tag.attrs if k not in ALLOWED_ATTRS]
for attr in attrs_to_remove:
del tag[attr]
# 校验剩余安全属性值
if 'href' in tag.attrs:
href = tag['href']
if not isinstance(href, str) or not SAFE_URL_PATTERN.match(href.strip()):
del tag['href']
return str(soup)
# 合成测试用例(仅用于理解原理)
safe = '<p>Hello <a href="https://ok.com">link</a></p>'
unsafe_event = '<p onclick="x()">text</p>'
unsafe_uri = '<a href="javascript:alert(1)">bad</a>'
assert sanitize_html(safe) == '<p>Hello <a href="https://ok.com">link</a></p>'
assert 'onclick' not in sanitize_html(unsafe_event)
assert 'href' not in sanitize_html(unsafe_uri)
Lingkungan produksi dapat mempertimbangkan untuk menggunakan perpustakaan sanitasi khusus (seperti bleach) dan menjaga konfigurasi daftar putih di luar kode. Kuncinya adalah: logika pembersihan harus secara eksplisit menyatakan "apa yang diperbolehkan" daripada mencoba menyebutkan "apa yang dilarang".
Kriteria penerimaan dan titik pemicu peninjauan manual
Assertion dalam kode hanya dapat memverifikasi apakah aturan yang telah ditetapkan sedang dijalankan dan tidak dapat mencakup semua anomali dunia nyata. Tabel di bawah ini mencantumkan situasi umum dalam pemrosesan dokumen sebenarnya, serta batas antara pemrosesan otomatis dan intervensi manusia.
| Amati fenomena ini | Keputusan pemrosesan otomatis | Apakah tinjauan manual diperlukan | Catatan |
|---|---|---|---|
| Nama tag tidak ada di daftar putih tetapi berisi teks penting | membuka bungkus mempertahankan teks | Tidak | Pastikan semantik tidak hilang |
| href adalah jalur relatif atau mailto: | Hapus atribut href | Ya | Mungkin tautan bisnis yang valid dan memerlukan konfirmasi manual |
| Nilai properti berisi JS yang dikodekan oleh entitas HTML | Tolak berdasarkan kecocokan string | Ya | Perlu dikonfirmasi apakah itu pembunuhan tidak sengaja. |
| Lapisan bersarang yang terlalu dalam menyebabkan timeout resolusi | Potong atau lewati klip | Ya | Mencegah DoS, tetapi dapat kehilangan konten |
| Panjang teks berkurang tajam sebesar >30% setelah pembersihan | Tandai sebagai mencurigakan | Ya | Mungkin terlalu banyak menghapus informasi yang terstruktur |
"Demo kode diluluskan" tidak berarti "efek end-to-end dapat dipercaya." Untuk proyek yang ditandai "Ya" di tabel, proses otomatis harus dihentikan dan diserahkan ke tinjauan manual. Dalam skenario pengiriman terjemahan, pembersihan berlebihan dapat menyebabkan gangguan kutipan terminologi atau konvensi format yang tidak valid.
📊 Perbandingan Inti
| Metode | Apa yang bisa dilakukan? | Itu tidak bisa menggantikan apa pun |
|---|---|---|
| Penguraian sup yang indah | Ubah HTML menjadi struktur pohon yang dapat dilintasi dan dimodifikasi | Penilaian keamanan, atribut, dan protokol akan tetap seperti adanya |
| Lapisan pembersihan daftar putih | Secara eksplisit mendeklarasikan label dan atribut yang diizinkan, menghilangkan sisanya | Verifikasi manual, status batas masih perlu konfirmasi |
Ruang pemurnian khusus (seperti bleach) | Melakukan pemurnian tingkat produksi dan mendukung konfigurasi eksternal | Mengurutkan dan menerima daftar putih bisnis Anda sendiri |
🎯 Metode mana yang cocok untukmu?
Jika Anda hanya perlu mengekstrak data
Cukup gunakan BeautifulSoup langsung, tetapi jangan tampilkan outputnya seolah-olah sudah didesinfeksi.
Jika Anda ingin menampilkan HTML warisan eksternal atau historis
Pertama, buat lapisan pembersihan daftar putih, lalu uji setiap item sesuai dengan lembar penerimaan.
Jika Anda sedang bersiap untuk masuk ke produksi
Pertimbangkan menggunakan pustaka khusus seperti bleach, konfigurasikan whitelist secara eksternal, dan pertahankan aturan pemicu tinjauan manual.
Jika Anda ingin melakukan terjemahan dan pengiriman dokumen
Periksa teks utama, tautan, kode, dan struktur secara terpisah, serta atur verifikasi manual untuk item yang ditandai dalam tabel.
❓ Pertanyaan yang Sering Diajukan (FAQ)
1. Setelah parsing dan reserialisasi dengan BeautifulSoft, apakah kode berbahaya akan hilang?
Tidak. Contoh dalam makalah menunjukkan bahwa <img src=x onerror=alert(1)> masih sepenuhnya tertahan dalam output setelah parsing dan serialisasi.
2. Bagaimana cara menangani tag dan atribut di luar daftar putih?
Jika tag tidak ada di daftar putih, Anda dapat membuka bungkus untuk mempertahankan teksnya; Atribut prosesor event seperti onclick harus dihapus sepenuhnya.
3. Apakah kode sampel dapat digunakan langsung di lingkungan produksi?
Tidak, kamu tidak bisa. Contoh-contoh tersebut hanya untuk demonstrasi pengajaran dan tidak membahas detail seperti atribut multi-nilai, normalisasi kasus, pengkodean entitas, dan sebagainya. Lingkungan produksi dapat mempertimbangkan bleach, dan whitelist dapat dikonfigurasi secara eksternal.
4. Jika demonstrasi kode lolos, apakah itu berarti efek pemrosesan dapat dipercaya?
Anda tidak bisa menyimpulkannya seperti itu. Jika formulir diberikan dan memerlukan tinjauan manual, proses otomatis harus ditangguhkan dan tinjauan manual akan diizinkan.
5. Bisakah kita menguji langsung dengan file asli?
Disarankan untuk terlebih dahulu mendesensitisasi data bisnis, menghapus informasi pribadi dan tautan sensitif, lalu menguji sesuai kriteria penerimaan.
Gunakan daftar periksa untuk terjemahan dokumen
Teks utama, tautan, kode, dan struktur halaman web harus ditangani secara terpisah. Sertakan bagian yang dilindungi dalam daftar periksa penerimaan lalu evaluasi keterbacaan dan tampilan halaman setelah diterjemahkan.
OmniDoc (Entri Produk) menyediakan portal terjemahan dokumen multi-format, dan situs resmi mereka memperkenalkan OCR, glosarium, serta fitur referensi dwibahasa. Bagi tim yang ingin memulai langsung dari file, ini adalah jalur yang layak dievaluasi dengan sampel nyata. Silakan gunakan file anonim yang telah Anda otorisasi untuk unggah dan verifikasi hasilnya dengan daftar periksa di artikel ini. Ini tidak mengklaim bahwa OmniDoc menggunakan pustaka open-source atau algoritma internal yang disebutkan dalam artikel ini, dan contoh-contoh tersebut tidak menggantikan pengujian kinerja produk.
📝 Ringkasan
Parsing hanya menjawab "Seperti apa HTML itu?"; keamanan bergantung pada whitelisting dan verifikasi manual. Pertama, jalankan contoh dalam lingkungan ketergantungan terkunci, lalu uji setiap item dengan sampel yang sudah didesensitisasi sesuai dengan lembar penerimaan, dan akhirnya putuskan apakah akan diintegrasikan ke dalam proses formal.
Rasakan sekarang: Unggah dokumen Anda untuk mulai menerjemahkan, mempertahankan format asli


