HTML-ді талдау мүмкіндігі HTML-ді қауіпсіз көрсете алу дегенді білдірмейді
Бұл мақала BeautifulSoup қауіпсіздік тазартқышы емес, талдаушы ретінде ғана орналасқанын түсіндіреді және ақ тізім стратегиясы арқылы сценарий оқиғалары мен қауіпті URL мекенжайларын жою жолын көрсетеді. Орындалатын жадты тазалау оқулық кодын, шекаралық сынақ жағдайларын және қолмен қарап шығуды іске қосу критерийлерін қамтамасыз етеді және аралас мазмұнды өңдеу мүмкіндіктерін бағалау үшін OmniDoc бағдарламасын құжатты аудару жұмыс үрдісіне біріктірудің дұрыс жолын түсіндіреді.
BeautifulSoup сәтті талдайды, бірақ бұл HTML қауіпсіз дегенді білдірмейді. Сыртқы HTML өңдеуі қажет әзірлеушілер мен құжаттама топтары үшін бұл мақала талдаушылар мен тазартқыштарды неліктен бөлек қарау керектігін түсіндіреді және ақ тізімді тазалау идеяларының, сынақ жағдайларының және қолмен қарап шығу критерийлерінің жиынтығын береді.
Осы мақаладағы мысалдар синтетикалық үлгілер болып табылады және тек өңдеу әдістерін көрсету үшін пайдаланылады. Код оқшауланған ортада үлгі тексерілді, бірақ бұл оның барлық нақты файлдармен немесе өнімдермен жұмыс істеуге кепілдік берілгенін білдірмейді. Маңызды құжаттарды өңдеуден бұрын түпнұсқаларды сақтап, құжаттағы шекаралар мен қабылдау элементтеріне сәйкес оларды бір-бірден қарап шығыңыз.
Бір сөйлеммен қорытынды: Талдау жүргізілгеннен кейін тазалауды бөлек жасау керек
<img src=x onerror=alert(1)> сияқты қауіпті атрибуттар BeautifulSoup оларды талдағаннан кейін шығыста өзгеріссіз қалады. Тазалау талдаудан кейін үстемеленген бизнес логикасының қосымша қабаты болуы керек.
| сіздің жағдайыңыз | Ұсынылатын тәжірибелер | себебі |
|---|---|---|
| HTML-ден деректерді жай ғана шығарып алыңыз немесе өзгертіңіз | Талдау және өту үшін BeautifulSoup пайдалану | BS4 ағаш құрылымдарын шығаруға және өзгертуге арналған |
| Сыртқы HTML-ді ішкі жүйелерге ендіру немесе жеткізілімдерді аудару | Талдаудан кейін ақ тізімді тазалау қабатын қосыңыз | BS4 тегтер мен атрибуттардың қауіпсіз екенін анықтамайды |
onclick, javascript: немесе data: сияқты сипаттарды кездестіру | Атрибуттарды жойыңыз немесе href бос қалдырыңыз | Бұл сипаттар орындалатын мазмұнды тасымалдауы мүмкін |
| Өндіріске дайын | Арнайы тазарту кітапханасын (мысалы, bleach) пайдаланыңыз және ақ тізімді сыртқа шығарыңыз | Үлгі коды көп мәнді атрибуттар, жағдайды қалыпқа келтіру, нысанды кодтау және т.б. сияқты мәліметтерді қамтымайды. |
| Тазалау нәтижелері әдеттен тыс немесе мәтін кенет азаяды. | Қолмен шолуға көшіңіз | Автоматтандырылған ережелер барлық нақты жағдайларды қамти алмайды |
Аналитикалық мүмкіндіктер мен қауіпсіздік жауапкершіліктері арасындағы сәйкессіздік
BeautifulSoup Ресми құжаттама оны шарлау, іздеу және ағаш құрылымдарын өзгертуге бағытталған «HTML және XML файлдарынан деректерді шығаруға арналған кітапхана» ретінде анықтайды. Осылайша, ол мазмұнның семантикалық қауіпсіздігіне бейтарап. <a href="javascript:void(0)">Click</a> енгізілгенде, BS4 href атрибуты бар Tag нысанын дұрыс құрастырады, бірақ протоколға рұқсат етілгенін анықтамайды.
Құжаттарды өңдеуде бұл бейтараптықтың оң және теріс жақтары бар. Артықшылығы - ол әртүрлі ретсіз тарихи белгілерді өңдей алады. Тәуекел мынада, егер әзірлеушілер "BS4 өңделген" дегенді "санитизацияланған" деп есептесе, расталмаған HTML оны тікелей алдын ала қарау интерфейсіне немесе аударманы жеткізуге мүмкіндік береді.
Қауіпсіздікті нақты тазалау нақты ақ тізім стратегиясын қажет етеді: тек белгілі қауіпсіз тег атаулары мен төлсипат атауларын сақтаңыз, төлсипат мәндерінің пішімін тексеріп, қалғандарын алып тастаңыз. Бұл BS4-тің кірістірілген мүмкіндігі емес, керісінше пайдаланушылар өздерін қабаттастыруы керек логика.
Синтез мысалындағы шекаралық кіріс
Тазалау қажеттілігін көрсету үшін төменде типтік шабуыл векторлары мен заңды мазмұнды қамту үшін синтетикалық үлгілер жинағы пайдаланылады. Бұл кірістер тек демонстрациялық шекаралық шарттарға арналған және нақты трафик статистикасы емес және салалық стандартты шектерді көрсетпейді. Нақты құжаттарды сынау үшін алдымен жеке ақпаратты және құпия сілтемелерді жою үшін бизнес деректеріңізді сенсибилизациялаңыз.
Дұрыс енгізіңіз
<p>See <a href="https://example.com/doc">reference</a>.</p>
Күтілетін нәтиже абзацтар мен сілтемелерді өзгеріссіз қалдыруы керек, себебі p және a ақ тізімге енгізілген және href HTTPS протоколын пайдаланады.
1-ші шекаралық кіріс: оқиға өңдеушісі
<div onclick="steal()">Safe text</div>
Мәтін зиянсыз болса да, onclick оқиға өңдегіш төлсипаты болып табылады және тек <div>Safe text</div> қалдырып, толығымен жойылуы керек. div тегтердің ақ тізімінде болмаса, бүкіл тег кәдімгі мәтін мазмұнымен ауыстырылуы керек.
Шектік кіріс 2: деректер: протокол
<a href="data:text/html,<script>alert(1)</script>">Link</a>
data: URI файлдары орындалатын мазмұнды тасымалдай алады. Тегтің өзі заңды болса да, href бос болуы немесе жойылуы керек. Тазалаушы протокол префиксінің http екенін тексере алмайды, сонымен қатар декодталған мазмұн кірістірілген орындау контекстін құрайтынын тексере алмайды.
Бұл жағдайлар қауіпсіздік туралы пікір талдаудан кейін атрибут деңгейіндегі шолу сатысында орын алатынын көрсетеді. BS4 жолдарды өтпелі нысандарға айналдыруға жауапты, ал тазалау логикасы қай нысандарды сақтауға болатынын шешуге жауап береді.
Ақ тізімге негізделген жадты тазалауды жүзеге асыру
Келесі Python мысалы жадта мұны қалай жасау керектігін көрсетеді. Бұл код тек демонстрацияны үйретуге арналған. Ол көп мәнді төлсипаттар, регистрді қалыпқа келтіру, нысанды кодтау және т.б. сияқты мәліметтерді өңдемейді. Оны тікелей өндіріс ортасында пайдалануға қатаң тыйым салынады. Бұл beautifulsoup4-ге байланысты, оны өзіңіз орнату керек және нұсқаны құлыптау ұсынылады. Код желілік сұрауларды жасамайды, файлдық жүйені оқымайды немесе жазбайды. Бекітулер тек күтілетін әрекетті білдіреді және нақты нәтижелер ортаңызға және тәуелділік нұсқаларына байланысты.
# 教学示例:演示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)
Өндіріс орталары арнайы тазарту кітапханасын (мысалы, bleach) пайдалануды және ақ тізім конфигурациясын кодтан тыс сақтауды қарастыруы мүмкін. Ең бастысы: тазарту логикасы «тыйым салынғанды» санаудың орнына «не рұқсат етілгенін» анық көрсетуі керек.
Қабылдау критерийлері және қолмен тексеру триггер нүктелері
Кодтағы бекітулер алдын ала орнатылған ережелердің орындалғанын ғана тексере алады және нақты өмірдегі барлық ерекшеліктерді қамти алмайды. Келесі кестеде нақты құжаттарды өңдеудегі жалпы жағдайлар, сондай-ақ автоматты өңдеу мен қолмен араласу арасындағы шекаралар тізімделген.
| Құбылыстарды бақылаңыз | Автоматтандырылған өңдеу шешімдері | Қолмен тексеру қажет пе | Ескерту |
|---|---|---|---|
| Тег атауы ақ тізімде жоқ, бірақ маңызды мәтінді қамтиды | сақталған мәтінді ашу | жоқ | Семантиканың жоғалмағанына көз жеткізіңіз |
| href - салыстырмалы жол немесе mailto: | href төлсипатын жою | иә | Бұл жарамды бизнес сілтемесі болуы мүмкін және қолмен растауды қажет етеді. |
| Төлсипат мәнінде HTML нысан кодтамасы бар JS | Жол сәйкестігі бойынша бас тарту | иә | Оның қасақана кісі өлтіру екенін растау керек |
| Тым терең кірістіру деңгейі талдаудың күту уақытын тудырады | Бұл сегментті қысқарту немесе өткізіп жіберу | иә | DoS-ті болдырмайды, бірақ мазмұнды жоғалтуы мүмкін |
| Тазалаудан кейін мәтін ұзындығы >30%-ға қысқарады | Күдікті деп белгілеңіз | иә | Құрылымдық ақпараттың үстінде болуы мүмкін |
«Код демонстрациясы өтті» деген сөз «соңғы әсер сенімді» дегенді білдірмейді. Кестеде «Иә» деп белгіленген элементтер үшін автоматтандырылған процесс кідіртіліп, қолмен қарауға тапсырылуы керек. Аударманы жеткізу сценарийлерінде шамадан тыс тазалау бұзылған глоссарий сілтемелеріне немесе жарамсыз пішімдеу конвенцияларына әкелуі мүмкін.
📊 Негізгі салыстыру
| Жол | не істеуге болады | Ештеңені алмастыра алмайды |
|---|---|---|
| Керемет сорпаны талдау | HTML тілін ауысуға болатын және өзгертілетін ағаш құрылымына айналдырыңыз | Қауіпсіздік шешімдері, атрибуттары және хаттамалары сол күйінде сақталады |
| Ақ тізімді тазалау қабаты | Рұқсат етілген тегтер мен атрибуттарды ашық түрде жариялаңыз, қалғандарын алып тастаңыз | Қолмен шолу, шекаралық жағдайды әлі де растау қажет |
Арнайы тазарту кітапханасы (мысалы, bleach) | Өндіріс деңгейіндегі тазалауға жауапты және сыртқы конфигурацияны қолдайды | Жеке бизнес ақ тізімін сұрыптау және қабылдау |
🎯 Сізге қай әдіс қолайлы?
Егер сізге деректерді шығарып алу қажет болса
BeautifulSoup қолданбасын тікелей пайдаланыңыз, бірақ оның шығысын тазартылған мазмұн ретінде көрсетпеңіз.
Сыртқы немесе бұрынғы HTML көрсетіп жатсаңыз
Алдымен ақ тізімді тазалау қабатын орнатыңыз, содан кейін оны қабылдау пішініне сәйкес тармақ бойынша сынаңыз.
Өндіріс үшін желіге шығуға дайын болсаңыз
Ақ тізім конфигурациясын сыртқа шығару және қолмен шолуды іске қосу ережелерін сақтау үшін bleach сияқты арнайы кітапхананы пайдалануды қарастырыңыз.
Құжаттарды аударып, жеткізгіңіз келсе
Мәтінді, сілтемелерді, кодты және құрылымды бөлек тексеріңіз және кестеде белгіленген элементтер үшін қолмен шолуларды жоспарлаңыз.
❓ Жиі қойылатын сұрақтар (ЖҚС)
1. BeautifulSoup көмегімен талдау және қайта сериялаудан кейін зиянды код жоғалады ма?
Болмайды. Осы мақаладағы мысал <img src=x onerror=alert(1)> талдау және сериялаудан кейін шығыста өзгеріссіз қалатынын көрсетеді.
2. Ақ тізімнен тыс тегтермен және атрибуттармен қалай жұмыс істеуге болады?
Белгі ақ тізімде болмаған кезде, оны сақтау үшін оның мәтінін ашуға болады; onclick сияқты оқиға өңдегіш атрибуттары толығымен жойылуы керек.
3. Үлгі кодты тікелей өндіріс ортасында пайдалануға болады ма?
мүмкін емес. Мысал тек демонстрацияны үйретуге арналған және көп мәнді төлсипаттар, жағдайды қалыпқа келтіру және нысан кодтау сияқты мәліметтерді өңдемейді. Өндіріс ортасы bleach қарастырып, ақ тізімді сырттан конфигурациялай алады.
4. Егер код демонстрациясы өтсе, бұл өңдеу әсері сенімді дегенді білдіре ме?
Бұл тұжырым жасауға болмайды. Пішін қолмен қарауды қажет етеді деп белгіленсе, автоматтандырылған процесті тоқтатып, қолмен қарауға жіберу керек.
5. Оны нақты файлдармен тікелей тексеруге бола ма?
Алдымен бизнес деректерін десенсибилизациялау, жеке ақпаратты және құпия сілтемелерді жою, содан кейін қабылдау элементтеріне сәйкес сынақтан өткізу ұсынылады.
Құжатты аудару үшін бақылау парақтарын пайдаланыңыз
Веб-құжаттардың мәтіні, сілтемелері, коды және құрылымы бөлек өңделуі керек. Қорғалған бөліктерді қабылдау тізіміне қосыңыз, содан кейін аудармадан кейін оқылу және бет көрсетілімін бағалаңыз.
OmniDoc (өнім порталы) көп форматты құжатты аудару порталын ұсынады, ал ресми веб-сайт OCR, глоссарий және екі тілді салыстыру функцияларын ұсынады. Тікелей файлдардан жұмыс істегісі келетін топтар үшін бұл нақты өмір үлгілерімен бағалауға тұрарлық жол. Жүктеп салуға рұқсатыңыз бар сенсибилизацияланған файлдарды пайдаланыңыз және нәтижелерді қарап шығу үшін осы мақаладағы тексеру элементтерін пайдаланыңыз. Бұл жерде OmniDoc осы мақалада айтылған ашық бастапқы кітапханаларды немесе ішкі алгоритмдерді пайдаланады және мысалдар өнім өнімділігін тексеруді алмастыра алмайды деген шағым жоқ.
📝 Түйіндеме
Талдау тек "HTML қалай көрінеді" деп жауап береді және қауіпсіздік ақ тізімге және қолмен қарауға негізделген. Алдымен мысалды құлыпталған тәуелділік ортасында іске қосыңыз, содан кейін қабылдау пішініне сәйкес әрбір элементті сынау үшін десенсибилизацияланған үлгілерді пайдаланыңыз, содан кейін ресми процеске қосылуды шешіңіз.


