정말 좋고 나쁜 UTF-8 예제 테스트 데이터 [닫힌]


88

그래서 우리는 XSS 필터링을 테스트하기 위한 XSS 치트 시트 를 가지고 있습니다. 그러나 무해한 예제 페이지 외에는 내 UTF-8 코드가 잘못 작동하는 데이터를 처리 할 수 ​​있는지 확인하기 위해 악의적이거나 잘못된 테스트 데이터를 찾을 수 없습니다.

테스트 할 좋은 음 .. 나쁜 데이터를 어디에서 찾을 수 있습니까? 또는 까다로운 문자 시퀀스는 무엇입니까?


4
columbia.edu/kermit/utf8.html 은 또 다른 좋은 것입니다
Xeoncross


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

답변:


98

1
당신은 이것에 어떤 노력도 기울이지 않았지만 그 페이지는 내가 찾던 것입니다. ;)
Xeoncross

75
잊지 마세요. 답을 찾을 수있는 곳을 아는 것은 종종 답을 아는 것만 큼 중요합니다.
Jonathan Leffler

19
나는 그의 테스트가 5와 6 바이트 시퀀스가 ​​허용되었을 때, 17 이상 플레인이 삭제되기 전에 UTF-8의 오래된 정의를 기반으로한다고 경고합니다. 그리고 U + FFFE와 U + FFFF 코드 포인트는 UTF-8에서 유효하지 않다는 것을 의미합니다 . 유니 코드 컨소시엄에 따라
Simon Kissane

34

참조 : 중국 문자의 파일이 문자 당 사용하는 방법 바이트 알고 있나요 어떻게? — 의심 할 여지없이 도움이 될 다른 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 비트 범위 (U + 0000-U + 10FFFF)는 최대 유효 값이 0xF4임을 의미합니다. 값 0xF5..0xF7은 유효한 UTF-8.)

특정 바이트 시퀀스가 ​​유효한 UTF-8인지 여부를 살펴보면 다음을 고려해야합니다.

  • 예상하지 않은 곳에 연속 바이트가 나타남
  • 연속 바이트가 예상되는 곳에 나타나는 비 연속 바이트
  • 문자열 끝의 불완전한 문자 ( '예상되는 연속 바이트'의 변형)
  • 최소가 아닌 시퀀스
  • UTF-16 서로 게이트

유효한 UTF-8에서는 0xF5..0xFF 바이트가 발생할 수 없습니다.

최소가 아닌 시퀀스

일부 문자에 대해 여러 가지 가능한 표현이 있습니다. 예를 들어 유니 코드 문자 U + 0000 (ASCII NUL)은 다음과 같이 나타낼 수 있습니다.

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

그러나 유니 코드 표준은 마지막 세 가지 대안이 최소가 아니기 때문에 허용되지 않는다고 명시하고 있습니다. 따라서 0xC0 및 0xC1 바이트는 유효한 UTF-8로 표시 될 수 없습니다. 이들로 인코딩 할 수있는 유일한 문자는 0x00..0x7F 범위의 단일 바이트 문자로 최소 인코딩되기 때문입니다.

UTF-16 대리

BMP (Basic Multi-lingual Plane) 내에서 유니 코드 값 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 (zero-width no-break space)라고도 함)는 UTF-8로 인코딩되지 않은 상태로 나타날 수 없습니다. 0xFF 및 0xFE 바이트는 유효한 UTF-8에서 허용되지 않습니다. 인코딩 된 ZWNBSP는 UTF-8 파일에 0xEF 0xBB 0xBF로 나타날 수 있지만 BOM은 UTF-8에서 완전히 불필요합니다.


유니 코드 에는 문자가 아닌 일부도 있습니다 . U + FFFE 및 U + FFFF는 이러한 두 가지 비 문자입니다 (각 평면의 마지막 두 코드 포인트, U + 1FFFE, U + 1FFFF, U + 2FFFE, U + 2FFFF, ... U + 10FFFE, U + 10FFFF는 기타입니다. ). 일반적으로 데이터 교환을 위해 유니 코드 데이터에 표시되지 않아야하지만 개인 용도로 표시 될 수 있습니다. 유니 코드가 아닌 문자의 다소 복잡한 역사를 포함하여 많은 세부 사항은 유니 코드 FAQ 링크를 참조하십시오. ( 2013 년 1 월에 출시 된 Corrigendum # 9 : Clarification About Noncharacters 는 제목이 암시하는대로 비 문자의 의미를 명확히합니다.)


이 훌륭한 목록에 감사드립니다. 이제 각 항목을 자세히 살펴볼 계획입니다.
Xeoncross

3
비문자는 "UTF-8로 인코딩 된 데이터에 나타나지 않아야한다"는 설명은 잘못된 것입니다.
비문자는

@SimonKissane : 분명히 저는 2013 년 1 월에 출시 된 현상 유지 앤티 Corrigendum # 9 에 대해 혼란스러워하는 사람 중 한 명이었습니다 . 비 문자 에 대한 유니 코드 FAQ의 전체 섹션은 읽을 가치가 있습니다. 정보에 대해서 감사드립니다. (또한 내 의견은 유니 코드 표준이 말한 것과 일치하는 '해야한다'라고 말하고 있다는 점에 주목할 것입니다 ( '말하지 않음'은 아님). 의도는 '개방형 교환'에 나타나지 않아야하지만 '내부 사용'으로 사용될 수 있다는 것입니다. '.)
Jonathan Leffler 2014

1
@AdrianMaire : 유니 코드 (9.0.0) 표준 (페이지 번호 125, PDF 파일의 54 페이지) 3 장의 표 3.6을 참조하십시오 . 어떤 다른 소스를 컨설팅하고 있는지 잘 모르겠지만 제가 말한 내용이 그 표에 포함되어 있다고 생각합니다.
Jonathan Leffler

@JonathanLeffler 당신은 100 % 정확합니다. 참고해 주셔서 감사합니다.
Adrian Maire

17

Jeffrey Bergamini의이 편리한 온라인 도구를 사용 하여 텍스트를 정말 이상한 UTF8 동형 문자 문자열로 변환 할 수 있습니다.

전형적인

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

다음과 같이됩니다 :

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


6
이것이 UTF8을 테스트하는 데 실제로 도움이되지 않기 때문이라고 생각합니다. 전체 케이스 세트에 가까운 항목을 얻지 못하고 "나쁜"케이스가 없으며 형식이 테스트에 실제로 도움이되지 않습니다. 이상한 캐릭터를 얻는 방법 일뿐입니다.
Adrian Maire

시도해 보셨습니까? 그 발전기는 재미가 없습니다. 전체 UTF-8 범위의 문자를 제공하며 실제 문자와 이상하게 유사하기 때문에 어떤 문자가 문제를 일으키는 지 '볼'수 있습니다. 예를 들어 iPhone이 상자 모양의 물음표로 렌더링하는 6 개의 문자가 게시되었습니다.
Shebuka

4
IMO,이 멋진 도구는 설명에 대한 매우 멋진 "부가가치"가 될 수 있었지만 SO 자체에 대한 답변으로는 적합하지 않습니다 (페이지가 중단 될 수 있기 때문에). 어쨌든 설명이없는 -1은 건설적이지 않다는 데 동의합니다.
Adrian Maire 2017 년

그래서 이것은 "좋고 좋은 utf-8 예제 테스트 데이터"입니다 ... 관련하여 찬성 할 가치가 있습니다. IMO
Rondo


2

내 머리 위로 :

0xff 및 0xfe

단일 상위 비트 바이트

하위 바이트 문자의 멀티 바이트 표현-초기 검사를 통과 한 널을 밀수하는 좋은 방법

바이트 순서 표시-무시 하시겠습니까?

NFC 대 NFD

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.