อักขระที่มองไม่เห็นไม่จำเป็นต้องเป็นอักขระว่าง มันอาจบอกขอบเขตคำ ป้องกันการตัดบรรทัด เชื่อมรูปตัวอักษร เลือกรูปแบบการแสดง หรือเปลี่ยนทิศทางของข้อความ
สตริงสองชุดที่ดูเหมือนกันทุกอย่างอาจมีคำสั่งต่างกันอยู่ภายใน
“ช่องว่าง” มีหลายหน้าที่
U+0020 SPACE คือช่องว่างบนแป้นพิมพ์ Unicode ยังมี
- U+00A0 NO-BREAK SPACE มีความกว้างแต่ป้องกันการตัดบรรทัด
- U+2009 THIN SPACE ให้ระยะห่างแคบกว่า
- U+3000 IDEOGRAPHIC SPACE กินพื้นที่หนึ่งช่องเต็มความกว้างแบบเอเชียตะวันออก
- U+2800 BRAILLE PATTERN BLANK เป็นอักขระเบรลล์ที่ไม่มีจุด ไม่ใช่ช่องว่างทั่วไป
ทั้งหมดอาจดูว่าง แต่ความกว้าง การตัดบรรทัด ความหมาย และการเข้าถึงต่างกัน การใช้ตัวหนึ่งแทนอีกตัวเพียงเพราะ “ดูว่าง” ทำให้เลย์เอาต์คาดเดาไม่ได้
ความกว้างศูนย์ก็ยังเป็นคำสั่ง
- U+200B ZERO WIDTH SPACE เปิดตำแหน่งให้ตัดบรรทัดโดยไม่มีช่องที่มองเห็น
- U+2060 WORD JOINER ป้องกันการตัดโดยไม่เพิ่มความกว้าง
- U+200C ZERO WIDTH NON-JOINER ป้องกันการเชื่อมหรือตัวควบ
- U+200D ZERO WIDTH JOINER ช่วยการเชื่อมและเชื่อมลำดับอีโมจิ
- U+FE0E/U+FE0F ขอการแสดงแบบข้อความหรืออีโมจิ
การเรียกทั้งหมดว่า “ช่องว่างล่องหน” ทำให้หน้าที่ที่ต่างกันหายไป หลายตัวไม่ใช่ช่องว่างด้วยซ้ำ ในอักษรที่เปลี่ยนรูปตามบริบท ตัวเชื่อมและไม่เชื่อมอาจเป็นส่วนหนึ่งของการสะกดที่ถูกต้อง การลบโดยไม่แยกแยะจึงเปลี่ยนรูปหรือความหมายของคำได้
ตัวควบคุมทิศทางแก้ปัญหาหลายภาษาจริง
อักษรอาหรับและฮีบรูส่วนใหญ่ไหลจากขวาไปซ้าย ส่วนอักษรละตินและตัวเลขไหลจากซ้ายไปขวา อัลกอริทึมสองทิศทางของ Unicode จัดการข้อความผสม โดยใช้เครื่องหมายทิศทาง การแยก การฝัง และการเขียนทับช่วยกรณีกำกวม
นี่เป็นโครงสร้างสำคัญของข้อความหลายภาษา แต่ลำดับที่เก็บกับลำดับที่เห็นอาจต่างกัน หากจัดการไม่ดี หน้าจออาจดูเหมือนสื่อสิ่งอื่นจากสิ่งที่โปรแกรมประมวลผล โปรแกรมแก้โค้ดและเครื่องมือความปลอดภัยจึงเตือนตัวควบคุมทิศทางที่ผิดปกติ
ทำไมข้อความที่คัดลอกมาจึงแกะรอยยาก
อักขระล่องหนอาจมาจากเอกสารหรือเว็บที่จัดรูปแบบ ระบบป้อนภาษา การตัดคำอัตโนมัติ ลำดับอีโมจิ หรือการสร้างชื่อว่าง
อาการได้แก่ค้นหาไม่พบ ชื่อผู้ใช้ที่ดูซ้ำ URL ที่เปรียบเทียบไม่เท่ากัน การตัดบรรทัดแปลก และเคอร์เซอร์เหมือนติดขัด วิธีตรวจที่ถูกต้องคือดูโค้ดพอยต์ ไม่ใช่กด Backspace ไปเรื่อย ๆ
อักขระซ่อนและตัวคล้ายเกี่ยวข้องกับความปลอดภัย
Unicode รองรับระบบเขียนทั่วโลก อักขระต่างกันจึงอาจมีรูปคล้ายกัน a ละตินกับ а ซีริลลิกไม่ใช่อักขระเดียวกัน แม้ฟอนต์จะวาดเกือบเหมือน
Unicode Technical Standard #39 กำหนดกลไกตรวจตัวระบุที่ชวนสับสน จุดประสงค์คือค้นหาความเสี่ยง ไม่ใช่บังคับทุกภาษาให้เป็น ASCII การผสมอักษรในชื่อสากลอาจถูกต้อง แต่ถ้าอยู่ในโดเมนเลียนแบบธนาคารก็ต้องระวัง
งานวิจัยการโจมตีระบบภาษาแบบมองไม่เห็นยังพบว่าการแทรกอักขระล่องหน ตัวเหมือน การสลับลำดับ และตัวควบคุมลบสามารถเปลี่ยนผลลัพธ์โดยแทบไม่เปลี่ยนภาพ
การใช้ที่ปลอดภัยและเสี่ยง
การทดสอบเรนเดอร์ วิเคราะห์เอกสาร จัดการการตัดบรรทัด และใช้ตัวเชื่อมในอักษรที่ต้องการเป็นการใช้ที่สมเหตุผล ส่วนการปลอมลิงก์หรือบัญชี หลบการตรวจ ใส่ตัวควบคุมในซอร์สโค้ด และสร้างตัวตนว่างขัดกฎเป็นการใช้เสี่ยง
ผลิตภัณฑ์ควรเตือนตัวควบคุมที่ไม่คาดคิด เปรียบเทียบรูป normalization และตัวคล้ายเมื่อเหมาะสม รักษาข้อความหลายภาษาที่ถูกต้อง และแสดงโค้ดพอยต์ในเครื่องมือวินิจฉัย
มองไม่เห็นไม่ได้แปลว่าไร้ความหมาย การไม่มีรูปอักขระอาจเป็นคำสั่งในตัวเอง
เครื่องมืออักขระว่างระบุหน้าที่ของแต่ละอักขระ ใช้เพื่อทดสอบและจัดหน้าอย่างสุจริต ไม่ใช่เพื่อปลอมข้อความหรือเลี่ยงกฎ