2009-09-11 27 views
6

Đây là tham chiếu đến this (excellent) answer. Ông tuyên bố rằng giải pháp tốt nhất để thoát khỏi đầu vào trong PHP là gọi mb_convert_encoding theo sau là html_entities.Tại sao gọi mb_convert_encoding để vệ sinh văn bản?

Nhưng tại sao chính xác bạn sẽ gọi mb_convert_encoding với cùng và từ các tham số (UTF8)?

Trích từ câu trả lời ban đầu:

Thậm chí nếu bạn sử dụng htmlspecialchars ($ string) bên ngoài của các thẻ HTML, bạn vẫn dễ bị tổn thương đa byte vectơ tấn công charset.

Cách hiệu quả nhất bạn có thể là sử dụng kết hợp mb_convert_encoding và htmlentities như sau.

$str = mb_convert_encoding($str, 'UTF-8', 'UTF-8'); 
$str = htmlentities($str, ENT_QUOTES, 'UTF-8'); 

Điều này có một số loại lợi ích tôi đang thiếu?

Trả lời

7

Không phải tất cả dữ liệu nhị phân đều hợp lệ UTF8. Gọi mb_convert_encoding với cùng từ/đến mã hóa là một cách đơn giản để đảm bảo rằng người ta đang xử lý một chuỗi được mã hóa chính xác cho mã hóa đã cho.

Một cách để khai thác các thiếu sót xác nhận UTF8 được mô tả trong phần 6 (cân nhắc an ninh) trong rfc2279:

Một ví dụ khác có thể là một phân tích cú pháp mà cấm chuỗi octet 2F 2E 2E 2F ("/ ../ "), nhưng cho phép trình tự octet bất hợp pháp 2F C0 AE 2E 2F.

này có thể dễ hiểu hơn bằng cách kiểm tra các đại diện nhị phân:

110xxxxx 10xxxxxx # header bits used by the encoding 
11000000 10101110 # C0 AE 
     00101110 # 2E the '.' character 

Nói cách khác: (C0 AE - header-bits) == '.'

Khi văn bản trích dẫn chỉ ra, C0 AE không phải là một chuỗi UTF8 octet hợp lệ , do đó, mb_convert_encoding sẽ xóa nó khỏi chuỗi (hoặc dịch nó thành '.', hoặc một cái gì đó khác :-).

Các vấn đề liên quan