Být schopen analyzovat HTML neznamená být schopen bezpečně zobrazit HTML
Tento článek objasňuje, že BeautifulSoup je umístěn pouze jako analyzátor, nikoli jako čistič zabezpečení, a ukazuje, jak odstranit události skriptů a nebezpečné adresy URL pomocí strategie whitelistu. Poskytuje spustitelný výukový kód pro čištění paměti, hraniční testovací případy a kritéria spouštění manuální kontroly a vysvětluje správný způsob integrace OmniDoc do pracovního postupu překladu dokumentů pro vyhodnocení možností zpracování smíšeného obsahu.
BeautifulSoup analyzuje úspěšně, ale to neznamená, že HTML je bezpečné. Vývojářům a týmům pro dokumentaci, kteří potřebují zpracovávat externí HTML, tento článek vysvětluje, proč by se na analyzátory a čističe měli dívat odděleně, a poskytuje sadu nápadů na čištění, testovacích případů a kritérií ruční kontroly.
Příklady v tomto článku jsou syntetické vzorky a slouží pouze k demonstraci metod zpracování. Kód byl ukázkově zkontrolován v izolovaném prostředí, ale to neznamená, že je zaručeno, že bude fungovat se všemi skutečnými soubory nebo produkty. Před zpracováním důležitých dokumentů si prosím uschovejte originály a poté je jeden po druhém zkontrolujte podle hranic a přejímacích položek v dokumentu.
Závěr jednou větou: Po analýze musí být čištění provedeno samostatně
Nebezpečné atributy jako <img src=x onerror=alert(1)> zůstanou ve výstupu nedotčené poté, co je BeautifulSoup analyzuje. Čištění musí být další vrstvou obchodní logiky překrývající se po analýze.
| vaší situaci | Doporučené postupy | důvod |
|---|---|---|
| Jednoduše extrahujte nebo upravte data z HTML | Použití BeautifulSoup k analýze a procházení | BS4 je navržen tak, aby extrahoval a upravoval stromové struktury |
| Chcete-li vložit externí HTML do interních systémů nebo přeložit výstupy | Po analýze přidejte čisticí vrstvu na whitelist | BS4 neurčuje, zda jsou značky a atributy bezpečné |
Setkání s vlastnostmi, jako je onclick, javascript: nebo data: | Odeberte atributy nebo ponechte href prázdné | Tyto vlastnosti mohou nést spustitelný obsah |
| Připraveno k výrobě | Použijte vyhrazenou knihovnu dezinfekce (jako je bleach) a externalizujte bílou listinu | Ukázkový kód nezahrnuje podrobnosti, jako jsou atributy s více hodnotami, normalizace velkých a malých písmen, kódování entit atd. |
| Výsledky čištění jsou abnormální nebo je text náhle zmenšený. | Přejít na ruční kontrolu | Automatická pravidla nemohou pokrýt všechny situace v reálném světě |
Nesoulad mezi analytickými schopnostmi a bezpečnostními odpovědnostmi
BeautifulSoup Oficiální dokumentace ji definuje jako „knihovnu pro extrakci dat ze souborů HTML a XML"se zaměřením na navigaci, vyhledávání a úpravu stromových struktur. Je tedy neutrální ohledně sémantické bezpečnosti obsahu. Když je zadáno<a href="javascript:void(0)">Click</a>, BS4 správně vytvoří objekt Tag s atributem href, ale neurčuje, zda je protokol povolen.
Při zpracování dokumentů má tato neutralita klady i zápory. Výhodou je, že si poradí s řadou nepravidelných historických fixů. Riziko spočívá v tom, že pokud vývojáři předpokládají, že „zpracované BS4"se rovná „sanitováno", nevalidované HTML by se mohlo dostat přímo do rozhraní náhledu nebo doručit překlad.
Skutečné čištění zabezpečení vyžaduje explicitní strategii whitelistu: uchovávejte pouze známé bezpečné názvy značek a názvy atributů a ověřte formát hodnot atributů a zbytek odstraňte. Toto není vestavěná funkce BS4, ale spíše logika, kterou musí uživatelé překrývat sami.
Hraniční vstup v příkladu syntézy
Pro ilustraci nutnosti čištění je níže použita sada syntetických vzorků k pokrytí typických vektorů útoku a legitimního obsahu. Tyto vstupy slouží pouze pro demonstrační okrajové podmínky a nejsou skutečnými statistikami provozu ani nepředstavují prahové hodnoty průmyslového standardu. Chcete-li otestovat skutečné dokumenty, nejprve zrušte citlivost svých obchodních dat a odstraňte osobní informace a citlivé odkazy.
Zadejte správně
<p>See <a href="https://example.com/doc">reference</a>.</p>
Očekávaný výstup by měl ponechat odstavce a odkazy nedotčené, protože p a a jsou na seznamu povolených a href používá protokol HTTPS.
Hraniční vstup 1: obsluha události
<div onclick="steal()">Safe text</div>
I když je text neškodný, onclick je atribut obsluhy události a musí být zcela odstraněn, takže zůstane pouze <div>Safe text</div>. Pokud div není na seznamu povolených značek, měla by být celá značka nahrazena obsahem prostého textu.
Hraniční vstup 2: data: protokol
<a href="data:text/html,<script>alert(1)</script>">Link</a>
data: URI mohou nést spustitelný obsah. I když je samotný tag legální, href by měl být prázdný nebo smazán. Čistič nemůže pouze zkontrolovat, že předpona protokolu je http, ale také ověřit, že dekódovaný obsah představuje vnořený kontext provádění.
Tyto případy ilustrují, že k posouzení zabezpečení dochází ve fázi kontroly na úrovni atributů po analýze. BS4 je zodpovědná za přeměnu řetězců na prostupné objekty a logika čištění je zodpovědná za rozhodování, které objekty mohou být zachovány.
Implementace čištění paměti založená na whitelistu
Následující příklad Pythonu ukazuje, jak to udělat v paměti. Tento kód je pouze pro ukázku výuky. Neřeší detaily, jako jsou vícehodnotové atributy, normalizace velkých a malých písmen, kódování entit atd. Přímo v produkčním prostředí je přísně zakázáno používat. Závisí na beautifulsoup4, který si musíte nainstalovat sami a doporučujeme verzi uzamknout. Kód nevytváří síťové požadavky, nečte ani nezapisuje do systému souborů. Aserce pouze vyjadřují očekávané chování a skutečné výsledky závisí na vašem prostředí a verzích závislostí.
# 教学示例:演示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)
Produkční prostředí může zvážit použití vyhrazené knihovny pro dezinfekci (jako je bleach) a ponechání konfigurace whitelistu mimo kód. Klíčem je: logika čištění by měla výslovně uvádět „co je povoleno"namísto toho, aby se pokoušela vyjmenovat „co je zakázáno".
Kritéria přijetí a spouštěcí body ruční kontroly
Tvrzení v kódu mohou pouze ověřit, zda jsou přednastavená pravidla provedena, a nemohou pokrýt všechny skutečné výjimky. V následující tabulce jsou uvedeny běžné situace při skutečném zpracování dokumentů a také hranice mezi automatickým zpracováním a ručním zásahem.
| Pozorovat jevy | Rozhodování o automatizovaném zpracování | Zda je vyžadována ruční kontrola | Poznámka |
|---|---|---|---|
| Název značky není na seznamu povolených, ale obsahuje důležitý text | rozbalit zachovat text | žádný | Ujistěte se, že sémantika není ztracena |
| href je relativní cesta nebo mailto: | Odebrat atribut href | Ano | Může se jednat o platný obchodní odkaz a vyžaduje ruční potvrzení. |
| JS s kódováním entity HTML v hodnotě atributu | Odmítnout podle shody řetězce | Ano | Potřebuji potvrdit, zda šlo o zabití |
| Příliš hluboká úroveň vnoření způsobí časový limit analýzy | Zkraťte nebo přeskočte tento segment | Ano | Zabraňuje DoS, ale může ztratit obsah |
| Po vyčištění se délka textu zkrátí o >30 % | Označit jako podezřelé | Ano | Může překrývat strukturované informace |
"Demonstrace kódu prošla" neznamená "end-to-end efekt je důvěryhodný". U položek označených v tabulce „Ano"by měl být automatický proces pozastaven a předán k ruční kontrole. Ve scénářích doručování překladů může nadměrné čištění vést k nefunkčním odkazům na glosář nebo neplatným konvencím formátování.
📊 Srovnání jádra
| Cesta | co se dá dělat | Nelze nic nahradit |
|---|---|---|
| Krásný rozbor polévky | Přeměňte HTML na procházetelnou a upravitelnou stromovou strukturu | Bezpečnostní rozhodnutí, atributy a protokoly budou zachovány tak, jak jsou |
| Čisticí vrstva na seznamu povolených | Explicitně deklarujte povolené značky a atributy a odstraňte zbytek | Manuální kontrola, okrajová situace musí být ještě potvrzena |
Speciální purifikační knihovna (jako jebleach) | Zodpovídá za čištění na úrovni výroby a podporuje externí konfiguraci | Třídění a přijímání vlastního obchodního whitelistu |
🎯 Která metoda je pro vás vhodná?
Pokud potřebujete pouze extrahovat data
Stačí použít BeautifulSoup přímo, ale nezobrazovat jeho výstup jako dezinfikovaný obsah.
Pokud zobrazujete externí nebo starší HTML
Nejprve vytvořte čisticí vrstvu na whitelistu a poté ji otestujte položku po položce podle přijímacího formuláře.
Pokud jste připraveni přejít k výrobě online
Zvažte použití specializované knihovny, jako je bleach, k externalizaci konfigurace whitelistu a zachování pravidel spouštění ruční kontroly.
Pokud chcete udělat překlad a doručení dokumentů
Samostatně zkontrolujte text, odkazy, kód a strukturu a naplánujte ruční kontroly položek označených v tabulce.
❓ Často kladené otázky (FAQ)
1. Zmizí škodlivý kód po analýze a reserializaci pomocí BeautifulSoup?
Zvyklý. Příklad v tomto článku ukazuje, že <img src=x onerror=alert(1)> zůstane na výstupu po analýze a serializaci nedotčena.
2. Jak se vypořádat se značkami a atributy mimo whitelist?
Když štítek není na seznamu povolených, lze jeho text rozbalit, aby se zachoval; atributy obsluhy události, jako je onclick, by měly být zcela odstraněny.
3. Lze ukázkový kód použít přímo v produkčním prostředí?
Nemohu. Příklad je pouze pro výukovou demonstraci a nezabývá se detaily, jako jsou vícehodnotové atributy, normalizace velkých a malých písmen a kódování entit. Produkční prostředí může zvážit bleach a konfigurovat whitelist externě.
4. Pokud ukázka kódu projde, znamená to, že efekt zpracování je důvěryhodný?
To se nedá odvodit. Pokud je formulář označen jako vyžadující ruční kontrolu, měl by být automatický proces pozastaven a odeslán k ruční kontrole.
5. Může být testován přímo se skutečnými soubory?
Doporučuje se nejprve znecitlivět obchodní data, odstranit osobní informace a citlivé odkazy a poté testovat podle akceptačních položek.
Použijte kontrolní seznamy pro překlad dokumentů
Text, odkazy, kód a struktura webových dokumentů musí být zpracovány samostatně. Přidejte chráněné části do seznamu přijatelnosti a poté vyhodnoťte čitelnost a prezentaci stránky po překladu.
OmniDoc (produktový portál) poskytuje portál pro překlad dokumentů ve více formátech a oficiální webové stránky zavádějí funkce OCR, glosář a dvojjazyčné porovnání. Pro týmy, které chtějí pracovat přímo ze souborů, je to cesta, kterou stojí za to vyhodnotit pomocí reálných vzorků. Použijte prosím znecitlivěné soubory, k jejichž nahrávání máte oprávnění, a ke kontrole výsledků použijte zaškrtávací položky v tomto článku. Není zde žádné tvrzení, že OmniDoc používá open source knihovny nebo interní algoritmy uvedené v tomto článku a příklady nenahrazují testování výkonu produktu.
📝 Shrnutí
Analýza odpovídá pouze „jak vypadá HTML"a zabezpečení se spoléhá na whitelisting a ruční kontrolu. Nejprve spusťte příklad v uzamčeném závislém prostředí, poté použijte necitlivé vzorky k otestování každé položky podle přijímacího formuláře a poté se rozhodněte, zda se zapojíte do formálního procesu.
Vyzkoušejte to hned: Nahrajte dokument a začněte překládat při zachování původního rozvržení


