Làm cách nào để thoát khỏi thực thể HTML trong PHP?

"Thực thể HTML" là một biểu diễn văn bản của một ký tự mà theo cách khác sẽ được hiểu là mã HTML

Ví dụ: các ký tự

- htmlspecialchars_decode($string, ENT_COMPAT);
+ htmlspecialchars_decode($string, ENT_QUOTES | ENT_SUBSTITUTE);
8 và
- htmlspecialchars_decode($string, ENT_COMPAT);
+ htmlspecialchars_decode($string, ENT_QUOTES | ENT_SUBSTITUTE);
9 được sử dụng để xác định thẻ HTML.
- htmlspecialchars_decode($string, ENT_COMPAT);
+ htmlspecialchars_decode($string, ENT_QUOTES | ENT_SUBSTITUTE);
0. Biểu diễn thực thể HTML cho
- htmlspecialchars_decode($string, ENT_COMPAT);
+ htmlspecialchars_decode($string, ENT_QUOTES | ENT_SUBSTITUTE);
8 và
- htmlspecialchars_decode($string, ENT_COMPAT);
+ htmlspecialchars_decode($string, ENT_QUOTES | ENT_SUBSTITUTE);
9 là
- htmlspecialchars_decode($string, ENT_COMPAT);
+ htmlspecialchars_decode($string, ENT_QUOTES | ENT_SUBSTITUTE);
2 và
- htmlspecialchars_decode($string, ENT_COMPAT);
+ htmlspecialchars_decode($string, ENT_QUOTES | ENT_SUBSTITUTE);
3. Các thực thể HTML này có thể được sử dụng một cách an toàn trong tài liệu HTML và các trình duyệt sẽ không diễn giải chúng dưới dạng mã HTML, mà là văn bản theo nghĩa đen ở dạng ban đầu của chúng —
- htmlspecialchars_decode($string, ENT_COMPAT);
+ htmlspecialchars_decode($string, ENT_QUOTES | ENT_SUBSTITUTE);
4 sẽ không được trình duyệt diễn giải dưới dạng mã HTML, nhưng được sử dụng để hiển thị
- htmlspecialchars_decode($string, ENT_COMPAT);
+ htmlspecialchars_decode($string, ENT_QUOTES | ENT_SUBSTITUTE);
0 dưới dạng chữ

PHP có các chức năng tích hợp để chuyển đổi các ký tự HTML nhất định thành các thực thể HTML

  • - htmlspecialchars_decode($string, ENT_COMPAT);
    + htmlspecialchars_decode($string, ENT_QUOTES | ENT_SUBSTITUTE);
    6. Chuyển đổi các ký tự đặc biệt thành các thực thể HTML
  • - htmlspecialchars_decode($string, ENT_COMPAT);
    + htmlspecialchars_decode($string, ENT_QUOTES | ENT_SUBSTITUTE);
    7. Chuyển đổi các thực thể HTML đặc biệt trở lại ký tự
  • - htmlspecialchars_decode($string, ENT_COMPAT);
    + htmlspecialchars_decode($string, ENT_QUOTES | ENT_SUBSTITUTE);
    8. Chuyển đổi tất cả các ký tự áp dụng thành các thực thể HTML
  • - htmlspecialchars_decode($string, ENT_COMPAT);
    + htmlspecialchars_decode($string, ENT_QUOTES | ENT_SUBSTITUTE);
    9. Chuyển đổi các thực thể HTML thành các ký tự tương ứng của chúng
  • - htmlentities($string, ENT_COMPAT);
    + htmlentities($string, ENT_QUOTES | ENT_SUBSTITUTE);
    0. Trả về bảng dịch được sử dụng bởi các hàm
    - htmlspecialchars_decode($string, ENT_COMPAT);
    + htmlspecialchars_decode($string, ENT_QUOTES | ENT_SUBSTITUTE);
    6 và
    - htmlspecialchars_decode($string, ENT_COMPAT);
    + htmlspecialchars_decode($string, ENT_QUOTES | ENT_SUBSTITUTE);
    8

Trước PHP 8. 1, hành vi mặc định của các hàm

- htmlspecialchars_decode($string, ENT_COMPAT);
+ htmlspecialchars_decode($string, ENT_QUOTES | ENT_SUBSTITUTE);
6 và
- htmlspecialchars_decode($string, ENT_COMPAT);
+ htmlspecialchars_decode($string, ENT_QUOTES | ENT_SUBSTITUTE);
8 là chuyển đổi các ký tự
- htmlentities($string, ENT_COMPAT);
+ htmlentities($string, ENT_QUOTES | ENT_SUBSTITUTE);
5,
- htmlspecialchars_decode($string, ENT_COMPAT);
+ htmlspecialchars_decode($string, ENT_QUOTES | ENT_SUBSTITUTE);
8,
- htmlspecialchars_decode($string, ENT_COMPAT);
+ htmlspecialchars_decode($string, ENT_QUOTES | ENT_SUBSTITUTE);
9 và
- htmlentities($string, ENT_COMPAT);
+ htmlentities($string, ENT_QUOTES | ENT_SUBSTITUTE);
8 thành các thực thể HTML tương ứng của chúng, nhưng nó không chuyển đổi các dấu nháy đơn (
- htmlentities($string, ENT_COMPAT);
+ htmlentities($string, ENT_QUOTES | ENT_SUBSTITUTE);
9) thành các thực thể HTML. Hơn nữa, nó trả về một chuỗi rỗng nếu có một ký tự không hợp lệ trong văn bản đã cho


Từ PHP8. 1 trở lên, các tham số mặc định của các chức năng này được thay đổi, do đó, nó cũng chuyển đổi các ký tự trích dẫn đơn. Ngược lại với hành vi trả về một chuỗi trống cho một chuỗi chứa ký tự không hợp lệ trước đây, hành vi mặc định của các hàm này trong PHP 8. 1 trở lên là thay thế các ký tự không hợp lệ bằng ký tự

- htmlspecialchars_decode($string, ENT_COMPAT);
+ htmlspecialchars_decode($string, ENT_QUOTES | ENT_SUBSTITUTE);
50 (U+FFFD)

Ký tự "�" được gọi là Ký tự thay thế Unicode. Ký tự này được sử dụng để đại diện cho một ký tự không thể được đại diện hoặc là một giá trị không hợp lệ.
"�" cũng có thể được sử dụng trong mã PHP với `"\u{FFFD}", sử dụng.


Về cơ bản, điều này có nghĩa là chữ ký của các hàm được đề cập ở trên đã thay đổi trong PHP 8. 1

- htmlspecialchars_decode($string, ENT_COMPAT);
+ htmlspecialchars_decode($string, ENT_QUOTES | ENT_SUBSTITUTE);
6

- htmlspecialchars_decode($string, ENT_COMPAT);
+ htmlspecialchars_decode($string, ENT_QUOTES | ENT_SUBSTITUTE);
7

- htmlspecialchars_decode($string, ENT_COMPAT);
+ htmlspecialchars_decode($string, ENT_QUOTES | ENT_SUBSTITUTE);
7

- htmlspecialchars_decode($string, ENT_COMPAT);
+ htmlspecialchars_decode($string, ENT_QUOTES | ENT_SUBSTITUTE);

- htmlspecialchars_decode($string, ENT_COMPAT);
+ htmlspecialchars_decode($string, ENT_QUOTES | ENT_SUBSTITUTE);
8

- htmlentities($string, ENT_COMPAT);
+ htmlentities($string, ENT_QUOTES | ENT_SUBSTITUTE);

- htmlspecialchars_decode($string, ENT_COMPAT);
+ htmlspecialchars_decode($string, ENT_QUOTES | ENT_SUBSTITUTE);
54

- htmlspecialchars_decode($string, ENT_COMPAT);
+ htmlspecialchars_decode($string, ENT_QUOTES | ENT_SUBSTITUTE);
5

- htmlentities($string, ENT_COMPAT);
+ htmlentities($string, ENT_QUOTES | ENT_SUBSTITUTE);
0

- htmlspecialchars_decode($string, ENT_COMPAT);
+ htmlspecialchars_decode($string, ENT_QUOTES | ENT_SUBSTITUTE);
5

Tác động của sự thay đổi này

Với giá trị mặc định của các hàm này được thay đổi từ

- htmlspecialchars_decode($string, ENT_COMPAT);
+ htmlspecialchars_decode($string, ENT_QUOTES | ENT_SUBSTITUTE);
56 thành
- htmlspecialchars_decode($string, ENT_COMPAT);
+ htmlspecialchars_decode($string, ENT_QUOTES | ENT_SUBSTITUTE);
57, có hai thay đổi chính

Các ký tự trích dẫn đơn (- htmlentities($string, ENT_COMPAT); + htmlentities($string, ENT_QUOTES | ENT_SUBSTITUTE);9) được chuyển đổi thành thực thể HTML của nó (- htmlspecialchars_decode($string, ENT_COMPAT); + htmlspecialchars_decode($string, ENT_QUOTES | ENT_SUBSTITUTE);59)

Với cờ mặc định được thay đổi từ

- htmlspecialchars_decode($string, ENT_COMPAT);
+ htmlspecialchars_decode($string, ENT_QUOTES | ENT_SUBSTITUTE);
56 thành
- htmlspecialchars_decode($string, ENT_COMPAT);
+ htmlspecialchars_decode($string, ENT_QUOTES | ENT_SUBSTITUTE);
51, đây là một cải tiến bảo mật, bởi vì trước PHP 8. 1, việc sử dụng
- htmlspecialchars_decode($string, ENT_COMPAT);
+ htmlspecialchars_decode($string, ENT_QUOTES | ENT_SUBSTITUTE);
52 vốn đã không an toàn vì các trích dẫn đơn không được chuyển đổi thành một thực thể HTML. Nhiều khung/thư viện giảm thiểu điều này bằng cách sử dụng rõ ràng mẫu
- htmlspecialchars_decode($string, ENT_COMPAT);
+ htmlspecialchars_decode($string, ENT_QUOTES | ENT_SUBSTITUTE);
53, chuyển đổi cả dấu ngoặc kép và dấu ngoặc đơn

Thay thế ký tự không hợp lệ

Với việc sử dụng

- htmlspecialchars_decode($string, ENT_COMPAT);
+ htmlspecialchars_decode($string, ENT_QUOTES | ENT_SUBSTITUTE);
54 làm cờ mặc định, nếu văn bản chứa ký tự không hợp lệ, các ký tự đó sẽ được thay thế bằng
- htmlspecialchars_decode($string, ENT_COMPAT);
+ htmlspecialchars_decode($string, ENT_QUOTES | ENT_SUBSTITUTE);
50 ký tự, thay vì trả về một chuỗi
hoàn toàn trống.

- htmlspecialchars_decode($string, ENT_COMPAT);
+ htmlspecialchars_decode($string, ENT_QUOTES | ENT_SUBSTITUTE);
6

- htmlspecialchars_decode($string, ENT_COMPAT);
+ htmlspecialchars_decode($string, ENT_QUOTES | ENT_SUBSTITUTE);
56 ở trên không hợp lệ

- htmlspecialchars_decode($string, ENT_COMPAT);
+ htmlspecialchars_decode($string, ENT_QUOTES | ENT_SUBSTITUTE);
8

Trong PHP8. 1, các ký tự không hợp lệ được thay thế bằng ký tự

- htmlspecialchars_decode($string, ENT_COMPAT);
+ htmlspecialchars_decode($string, ENT_QUOTES | ENT_SUBSTITUTE);
50 do cờ
- htmlspecialchars_decode($string, ENT_COMPAT);
+ htmlspecialchars_decode($string, ENT_QUOTES | ENT_SUBSTITUTE);
54 xuất hiện dưới dạng giá trị mặc định

Lưu ý rằng tùy chọn

- htmlspecialchars_decode($string, ENT_COMPAT);
+ htmlspecialchars_decode($string, ENT_QUOTES | ENT_SUBSTITUTE);
54 mặc định mới khác với tùy chọn
- htmlspecialchars_decode($string, ENT_COMPAT);
+ htmlspecialchars_decode($string, ENT_QUOTES | ENT_SUBSTITUTE);
60.
- htmlspecialchars_decode($string, ENT_COMPAT);
+ htmlspecialchars_decode($string, ENT_QUOTES | ENT_SUBSTITUTE);
60 có khả năng không an toàn vì nó thay thế các ký tự không hợp lệ bằng một chuỗi trống, nhưng trả về phần còn lại của chuỗi đã chuyển đổi. Điều này cho phép kẻ tấn công tạo ra các chuỗi độc hại ban đầu có thể không được phát hiện là độc hại, nhưng trở thành văn bản độc hại sau khi các ký tự không hợp lệ bị xóa


Tác động tương thích ngược

Các giá trị mặc định cho năm chức năng được thay đổi. Điều này có nghĩa là bất kỳ lệnh gọi hàm nào không đặt rõ ràng các giá trị mặc định cho cờ hàm sẽ trả về các kết quả khác nhau

Nhiều khung và thư viện sử dụng

- htmlspecialchars_decode($string, ENT_COMPAT);
+ htmlspecialchars_decode($string, ENT_QUOTES | ENT_SUBSTITUTE);
57 làm giá trị cờ mặc định và sẽ không thấy bất kỳ sự khác biệt nào trong chức năng của nó

Hầu hết các khung và thư viện sử dụng

- htmlspecialchars_decode($string, ENT_COMPAT);
+ htmlspecialchars_decode($string, ENT_QUOTES | ENT_SUBSTITUTE);
51 vì mặc định
- htmlspecialchars_decode($string, ENT_COMPAT);
+ htmlspecialchars_decode($string, ENT_QUOTES | ENT_SUBSTITUTE);
56 không an toàn vì nó không chuyển đổi dấu nháy đơn. Các khung đó sẽ không thấy bất kỳ thay đổi nào đối với hành vi chuyển đổi trích dẫn đơn, nhưng cờ
- htmlspecialchars_decode($string, ENT_COMPAT);
+ htmlspecialchars_decode($string, ENT_QUOTES | ENT_SUBSTITUTE);
54 mới sẽ khiến chúng xử lý các ký tự UTF-8 không hợp lệ bằng hành vi thay thế thay vì trả về một chuỗi trống

Có thể hoàn nguyên PHP 8. 1 thay đổi bằng cách đặt rõ ràng giá trị mặc định thành các giá trị hiện có. Tuy nhiên, giá trị mặc định mới rất được khuyến khích vì đây là giá trị mặc định an toàn và bảo mật

Làm cách nào để thoát HTML trong PHP?

Mẹo. Để chuyển đổi các thực thể HTML đặc biệt trở lại thành các ký tự, hãy sử dụng hàm htmlspecialchars_decode(). .
& (dấu và) trở thành &
" (trích dẫn kép) trở thành "
' (trích dẫn đơn) trở thành '
< (nhỏ hơn) trở thành <
> (lớn hơn) trở thành >

Làm cách nào để chuyển đổi các thực thể HTML trong PHP?

Hàm htmlentities() chuyển đổi ký tự thành thực thể HTML . Mẹo. Để chuyển đổi các thực thể HTML trở lại ký tự, hãy sử dụng hàm html_entity_decode(). Mẹo. Sử dụng hàm get_html_translation_table() để trả về bảng dịch được sử dụng bởi htmlentities().

Làm cách nào để thoát các ký tự đặc biệt trong PHP?

Thoát nhân vật . the backslash sign ( \ ) is used as an "escape character".

Làm cách nào để chuyển đổi nội dung HTML thành chuỗi trong PHP?

Hàm html_entity_decode() chuyển đổi thực thể HTML thành ký tự. Hàm html_entity_decode() ngược lại với htmlentities().