Trình chuyển đổi tìm các ký tự quan trọng trong nguồn HTML và thay thế chúng bằng các thực thể HTML tương ứng
Các ký tự cần thoát trong HTML là
foo" onmouseover="alert[1]
4 [dấu và] luôn cần được thoátfoo" onmouseover="alert[1]
5 [nhỏ hơn] và '>' [lớn hơn] khi bên trong một phần tửfoo" onmouseover="alert[1]
6 [trích dẫn] khi bên trong giá trị thuộc tính được trích dẫn képfoo" onmouseover="alert[1]
7 [dấu nháy đơn] khi bên trong một giá trị thuộc tính trích dẫn đơn. Dấu nháy đơn được thoát thànhfoo" onmouseover="alert[1]
7 thay vìfoo" onmouseover="alert[1]
7 vì không phải tất cả các trình duyệt đều hiểufoo" onmouseover="alert[1]
7foo" onmouseover="alert[1]
1 [dấu gạch chéo] nên được thoát vì nó có thể được sử dụng để chấm dứt một phần tử trong một số ngôn ngữ HTML
Thoát
foo" onmouseover="alert[1]2 [lớn hơn] là không cần thiết, nhưng kết quả thường dễ đọc hơn nếu lớn hơn cũng được thoát bất cứ khi nào nhỏ hơn
Đây là một ví dụ cổ điển về việc làm cho đầu vào an toàn hơn trong một ngữ cảnh—trong trường hợp này, là nội dung của phần tử
foo" onmouseover="alert[1]1—mà không xem xét các ngữ cảnh khác mà nó có thể được sử dụng, chẳng hạn như bên trong một giá trị thuộc tính
Escaping &, , and " isn’t enough
Các ký tự
foo" onmouseover="alert[1]2,
foo" onmouseover="alert[1]5,
foo" onmouseover="alert[1]2 và
foo" onmouseover="alert[1]0 là những ký tự thường được nhắm mục tiêu nhất bởi HTML triển khai trình thoát. Đây dường như là bộ ký tự tối thiểu mà mọi người nghĩ rằng cần phải thoát. Thật không may, nó vẫn không an toàn nếu bạn không có toàn quyền kiểm soát nơi các giá trị thoát sẽ được sử dụng.
Xem xét mẫu sau, trong đó tác giả mẫu đã sử dụng các giá trị thuộc tính trích dẫn đơn
foo" onmouseover="alert[1]6
foo" onmouseover="alert[1]7 phổ biến của PHP và như bạn có thể đoán, nó vẫn thuộc về các giá trị thuộc tính vì hai lý do
Đầu tiên, như người dùng Hacker News DanBlake và nbpoole đã chỉ ra trong một cuộc thảo luận về bài đăng trên blog này, Internet Explorer coi
foo" onmouseover="alert[1]8 là dấu phân cách thuộc tính. Nó có thể là một trường hợp cạnh, nhưng nó vẫn là một phương tiện tấn công tiềm năng, vì vậy cũng cần phải thoát khỏi
foo" onmouseover="alert[1]8
Thứ hai, HTML cũng cho phép các giá trị thuộc tính hoàn toàn không được trích dẫn. Dù bạn có tin hay không thì tùy, các giá trị thuộc tính không được trích dẫn khá phổ biến [một số người quá lười biếng để trích dẫn chúng, những người khác là những người quá cuồng tín về hiệu suất, những người không thể chịu được ý nghĩ lãng phí những byte thừa đó].
Các giá trị thuộc tính không được trích dẫn là một trong các vectơ XSS lớn nhất có. Nếu bạn không trích dẫn các giá trị thuộc tính của mình, thì về cơ bản, bạn đang mở rộng cửa cho những kẻ hư hỏng đưa những thứ hư hỏng vào HTML của bạn. Rất ít triển khai bộ thoát bao gồm tất cả các trường hợp cạnh cần thiết để ngăn các giá trị thuộc tính không được trích dẫn trở thành vectơ XSS .
Escaping &, , ", ', `, , !, @, $, %, [, ], =, +, {, }, [, and ] is almost enough
Tất cả các ký tự trên đó [bao gồm cả ký tự khoảng trắng. ] có thể được sử dụng để thoát khỏi giá trị thuộc tính HTML không được trích dẫn. Nếu bạn thoát khỏi tất cả những người cuối cùng trong số họ, thì có lẽ bạn đã gần được an toàn. Nhưng bạn vẫn không an toàn đến mức bạn có thể bắt đầu ném xung quanh đầu vào của người dùng dù muốn hay không.
foo" onmouseover="alert[1] 0
…vào thứ gì đó có khả năng gây hại
foo" onmouseover="alert[1]1
Tôi khuyên bạn nên chỉ định UTF -8 bộ ký tự trong cả
[username]1 HTTP response header and a
[username]2 tag, since it’s easy for one or the other to get switched off or omitted inadvertently as a codebase ages [this has happened to me].
đọc thêm
Như tôi đã đề cập trong tuyên bố từ chối trách nhiệm ở đầu bài đăng này, đây không phải là tài liệu tham khảo toàn diện về tất cả những vấn đề có thể xảy ra với HTML escaping. It’s not even a guide. It’s more of a tip-of-the-iceberg preview. Please don’t assume that, having read this post, you now know everything there is to know about HTML thoát. Tôi có thể đảm bảo rằng bạn không, bởi vì tôi không.
Tôi đã học được rất nhiều từ các nguồn sau đây và tôi thực sự khuyên bạn nên sử dụng chúng nếu bạn muốn tìm hiểu thêm