ดีจริงข้อมูลการทดสอบ UTF-8 ไม่ดี [ปิด]


89

ดังนั้นเราจึงมีเอกสารโกง XSSเพื่อทดสอบการกรอง XSS ของเรา - แต่นอกเหนือจากหน้าตัวอย่างที่ไม่เป็นอันตรายฉันไม่พบข้อมูลการทดสอบที่ชั่วร้ายหรือผิดรูปแบบเพื่อให้แน่ใจว่ารหัส UTF-8 ของฉันสามารถจัดการข้อมูลที่ผิดพลาดได้

จะหาข้อมูลดีๆมาทดสอบได้ที่ไหน หรือลำดับตัวอักษรที่ยุ่งยากคืออะไร?


4
columbia.edu/kermit/utf8.htmlเป็นอีกหนึ่งสิ่งที่ดี
Xeoncross


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

คำตอบ:


99

1
แม้ว่าคุณจะไม่ได้ใช้ความพยายามใด ๆ แต่หน้านั้นเป็นเพียงสิ่งที่ฉันกำลังมองหา ;)
Xeoncross

76
อย่าลืมว่าการรู้ว่าจะหาคำตอบได้ที่ไหนมักสำคัญพอ ๆ กับการรู้คำตอบ
Jonathan Leffler

19
ฉันเตือนคุณว่าการทดสอบของเขาเป็นไปตามคำจำกัดความที่ล้าสมัยของ UTF-8 เมื่ออนุญาตให้ใช้ลำดับ 5 และ 6 ไบต์ก่อนที่เครื่องบิน 17 ขึ้นไปจะถูกลบ และหมายความว่า codepoints U + FFFE และ U + FFFF ไม่ถูกต้องใน UTF-8 เมื่อตามกลุ่ม Unicode พวกเขาไม่ได้เป็น
Simon Kissane

36

ดูเพิ่มเติมได้อย่างไรว่าไฟล์ที่มีตัวอักษรจีนรู้จำนวนไบต์ที่ต้องใช้ต่ออักขระ? - ไม่ต้องสงสัยเลยว่ามีคำถาม SO อื่น ๆ ที่จะช่วยได้เช่นกัน

ใน UTF-8 คุณจะได้รับไบต์ประเภทต่อไปนี้:

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

(บรรทัดสุดท้ายดูเหมือนว่าควรอ่าน 0xF0..0xF7 อย่างไรก็ตามช่วง 21 บิตของ Unicode (U + 0000 - U + 10FFFF) หมายความว่าค่าที่ถูกต้องสูงสุดคือ 0xF4 ค่า 0xF5..0xF7 ไม่สามารถเกิดขึ้นได้ใน UTF-8 ที่ถูกต้อง)

การพิจารณาว่าลำดับไบต์เฉพาะเป็น UTF-8 ที่ถูกต้องหรือไม่หมายความว่าคุณต้องคิดถึง:

  • ไบต์ต่อเนื่องปรากฏในที่ที่ไม่คาดคิด
  • ไบต์ที่ไม่ต่อเนื่องปรากฏขึ้นซึ่งคาดว่าจะมีไบต์ต่อเนื่อง
  • อักขระที่ไม่สมบูรณ์ในตอนท้ายของสตริง (รูปแบบของ 'คาดว่าไบต์ต่อเนื่อง')
  • ลำดับที่ไม่น้อยที่สุด
  • UTF-16 ตัวแทน

ใน UTF-8 ที่ถูกต้องไม่สามารถเกิดไบต์ 0xF5..0xFF ได้

ลำดับที่ไม่น้อยที่สุด

มีการแสดงที่เป็นไปได้หลายอย่างสำหรับอักขระบางตัว ตัวอย่างเช่นอักขระ Unicode U + 0000 (ASCII NUL) สามารถแสดงโดย:

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

อย่างไรก็ตามมาตรฐาน Unicode ระบุไว้อย่างชัดเจนว่าทางเลือกสามทางเลือกสุดท้ายไม่สามารถยอมรับได้เนื่องจากมีไม่น้อย มันจะเกิดขึ้นที่ไบต์ 0xC0 และ 0xC1 ไม่สามารถปรากฏใน UTF-8 ที่ถูกต้องได้เนื่องจากอักขระเพียงตัวเดียวที่สามารถเข้ารหัสโดยเหล่านั้นได้รับการเข้ารหัสน้อยที่สุดเป็นอักขระไบต์เดียวในช่วง 0x00..0x7F

UTF-16 ตัวแทน

ภายใน Basic Multi-lingual Plane (BMP) ค่า Unicode U + D800 - U + DFFF สงวนไว้สำหรับตัวแทน UTF-16 และไม่สามารถเข้ารหัสใน UTF-8 ที่ถูกต้องได้ หากถูกต้องใน UTF-8 (ซึ่งฉันเน้นว่าไม่ใช่) ตัวแทนจะถูกเข้ารหัส:

  • U + D800 - 0xED 0xA0 0x80 (ตัวแทนระดับสูงที่เล็กที่สุด)
  • U + DBFF - 0xED 0xAF 0xBF (ตัวแทนสูงที่ใหญ่ที่สุด)
  • U + DC00 - 0xED 0xB0 0x80 (ตัวแทนต่ำสุดที่เล็กที่สุด)
  • U + DFFF - 0xED 0xBF 0xBF (ตัวแทนต่ำสุดที่ใหญ่ที่สุด)

ข้อมูลไม่ถูกต้อง

ดังนั้นข้อมูล BAD ของคุณควรมีตัวอย่างที่ละเมิดข้อกำหนดต่างๆเหล่านี้

  • ไบต์ต่อเนื่องไม่ได้นำหน้าด้วยค่าไบต์เริ่มต้นอย่างใดอย่างหนึ่ง
  • ไบต์เริ่มต้นแบบหลายอักขระไม่ได้ตามด้วยไบต์ความต่อเนื่องเพียงพอ
  • อักขระแบบหลายไบต์ที่ไม่น้อยที่สุด
  • UTF-16 ตัวแทน
  • ไบต์ไม่ถูกต้อง (0xC0, 0xC1, 0xF5..0xFF)

โปรดทราบว่าเครื่องหมายลำดับไบต์ (BOM) U + FEFF หรือที่เรียกว่าช่องว่างที่ไม่มีความกว้างเป็นศูนย์ (ZWNBSP) ไม่สามารถปรากฏขึ้นโดยไม่ได้เข้ารหัสใน UTF-8 - ไม่อนุญาตให้ใช้ไบต์ 0xFF และ 0xFE ใน UTF-8 ที่ถูกต้อง ZWNBSP ที่เข้ารหัสสามารถปรากฏในไฟล์ UTF-8 เป็น 0xEF 0xBB 0xBF แต่ BOM นั้นไม่จำเป็นอย่างยิ่งใน UTF-8


นอกจากนี้ยังมีnoncharactersบางตัวใน Unicode U + FFFE และ U + FFFF เป็นตัวอักษรสองตัว (และสองจุดรหัสสุดท้ายในแต่ละระนาบ, U + 1FFFE, U + 1FFFF, U + 2FFFE, U + 2FFFF, ... U + 10FFFE, U + 10FFFF เป็นอื่น ๆ ). โดยปกติสิ่งเหล่านี้ไม่ควรปรากฏในข้อมูล Unicode สำหรับการแลกเปลี่ยนข้อมูล แต่สามารถปรากฏในการใช้งานส่วนตัว ดูลิงก์คำถามที่พบบ่อยของ Unicode สำหรับรายละเอียดที่ไม่ดีรวมถึงประวัติที่ค่อนข้างซับซ้อนของ noncharacters ใน Unicode ( Corrigendum # 9: Clarification About Noncharactersซึ่งเปิดตัวในเดือนมกราคม 2013 ทำในสิ่งที่ชื่อแนะนำ - ชี้แจงความหมายของอักขระที่ไม่ใช่ตัวอักษร)


ขอบคุณสำหรับรายการที่ดีนี้ ฉันวางแผนที่จะตรวจสอบข้อมูลเหล่านี้โดยละเอียดในขณะนี้
Xeoncross

3
ความคิดเห็นที่ไม่ใช่อักขระ "ไม่ควรปรากฏในข้อมูลที่เข้ารหัส UTF-8" นั้นทำให้เข้าใจผิด อักขระที่ไม่ใช่อักขระไม่ควรปรากฏในข้อมูลที่เข้ารหัส UTF-8 ซึ่งมีไว้สำหรับการแลกเปลี่ยนแบบเปิดแต่อย่างไรก็ตามควรยอมรับโดยตัวเข้ารหัส / ตัวถอดรหัส UTF-8
Simon Kissane

@SimonKissane: เห็นได้ชัดว่าฉันเป็นหนึ่งในหลาย ๆ คนที่สับสนกับสถานะเดิมของ Ante Corrigendum # 9ซึ่งเปิดตัวในเดือนมกราคม 2013 ส่วนทั้งหมดของ Unicode FAQ เกี่ยวกับnoncharactersนั้นคุ้มค่าแก่การอ่าน ขอบคุณสำหรับข้อมูล. (ฉันจะสังเกตด้วยว่าความคิดเห็นของฉันระบุว่า 'ควร' ซึ่งเห็นด้วยกับสิ่งที่มาตรฐาน Unicode กล่าว (แต่ไม่ใช่ 'พูด') ความตั้งใจคือไม่ควรปรากฏใน 'การแลกเปลี่ยนแบบเปิด' แต่สามารถใช้สำหรับ 'การใช้งานภายใน '.)
Jonathan Leffler

1
@AdrianMaire: ดูตารางที่ 3.6 ในบทที่ 3ของมาตรฐาน Unicode (9.0.0) (หมายเลขหน้า 125; p54 ของไฟล์ PDF) ฉันไม่แน่ใจว่าคุณกำลังปรึกษาแหล่งข้อมูลอื่นใด แต่ฉันคิดว่าสิ่งที่ฉันพูดมีอยู่ในตารางนั้น
Jonathan Leffler

@JonathanLeffler คุณถูกต้อง 100% ขอบคุณสำหรับข้อมูลอ้างอิง
Adrian Maire

17

คุณสามารถใช้เครื่องมือออนไลน์ที่มีประโยชน์นี้จาก Jeffrey Bergaminiเพื่อแปลงข้อความใด ๆ ให้เป็นสตริง Homoglyphs UTF8 ที่แปลกจริงๆ

โดยทั่วไป

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

กลายเป็นแบบนี้:

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


6
ฉันคิดว่าเป็นเพราะวิธีนี้ไม่ได้ช่วยในการทดสอบ UTF8 อย่างแท้จริง: คุณไม่ได้อะไรใกล้เคียงกับกรณีทั้งหมดไม่มีกรณีที่ "ไม่ดี" และรูปแบบดังกล่าวไม่เป็นประโยชน์สำหรับการทดสอบ เป็นเพียงวิธีการรับตัวละครแปลก ๆ เท่านั้น
Adrian Maire

คุณลองหรือยัง? เครื่องกำเนิดไฟฟ้านั้นไม่ได้มีไว้เพื่อความสนุกสนาน มันให้ตัวละครจากช่วง UTF-8 เต็มรูปแบบและเนื่องจากพวกมันคล้ายกับตัวละครจริงอย่างแปลกคุณจึงสามารถ 'ดู' ว่าตัวอักษรใดทำให้คุณมีปัญหา ในตัวอย่างที่ฉันโพสต์มี 6 ตัวอักษรที่ iPhone ของฉันแสดงเป็นเครื่องหมายคำถามชนิดบรรจุกล่อง
Shebuka

4
IMO เครื่องมือที่ยอดเยี่ยมนี้อาจเป็น "มูลค่าเพิ่ม" ที่ดีมากสำหรับคำอธิบาย แต่ไม่เหมาะที่จะเป็นคำตอบใน SO (เนื่องจากเพจอาจถูกยกเลิก) อย่างไรก็ตามฉันยอมรับว่า -1 ที่ไม่มีคำอธิบายนั้นไม่สร้างสรรค์มากนัก
Adrian Maire

นี่คือ "ข้อมูลการทดสอบตัวอย่าง utf-8 ที่ดีและดี" ... ควรค่าแก่การโหวตเนื่องจากเกี่ยวข้อง IMO
Rondo


2

ปิดด้านบนของหัวของฉัน:

0xff และ 0xfe

ไบต์สูงบิตเดียว

การแทนค่าหลายไบต์ของอักขระแบบไบต์ต่ำ - วิธีที่ดีในการลักลอบนำค่าว่างจากการตรวจสอบก่อนกำหนด

เครื่องหมายไบต์ - คุณจะเพิกเฉยหรือไม่?

NFC เทียบกับ NFD

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.