Có thể phân tích HTML không có nghĩa là có thể hiển thị HTML một cách an toàn

Bài viết này làm rõ rằng BeautifulSoup chỉ được định vị là trình phân tích cú pháp chứ không phải là trình lọc bảo mật và trình bày cách xóa các sự kiện tập lệnh và URL nguy hiểm thông qua chiến lược danh sách trắng. Cung cấp mã hướng dẫn làm sạch bộ nhớ có thể chạy được, các trường hợp kiểm tra ranh giới và tiêu chí kích hoạt xem xét thủ công, đồng thời giải thích cách chính xác để tích hợp OmniDoc vào quy trình dịch tài liệu để đánh giá khả năng xử lý nội dung hỗn hợp.

BeautifulSoup phân tích cú pháp thành công nhưng điều đó không có nghĩa là HTML an toàn. Đối với các nhà phát triển và nhóm tài liệu cần xử lý HTML bên ngoài, bài viết này giải thích lý do nên xem xét riêng các trình phân tích cú pháp và bộ lọc, đồng thời đưa ra một bộ ý tưởng làm sạch danh sách trắng, các trường hợp thử nghiệm và tiêu chí xem xét thủ công.

Các ví dụ trong bài viết này là các mẫu tổng hợp và chỉ được sử dụng để trình diễn các phương pháp xử lý. Mã đã được kiểm tra mẫu trong một môi trường biệt lập, nhưng điều này không có nghĩa là nó được đảm bảo hoạt động với tất cả các tệp hoặc sản phẩm thực. Trước khi xử lý các văn bản quan trọng, quý khách vui lòng giữ lại bản gốc rồi xem xét từng văn bản theo ranh giới và các mục chấp nhận trong văn bản.

Kết luận trong một câu: Sau khi phân tích phải làm vệ sinh riêng

Các thuộc tính nguy hiểm như <img src=x onerror=alert(1)> vẫn còn nguyên trong đầu ra sau khi BeautifulSoup phân tích chúng. Việc dọn dẹp phải là một lớp logic nghiệp vụ bổ sung được xếp chồng lên nhau sau khi phân tích cú pháp.

hoàn cảnh của bạnCác phương pháp được đề xuấtlý do
Chỉ cần trích xuất hoặc sửa đổi dữ liệu từ HTMLSử dụng BeautifulSoup để phân tích và duyệt quaBS4 được thiết kế để trích xuất và sửa đổi cấu trúc cây
Để nhúng HTML bên ngoài vào hệ thống nội bộ hoặc dịch các sản phẩm phân phốiThêm lớp làm sạch danh sách trắng sau khi phân tích cú phápBS4 không xác định liệu thẻ và thuộc tính có an toàn hay không
Gặp thuộc tính như onclick, javascript:, hay data:Xóa thuộc tính hoặc để trống hrefCác thuộc tính này có thể mang nội dung thực thi
Sẵn sàng cho sản xuấtSử dụng thư viện dọn dẹp chuyên dụng (chẳng hạn như bleach) và đưa ra ngoài danh sách trắngMã mẫu không bao gồm các chi tiết như thuộc tính đa giá trị, chuẩn hóa chữ hoa chữ thường, mã hóa thực thể, v.v.
Kết quả làm sạch không bình thường hoặc văn bản bị giảm đột ngột.Chuyển sang xem xét thủ côngQuy tắc tự động không thể bao gồm tất cả các tình huống trong thế giới thực

Mâu thuẫn giữa khả năng phân tích và trách nhiệm an toàn

BeautifulSoup Tài liệu chính thức định nghĩa nó là "thư viện để trích xuất dữ liệu từ các tệp HTML và XML" tập trung vào việc điều hướng, tìm kiếm và sửa đổi cấu trúc cây. Do đó, nó trung lập về tính bảo mật ngữ nghĩa của nội dung. Khi nhập <a href="javascript:void(0)">Click</a>, BS4 sẽ xây dựng chính xác đối tượng Tag với thuộc tính href, nhưng sẽ không xác định liệu giao thức có được phép hay không.

Trong xử lý tài liệu, tính trung lập này có những ưu và nhược điểm. Ưu điểm là nó có thể xử lý nhiều dấu ấn lịch sử bất thường. Rủi ro là nếu các nhà phát triển cho rằng "BS4 đã được xử lý" tương đương với "đã được làm sạch", thì HTML chưa được xác thực có thể đưa nó trực tiếp vào giao diện xem trước hoặc bản dịch có thể phân phối được.

Việc dọn dẹp bảo mật thực sự yêu cầu một chiến lược danh sách trắng rõ ràng: chỉ giữ lại các tên thẻ và tên thuộc tính an toàn đã biết, đồng thời xác minh định dạng của các giá trị thuộc tính và loại bỏ phần còn lại. Đây không phải là tính năng tích hợp sẵn của BS4 mà là một logic mà người dùng phải tự mình áp dụng.

Đầu vào ranh giới trong ví dụ tổng hợp

Để minh họa sự cần thiết của việc làm sạch, một tập hợp các mẫu tổng hợp được sử dụng bên dưới để bao gồm các vectơ tấn công điển hình và nội dung hợp pháp. Những thông tin đầu vào này chỉ nhằm mục đích minh họa các điều kiện biên và không phải là số liệu thống kê lưu lượng truy cập thực tế cũng như không đại diện cho các ngưỡng tiêu chuẩn của ngành. Để kiểm tra các tài liệu thực, trước tiên hãy giải mẫn cảm với dữ liệu doanh nghiệp của bạn để xóa thông tin cá nhân và các liên kết nhạy cảm.

Nhập chính xác

<p>See <a href="https://example.com/doc">reference</a>.</p>

Đầu ra dự kiến sẽ giữ nguyên các đoạn văn và liên kết vì p và a được đưa vào danh sách trắng và href sử dụng giao thức HTTPS.

Đầu vào ranh giới 1: xử lý sự kiện

<div onclick="steal()">Safe text</div>

Mặc dù văn bản vô hại nhưng onclick là thuộc tính xử lý sự kiện và phải bị xóa hoàn toàn, chỉ để lại <div>Safe text</div>. Nếu div không có trong danh sách trắng của thẻ thì toàn bộ thẻ phải được thay thế bằng nội dung văn bản thuần túy.

Đầu vào ranh giới 2: dữ liệu: giao thức

<a href="data:text/html,<script>alert(1)</script>">Link</a>

URI data: có thể mang nội dung thực thi. Ngay cả khi bản thân thẻ này là hợp pháp thì href vẫn phải được để trống hoặc xóa. Trình dọn dẹp không chỉ kiểm tra xem tiền tố giao thức có phải là http hay không mà còn xác minh rằng nội dung được giải mã có cấu thành bối cảnh thực thi lồng nhau hay không.

Những trường hợp này minh họa rằng phán đoán bảo mật xảy ra trong giai đoạn xem xét cấp thuộc tính sau khi phân tích cú pháp. BS4 chịu trách nhiệm biến các chuỗi thành các đối tượng có thể truyền qua và logic làm sạch chịu trách nhiệm quyết định đối tượng nào có thể được giữ lại.

Triển khai dọn dẹp bộ nhớ dựa trên danh sách trắng

Ví dụ Python sau đây cho thấy cách thực hiện việc này trong bộ nhớ. Mã này chỉ dành cho việc trình diễn giảng dạy. Nó không xử lý các chi tiết như thuộc tính đa giá trị, chuẩn hóa trường hợp, mã hóa thực thể, v.v. Nghiêm cấm sử dụng trực tiếp trong môi trường sản xuất. Tùy thuộc vào beautifulsoup4, cần phải tự cài đặt và nên khóa phiên bản. Mã này không thực hiện các yêu cầu mạng cũng như không đọc hoặc ghi vào hệ thống tệp. Các xác nhận chỉ thể hiện hành vi dự kiến và kết quả thực tế phụ thuộc vào môi trường và phiên bản phụ thuộc của bạn.

# 教学示例:演示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)

Môi trường sản xuất có thể cân nhắc sử dụng thư viện dọn dẹp chuyên dụng (chẳng hạn như bleach) và giữ cấu hình danh sách trắng bên ngoài mã. Điều quan trọng là: logic làm sạch phải nêu rõ "những gì được phép" thay vì cố gắng liệt kê "những gì bị cấm".

Tiêu chí chấp nhận và điểm kích hoạt đánh giá thủ công

Các xác nhận trong mã chỉ có thể xác minh xem các quy tắc đặt trước có được thực thi hay không và không thể bao gồm tất cả các trường hợp ngoại lệ trong đời thực. Bảng sau liệt kê các tình huống phổ biến trong quá trình xử lý tài liệu thực tế cũng như ranh giới giữa xử lý tự động và can thiệp thủ công.

Quan sát hiện tượngQuyết định xử lý tự độngLiệu có cần xem xét thủ công hay khôngLưu ý
Tên thẻ không có trong danh sách trắng nhưng chứa văn bản quan trọngUnwrap bảo toàn văn bảnKhôngĐảm bảo ngữ nghĩa không bị mất
href là đường dẫn tương đối hoặc mailto:Loại bỏ thuộc tính hrefĐúng vậyNó có thể là một liên kết kinh doanh hợp lệ và cần xác nhận thủ công
Giá trị thuộc tính chứa JS được mã hóa bởi thực thể HTMLTừ chối theo khớp chuỗiĐúng vậyCần xác nhận xem đó có phải là ngộ sát hay không
Các lớp lồng nhau quá sâu gây ra thời gian chờ độ phân giảiCắt hoặc bỏ qua đoạn clipĐúng vậyNgăn DoS, nhưng có thể mất nội dung
Độ dài văn bản giảm mạnh >30% sau khi làm sạchĐánh dấu là nghi ngờĐúng vậyNó có thể làm mất đi quá nhiều thông tin có cấu trúc

"Code demo được thông qua" không có nghĩa là "hiệu quả đầu cuối đáng tin cậy." Đối với các dự án được đánh dấu "Có" trong bảng, quy trình tự động nên được tạm dừng và chuyển giao cho việc xem xét thủ công. Trong các trường hợp phân phối dịch thuật, việc làm sạch quá mức có thể gây ra lỗi trích dẫn thuật ngữ hoặc quy ước định dạng không hợp lệ.

📊 So sánh cốt lõi

Phương phápCó thể làm gì?Nó không thể thay thế bất cứ thứ gì
Phân tích cú pháp BeautifulSoupBiến HTML thành một cấu trúc cây có thể đi qua và chỉnh sửaCác đánh giá, thuộc tính và quy trình bảo mật sẽ được giữ nguyên như hiện tại
Lớp làm sạch danh sách trắngKhai báo rõ ràng các nhãn và thuộc tính được phép, loại bỏ phần còn lạiXác minh thủ công, trạng thái ranh giới vẫn cần xác nhận
Buồng lọc chuyên dụng (như bleach)Thực hiện quá trình tinh chế đạt chuẩn sản xuất và hỗ trợ cấu hình bên ngoàiSắp xếp và chấp nhận danh sách trắng doanh nghiệp của riêng bạn

🎯 Phương pháp nào phù hợp với bạn?

Nếu bạn chỉ cần trích xuất dữ liệu

Chỉ cần sử dụng BeautifulSoup trực tiếp, nhưng đừng hiển thị đầu ra như thể nó đã được khử trùng.

Nếu bạn muốn hiển thị HTML cũ bên ngoài hoặc lịch sử

Đầu tiên, thiết lập một lớp làm sạch danh sách trắng, sau đó kiểm tra từng mục theo phiếu chấp nhận.

Nếu bạn đang chuẩn bị bước vào sản xuất

Hãy cân nhắc sử dụng các thư viện chuyên biệt như bleach, cấu hình danh sách trắng bên ngoài và giữ nguyên các quy tắc kích hoạt xem xét thủ công.

Nếu bạn muốn dịch và giao tài liệu

Kiểm tra văn bản chính, liên kết, mã và cấu trúc riêng biệt, đồng thời sắp xếp xác minh thủ công cho các mục được đánh dấu trong bảng.

❓ Câu hỏi thường gặp (FAQ)

1. Sau khi phân tích và tái phân tích bằng BeautifulSoft, mã độc có biến mất không?

Không. Ví dụ trong bài báo cho thấy <img src=x onerror=alert(1)> vẫn được giữ nguyên hoàn toàn trong đầu ra sau khi phân tích cú pháp và tuần tự hóa.

2. Làm thế nào để xử lý các thẻ và thuộc tính ngoài danh sách trắng?

Nếu một thẻ không có trong danh sách trắng, bạn có thể mở gói để giữ lại văn bản; Các thuộc tính của bộ xử lý sự kiện như onclick nên được loại bỏ hoàn toàn.

3. Mã mẫu có thể được sử dụng trực tiếp trong môi trường sản xuất không?

Không, bạn không thể. Các ví dụ này chỉ dùng để giảng dạy các bản minh họa và không đề cập đến các chi tiết như thuộc tính đa giá trị, chuẩn hóa chữ hoa, mã hóa thực thể, v.v. Môi trường sản xuất có thể xem xét bleach, và danh sách trắng có thể được cấu hình bên ngoài.

4. Nếu bản trình diễn mã được chấp nhận, liệu hiệu ứng xử lý có đáng tin cậy không?

Bạn không thể suy luận theo cách đó. Nếu mẫu đơn được cấp và yêu cầu xem xét thủ công, quy trình tự động nên bị tạm dừng và cho phép xem xét thủ công.

5. Chúng ta có thể kiểm tra trực tiếp với file thật không?

Khuyến nghị trước tiên nên giảm nhạy cảm cho dữ liệu kinh doanh, loại bỏ thông tin cá nhân và các liên kết nhạy cảm, sau đó kiểm tra theo tiêu chí chấp nhận.

Sử dụng danh sách kiểm tra cho dịch tài liệu

Văn bản chính, liên kết, mã nguồn và cấu trúc của các trang web nên được xử lý riêng biệt. Bao gồm các phần được bảo vệ vào danh sách kiểm tra chấp nhận và sau đó đánh giá khả năng đọc và hiển thị trang sau khi dịch.

OmniDoc (Mục sản phẩm) cung cấp các cổng dịch tài liệu đa định dạng, và trang web chính thức của họ giới thiệu OCR, bảng thuật ngữ và các tính năng tham khảo song ngữ. Đối với các nhóm muốn bắt đầu trực tiếp từ file, đây là con đường đáng để đánh giá bằng các mẫu thực tế. Vui lòng sử dụng tệp ẩn danh mà bạn đã cho phép tải lên và xác minh kết quả với danh sách kiểm tra trong bài viết này. Điều này không khẳng định rằng OmniDoc sử dụng các thư viện mã nguồn mở hoặc thuật toán nội bộ được đề cập trong bài viết này, cũng như các ví dụ không thay thế kiểm thử hiệu suất sản phẩm.

📝 Tóm tắt

Phân tích chỉ trả lời "HTML trông như thế nào?"; bảo mật phụ thuộc vào danh sách trắng và xác minh thủ công. Đầu tiên, chạy các ví dụ trong môi trường phụ thuộc khóa, sau đó kiểm tra từng mục với các mẫu đã giảm nhạy cảm theo phiếu chấp nhận, và cuối cùng quyết định có tích hợp vào quy trình chính thức hay không.

Trải nghiệm ngay: Tải lên tài liệu của bạn để bắt đầu dịch, giữ nguyên định dạng gốc

Cập nhật lúc 2026-11-14