Être capable d'analyser du HTML ne signifie pas être capable d'afficher du HTML en toute sécurité
Cet article précise que BeautifulSoup se positionne uniquement comme un analyseur plutôt que comme un purificateur de sécurité, et montre comment supprimer les événements de script et les URL dangereuses grâce à une stratégie de liste blanche. Fournit un code didacticiel de nettoyage de mémoire exécutable, des cas de test limites et des critères de déclenchement de révision manuelle, et explique la manière correcte d'intégrer OmniDoc dans le flux de travail de traduction de documents pour évaluer les capacités de traitement de contenu mixte.
BeautifulSoup analyse avec succès, mais cela ne signifie pas que le HTML est sûr. Pour les développeurs et les équipes de documentation qui doivent traiter du HTML externe, cet article explique pourquoi les analyseurs et les purificateurs doivent être examinés séparément, et donne un ensemble d'idées de nettoyage de liste blanche, de cas de test et de critères de révision manuelle.
Les exemples de cet article sont des échantillons synthétiques et ne sont utilisés que pour démontrer les méthodes de traitement. Le code a été vérifié par échantillons dans un environnement isolé, mais cela ne signifie pas qu'il est garanti qu'il fonctionnera avec tous les fichiers ou produits réels. Avant de traiter des documents importants, veuillez conserver les originaux, puis les examiner un par un en fonction des limites et des éléments d'acceptation du document.
Conclusion en une phrase : Après analyse, le nettoyage doit être fait séparément
Les attributs dangereux comme <img src=x onerror=alert(1)> restent intacts dans la sortie après que BeautifulSoup les ait analysés. Le nettoyage doit être une couche supplémentaire de logique métier superposée après l'analyse.
| votre situation | Pratiques recommandées | raison |
|---|---|---|
| Extrayez ou modifiez simplement les données du HTML | Utiliser BeautifulSoup pour analyser et parcourir | BS4 est conçu pour extraire et modifier les structures arborescentes |
| Pour intégrer du HTML externe dans les systèmes internes ou traduire les livrables | Ajouter une couche de nettoyage de liste blanche après l'analyse | BS4 ne détermine pas si les balises et les attributs sont sûrs |
Rencontre de propriétés telles que onclick, javascript: ou data: | Supprimez les attributs ou laissez href vide | Ces propriétés peuvent contenir du contenu exécutable |
| Prêt pour la fabrication | Utilisez une bibliothèque de nettoyage dédiée (telle que bleach) et externalisez la liste blanche | L'exemple de code ne couvre pas les détails tels que les attributs à valeurs multiples, la normalisation de la casse, le codage d'entité, etc. |
| Les résultats du nettoyage sont anormaux ou le texte est soudainement réduit. | Passer à la révision manuelle | Les règles automatisées ne peuvent pas couvrir toutes les situations du monde réel |
Désalignement entre les capacités analytiques et les responsabilités en matière de sécurité
BeautifulSoup Documentation officielle le définit comme une « bibliothèque pour extraire des données de fichiers HTML et XML » en mettant l'accent sur la navigation, la recherche et la modification des arborescences. Il est ainsi neutre sur la sécurité sémantique du contenu. Lorsque <a href="javascript:void(0)">Click</a> est saisi, BS4 construira correctement un objet Tag avec l'attribut href, mais ne déterminera pas si le protocole est autorisé.
Dans le traitement des documents, cette neutralité présente des avantages et des inconvénients. L’avantage est qu’il peut gérer une variété de marqueurs historiques irréguliers. Le risque est que si les développeurs supposent que « BS4 traité » équivaut à « aseptisé », du HTML non validé pourrait apparaître directement dans l'interface de prévisualisation ou dans le livrable de traduction.
Un véritable nettoyage de sécurité nécessite une stratégie de liste blanche explicite : ne conservez que les noms de balises et les noms d'attributs sûrs connus, vérifiez le format des valeurs d'attribut et supprimez le reste. Il ne s'agit pas d'une fonctionnalité intégrée à BS4, mais plutôt d'une logique que les utilisateurs doivent eux-mêmes superposer.
Entrée de limite dans l'exemple de synthèse
Pour illustrer la nécessité du nettoyage, un ensemble d’échantillons synthétiques est utilisé ci-dessous pour couvrir les vecteurs d’attaque typiques et le contenu légitime. Ces entrées sont uniquement destinées à la démonstration des conditions limites et ne constituent pas de véritables statistiques de trafic et ne représentent pas non plus des seuils standard de l'industrie. Pour tester de vrais documents, désensibilisez d’abord les données de votre entreprise pour supprimer les informations personnelles et les liens sensibles.
Saisissez correctement
<p>See <a href="https://example.com/doc">reference</a>.</p>
Le résultat attendu doit laisser les paragraphes et les liens intacts, puisque p et a sont sur liste blanche et que href utilise le protocole HTTPS.
Entrée de limite 1 : gestionnaire d'événements
<div onclick="steal()">Safe text</div>
Même si le texte est inoffensif, onclick est un attribut de gestionnaire d'événements et doit être entièrement supprimé, ne laissant que <div>Safe text</div>. Si div ne figure pas dans la liste blanche des balises, la balise entière doit être remplacée par du contenu en texte brut.
Entrée de limite 2 : données : protocole
<a href="data:text/html,<script>alert(1)</script>">Link</a>
Les URI data: peuvent transporter du contenu exécutable. Même si la balise elle-même est légale, le href doit être masqué ou supprimé. Le nettoyeur ne peut pas se contenter de vérifier que le préfixe du protocole est http, mais également vérifier que le contenu décodé constitue un contexte d'exécution imbriqué.
Ces cas illustrent que le jugement de sécurité se produit lors de l’étape de révision au niveau des attributs après l’analyse. BS4 est chargé de transformer les chaînes en objets traversables, et la logique de nettoyage est chargée de décider quels objets peuvent être conservés.
Implémentation du nettoyage de la mémoire basé sur une liste blanche
L'exemple Python suivant montre comment procéder en mémoire. Ce code est uniquement destiné à la démonstration pédagogique. Il ne gère pas les détails tels que les attributs à valeurs multiples, la normalisation de la casse, le codage des entités, etc. Il est strictement interdit de l'utiliser directement dans l'environnement de production. Cela dépend de beautifulsoup4, qui doit être installé par vous-même et il est recommandé de verrouiller la version. Le code n'effectue pas de requêtes réseau, ni ne lit ni n'écrit dans le système de fichiers. Les assertions expriment uniquement le comportement attendu et les résultats réels dépendent de votre environnement et des versions de dépendances.
# 教学示例:演示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)
Les environnements de production peuvent envisager d'utiliser une bibliothèque de nettoyage dédiée (telle que bleach) et de conserver la configuration de la liste blanche en dehors du code. La clé est la suivante : la logique de nettoyage doit indiquer explicitement "ce qui est autorisé" au lieu d'essayer d'énumérer "ce qui est interdit".
Critères d'acceptation et points de déclenchement de l'examen manuel
Les assertions dans le code peuvent uniquement vérifier si les règles prédéfinies sont exécutées et ne peuvent pas couvrir toutes les exceptions réelles. Le tableau suivant répertorie les situations courantes dans le traitement réel des documents, ainsi que les limites entre le traitement automatique et l'intervention manuelle.
| Observer les phénomènes | Décisions de traitement automatisées | Si une révision manuelle est requise | Remarque |
|---|---|---|---|
| Le nom de la balise ne figure pas dans la liste blanche mais contient du texte important | déballer conserver le texte | Non | Assurez-vous que la sémantique n’est pas perdue |
| href est un chemin relatif ou mailto : | Supprimer l'attribut href | Oui | Il peut s'agir d'un lien commercial valide et nécessite une confirmation manuelle. |
| JS avec codage d'entité HTML dans la valeur d'attribut | Rejeter par correspondance de chaîne | Oui | Besoin de confirmer s'il s'agissait d'un homicide involontaire |
| Un niveau d'imbrication trop profond entraîne l'expiration du délai d'analyse | Tronquer ou ignorer ce segment | Oui | Empêche le DoS, mais peut perdre du contenu |
| Après le nettoyage, la longueur du texte est réduite de >30 % | Marquer comme suspect | Oui | Peut supprimer les informations structurées |
"La démonstration du code est réussie" n'équivaut pas à "l'effet de bout en bout est crédible". Pour les éléments marqués « Oui » dans le tableau, le processus automatisé doit être suspendu et transmis à une révision manuelle. Dans les scénarios de livraison de traduction, un nettoyage excessif peut entraîner des références de glossaire brisées ou des conventions de formatage non valides.
📊 Comparaison de base
| Chemin | que peut-on faire | Je ne peux rien remplacer |
|---|---|---|
| Analyse de BeautifulSoup | Transformez le HTML en une arborescence traversable et modifiable | Les jugements, attributs et protocoles de sécurité seront conservés tels quels |
| Couche de nettoyage de la liste blanche | Déclarez explicitement les balises et les attributs autorisés, en supprimant le reste | Revue manuelle, la situation limite doit encore être confirmée |
Bibliothèque de purification spéciale (telle que bleach) | Responsable de la purification au niveau de la production et prend en charge la configuration externe | Tri et acceptation de votre propre liste blanche d'entreprise |
🎯 Quelle méthode vous convient ?
Si vous avez juste besoin d'extraire les données
Utilisez simplement BeautifulSoup directement, mais n'affichez pas sa sortie sous forme de contenu nettoyé.
Si vous affichez du HTML externe ou existant
Établissez d'abord une couche de nettoyage de liste blanche, puis testez-la élément par élément selon le formulaire d'acceptation.
Si vous êtes prêt à passer en ligne pour la production
Pensez à utiliser une bibliothèque dédiée telle que bleach pour externaliser la configuration de la liste blanche et conserver les règles de déclenchement de révision manuelle.
Si vous souhaitez effectuer la traduction et la livraison de documents
Vérifiez le texte, les liens, le code et la structure séparément, et planifiez des révisions manuelles pour les éléments marqués dans le tableau.
❓ Questions fréquemment posées (FAQ)
1. Le code malveillant disparaîtra-t-il après analyse et resérialisation avec BeautifulSoup ?
Ne le fera pas. L'exemple de cet article montre que <img src=x onerror=alert(1)> reste intact dans la sortie après analyse et sérialisation.
2. Comment gérer les balises et les attributs en dehors de la liste blanche ?
Lorsqu'une étiquette n'est pas dans la liste blanche, son texte peut être déroulé pour le conserver ; les attributs du gestionnaire d'événements tels que onclick doivent être entièrement supprimés.
3. L'exemple de code peut-il être utilisé directement dans un environnement de production ?
Ne peut pas. L'exemple est uniquement destiné à la démonstration pédagogique et ne gère pas les détails tels que les attributs à valeurs multiples, la normalisation de cas et le codage d'entité. L'environnement de production peut prendre en compte bleach et configurer la liste blanche en externe.
4. Si la démonstration du code réussit, cela signifie-t-il que l'effet du traitement est crédible ?
Cela ne peut pas être déduit. Si le formulaire est marqué comme nécessitant une révision manuelle, le processus automatisé doit être suspendu et soumis à une révision manuelle.
5. Peut-il être testé directement avec de vrais fichiers ?
Il est recommandé de désensibiliser d'abord les données commerciales, de supprimer les informations personnelles et les liens sensibles, puis de tester en fonction des éléments d'acceptation.
Utilisez des listes de contrôle pour la traduction de documents
Le texte, les liens, le code et la structure des documents Web doivent être traités séparément. Ajoutez les parties protégées à la liste d'acceptation, puis évaluez la lisibilité et la présentation de la page après traduction.
OmniDoc (portail produit) fournit un portail de traduction de documents multiformat et le site officiel présente des fonctions d'OCR, de glossaire et de comparaison bilingue. Pour les équipes qui souhaitent travailler directement à partir des fichiers, il s’agit d’une voie qui mérite d’être évaluée avec des échantillons réels. Veuillez utiliser les fichiers désensibilisés que vous êtes autorisé à télécharger et utilisez les éléments de vérification de cet article pour examiner les résultats. Rien ne prétend ici qu'OmniDoc utilise les bibliothèques open source ou les algorithmes internes mentionnés dans cet article, et les exemples ne remplacent pas les tests de performances du produit.
📝Résumé
L'analyse ne répond qu'à "à quoi ressemble le HTML" et la sécurité repose sur la liste blanche et l'examen manuel. Exécutez d'abord l'exemple dans un environnement de dépendance verrouillé, puis utilisez des échantillons désensibilisés pour tester chaque élément conformément au formulaire d'acceptation, puis décidez si vous souhaitez rejoindre le processus formel.


