Dữ liệu thử nghiệm mẫu UTF-8 Thực sự Tốt, Không tốt [đã đóng]


88

Vì vậy, chúng tôi có bảng gian lận XSS để kiểm tra tính năng lọc XSS của chúng tôi - nhưng ngoài một trang lành tính ví dụ, tôi không thể tìm thấy bất kỳ dữ liệu kiểm tra xấu hoặc không đúng định dạng nào để đảm bảo rằng mã UTF-8 của tôi có thể xử lý dữ liệu bị lỗi.

Tôi có thể tìm một số dữ liệu tốt uh .. xấu để kiểm tra ở đâu? Hay một chuỗi ký tự phức tạp là gì?


4
columbia.edu/kermit/utf8.html là một trong những tốt
Xeoncross


14
ăѣ𝔠 ծ ềſģȟ Ꭵ𝒋 ǩľḿꞑȯ𝘱𝑞𝗋𝘴ȶ𝞄𝜈ψ𝒙𝘆𝚣1234567890! @ # $% ^ & * () -_ = + [{]} ;: '", <.> /? ~𝘈Ḇ𝖢𝕯٤ḞԍНǏ𝙅ƘԸⲘ𝙉০Ρ𝗤Ɍ𝓢ȚЦ𝒱Ѡ𝓧ƳȤѧᖯć𝗱ễ𝑓𝙜Ⴙ𝞲𝑗𝒌ļṃʼnо𝞎𝒒ᵲꜱ𝙩ừ𝗏ŵ𝒙𝒚ź1234567890!@#$%^&*()-_=+[{]};:'",<.>/?~ АḂ Ⲥ𝗗𝖤𝗙 ꞠꓧȊ𝐉𝜥ꓡ𝑀𝑵Ǭ𝙿𝑄Ŗ𝑆𝒯𝖴𝘝𝘞ꓫŸ𝜡ả𝘢ƀ𝖼ḋếᵮℊ𝙝 Ꭵ𝕛 кιṃ դ ⱺ𝓅𝘲𝕣𝖘ŧ𝑢ṽẉ𝘅 ყ ž1234567890! @ # $% ^ & * () -_ = + [{]}; : '", <.> /? ~Ѧ𝙱ƇᗞΣℱԍҤ١𝔍К𝓛𝓜ƝȎ𝚸𝑄Ṛ𝓢ṮṺƲᏔꓫ𝚈𝚭𝜶Ꮟçძ𝑒𝖿𝗀ḧ𝗂𝐣ҝɭḿ𝕟𝐨𝝔𝕢ṛ𝓼тú𝔳ẃ⤬𝝲𝗓1234567890!@#$%^&*()-_=+[{]};:'",<.>/?~ 𝖠Β𝒞𝘋𝙴𝓕ĢȞỈ Հꓢ ṰǓⅤ𝔚 Ⲭ𝑌𝙕𝘢𝕤
Andrew

Câu trả lời:


98

1
Mặc dù bạn đã không nỗ lực vào việc này - trang đó chính là thứ tôi đang tìm kiếm. ;)
Xeoncross

75
Đừng quên, biết nơi để tìm câu trả lời thường quan trọng như biết câu trả lời.
Jonathan Leffler

19
Tôi cảnh báo bạn rằng thử nghiệm của anh ấy dựa trên một định nghĩa lỗi thời về UTF-8, khi các chuỗi 5 và 6 byte được cho phép, trước khi các mặt phẳng 17 trở lên bị xóa. Và nó ngụ ý rằng codepoint U + FFFE và U + FFFF không hợp lệ trong UTF-8, khi theo tổ hợp Unicode thì chúng không hợp lệ
Simon Kissane 23/02/14

35

Xem thêm Làm thế nào để một tệp có các ký tự Trung Quốc biết sử dụng bao nhiêu byte cho mỗi ký tự? - không nghi ngờ gì nữa, có những câu hỏi SO khác cũng sẽ hữu ích.

Trong UTF-8, bạn nhận được các loại byte sau:

Binary    Hex          Comments
0xxxxxxx  0x00..0x7F   Only byte of a 1-byte character encoding
10xxxxxx  0x80..0xBF   Continuation bytes (1-3 continuation bytes)
110xxxxx  0xC0..0xDF   First byte of a 2-byte character encoding
1110xxxx  0xE0..0xEF   First byte of a 3-byte character encoding
11110xxx  0xF0..0xF4   First byte of a 4-byte character encoding

(Dòng cuối cùng trông như thể nó phải đọc 0xF0..0xF7; tuy nhiên, phạm vi 21 bit của Unicode (U + 0000 - U + 10FFFF) có nghĩa là giá trị hợp lệ tối đa là 0xF4; các giá trị 0xF5..0xF7 không thể xảy ra trong UTF-8 hợp lệ.)

Xem xét liệu một chuỗi byte cụ thể có hợp lệ UTF-8 hay không có nghĩa là bạn cần suy nghĩ về:

  • Các byte tiếp tục xuất hiện ở nơi không mong đợi
  • Các byte không tiếp diễn xuất hiện ở nơi mong đợi một byte tiếp tục
  • Các ký tự không đầy đủ ở cuối chuỗi (biến thể của 'dự kiến ​​byte tiếp tục')
  • Trình tự không tối thiểu
  • UTF-16 thay thế

Trong UTF-8 hợp lệ, các byte 0xF5..0xFF không thể xảy ra.

Trình tự không tối thiểu

Có thể có nhiều biểu diễn cho một số ký tự. Ví dụ, ký tự Unicode U + 0000 (ASCII NUL) có thể được biểu thị bằng:

0x00
0xC0 0x80
0xE0 0x80 0x80
0xF0 0x80 0x80 0x80

Tuy nhiên, tiêu chuẩn Unicode nói rõ rằng ba lựa chọn thay thế cuối cùng không được chấp nhận vì chúng không phải là tối thiểu. Điều này xảy ra là các byte 0xC0 và 0xC1 không bao giờ có thể xuất hiện trong UTF-8 hợp lệ vì các ký tự duy nhất có thể được mã hóa bởi những ký tự đó được mã hóa tối thiểu thành các ký tự byte đơn trong phạm vi 0x00..0x7F.

Đại diện UTF-16

Trong Mặt phẳng đa ngôn ngữ Cơ bản (BMP), các giá trị Unicode U + D800 - U + DFFF được dành riêng cho các đại diện UTF-16 và không thể xuất hiện được mã hóa trong UTF-8 hợp lệ. Nếu chúng hợp lệ trong UTF-8 (mà tôi nhấn mạnh, chúng không hợp lệ), thì các đại diện sẽ được mã hóa:

  • U + D800 - 0xED 0xA0 0x80 (thay thế cao nhỏ nhất)
  • U + DBFF - 0xED 0xAF 0xBF (thay thế cao lớn nhất)
  • U + DC00 - 0xED 0xB0 0x80 (thay thế thấp nhất nhỏ nhất)
  • U + DFFF - 0xED 0xBF 0xBF (thay thế thấp nhất lớn nhất)

Dữ liệu xấu

Vì vậy, dữ liệu BAD của bạn phải chứa các mẫu vi phạm các đơn thuốc khác nhau này.

  • Byte tiếp tục không đứng trước một trong các giá trị byte ban đầu
  • Các byte ban đầu gồm nhiều ký tự không được theo sau bởi đủ các byte tiếp theo
  • Các ký tự nhiều byte không tối thiểu
  • UTF-16 thay thế
  • Các byte không hợp lệ (0xC0, 0xC1, 0xF5..0xFF).

Lưu ý rằng dấu thứ tự byte (BOM) U + FEFF, còn gọi là khoảng cách không ngắt độ rộng bằng 0 (ZWNBSP), không thể xuất hiện không được mã hóa trong UTF-8 - các byte 0xFF và 0xFE không được phép trong UTF-8 hợp lệ. Một ZWNBSP được mã hóa có thể xuất hiện trong tệp UTF-8 dưới dạng 0xEF 0xBB 0xBF, nhưng BOM hoàn toàn không cần thiết trong UTF-8.


Ngoài ra còn có một số noncharacters trong Unicode. U + FFFE và U + FFFF là hai ký tự không như vậy (và hai điểm mã cuối cùng trong mỗi mặt phẳng, U + 1FFFE, U + 1FFFF, U + 2FFFE, U + 2FFFF, ... U + 10FFFE, U + 10FFFF là những ký tự khác ). Chúng thường không xuất hiện trong dữ liệu Unicode để trao đổi dữ liệu, nhưng có thể xuất hiện trong mục đích sử dụng riêng. Xem liên kết Câu hỏi thường gặp về Unicode để biết nhiều chi tiết sơ sài, bao gồm lịch sử khá phức tạp của các ký tự không phải ký tự trong Unicode. ( Corrigendum # 9: Làm rõ về các ký tự không phải ký tự, được phát hành vào tháng 1 năm 2013, thực hiện những gì tiêu đề của nó gợi ý - làm rõ ý nghĩa của các ký tự không phải.)


Cảm ơn vì danh sách tuyệt vời này. Tôi dự định kiểm tra chi tiết hơn từng cái này ngay bây giờ.
Xeoncross

3
Nhận xét rằng các ký tự không phải "không được xuất hiện trong dữ liệu được mã hóa UTF-8" là gây hiểu lầm. Các ký tự không phải không được xuất hiện trong dữ liệu được mã hóa UTF-8 dành cho trao đổi mở , nhưng dù sao cũng nên được chấp nhận bởi bộ mã hóa / giải mã UTF-8
Simon Kissane

@SimonKissane: Có vẻ như tôi là một trong số rất nhiều người bối rối trước hiện trạng của Corrigendum # 9 , được phát hành vào tháng 1 năm 2013. Toàn bộ phần của Unicode hỏi thường gặp trên noncharacters là đáng đọc. Cảm ơn bạn về thông tin. (Tôi cũng sẽ lưu ý rằng các nhận xét của tôi nói 'nên' đồng ý với những gì tiêu chuẩn Unicode đã nói (nhưng không phải 'nói'); mục đích là chúng không nên xuất hiện trong 'trao đổi mở' nhưng có thể được sử dụng để 'sử dụng nội bộ '.)
Jonathan Leffler

1
@AdrianMaire: Xem bảng 3.6 trong Chương 3 của tiêu chuẩn Unicode (9.0.0) (số trang 125; p54 của tệp PDF). Tôi không chắc bạn đang tham khảo những nguồn nào khác, nhưng tôi nghĩ những gì tôi đã nói đều nằm trong bảng đó.
Jonathan Leffler

@JonathanLeffler Bạn đúng 100%, Cảm ơn bạn đã tham khảo.
Adrian Maire

17

Bạn có thể sử dụng công cụ trực tuyến tiện dụng này của Jeffrey Bergamini để chuyển đổi bất kỳ văn bản nào thành một chuỗi UTF8 thực sự kỳ lạ của Homoglyphs.

Một điển hình

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

trở nên như thế này:

Ḽơᶉëᶆ ȋṕšᶙṁ ḍỡḽǭᵳ ʂǐť ӓṁệẗ, ĉṓɲṩḙċťᶒțûɾ ấɖḯƥĭṩčįɳġ ḝłįʈ, șếᶑ ᶁⱺ ẽḭŭŝḿꝋď ṫĕᶆᶈṓɍ ỉñḉīḑȋᵭṵńť ṷŧ ḹấḇőꝛế éȶ đꝍꞎôꝛȇ ᵯáꞡᶇā ąⱡîɋṹ.


6
Tôi cho rằng đó là vì điều này không thực sự giúp ích cho việc kiểm tra UTF8: bạn không nhận được bất kỳ điều gì gần với toàn bộ các trường hợp, không có trường hợp "xấu" nào và định dạng không thực sự hữu ích cho việc thử nghiệm. Nó chỉ là một cách để có được các ký tự lạ.
Adrian Maire

Bạn đã thử chưa? Máy phát điện đó không phải để mua vui. Nó cung cấp cho bạn các ký tự từ phạm vi UTF-8 đầy đủ và vì chúng giống một cách kỳ lạ với các ký tự thực nên bạn có thể 'xem' những ký tự nào đang gây ra vấn đề cho bạn. Trong ví dụ tôi đã đăng, có 6 ký tự mà iPhone của tôi hiển thị dưới dạng dấu hỏi đóng hộp.
Shebuka

4
IMO, công cụ tuyệt vời này có thể là một "Giá trị gia tăng" rất tốt cho lời giải thích, nhưng không phù hợp như một câu trả lời của chính nó trong SO (cũng vì trang có thể bị ngừng hoạt động). Dù sao, tôi đồng ý rằng -1 mà không có lời giải thích không phải là rất xây dựng.
Adrian Maire

Vì vậy, đây là "dữ liệu thử nghiệm ví dụ utf-8 tốt, tốt" ... đáng được ủng hộ vì nó có liên quan, IMO
Rondo


2

Off đỉnh đầu của tôi:

0xff và 0xfe

Các byte bit cao đơn lẻ

Biểu diễn nhiều byte của các ký tự byte thấp - Một cách tốt để nhập lậu các ký tự rỗng qua các lần kiểm tra ban đầu

Dấu thứ tự byte - Bạn có định bỏ qua chúng không?

NFC so với NFD

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.