何故かあたり前にならない文字エンコーディングバリデーション | yohgaki's blog
ã£ã¦ããããã«ããã¾ãã¡æåã³ã¼ãã®ä¸æ£ãªå¤å®ã«ããå±éºæ§ã£ã¦ã®ãåãã£ã¦ãªãã
SJISã®åé¡ã¯ã(2/3)SQLインジェクションを根絶!セキュア開発の極意 - 第5回■注目される文字コードのセキュリティ問題:ITproã®è¨äºãããããããã£ãã
ã¨ãããããã£ã±ãPHP使ã£ã¦ãã¨èª°ã§ãä¸åº¦ã¯ããªããããã®ãï¿¥ãã¯ï¼ãã£ã¦æããããªãã§ã
ãªãã»ã©ã確ãã«âã®å³ã®ããã«ããããã¤ããã2ã¤ã®æå³ãæã¤ã£ã¦ããæåã³ã¼ãå½¢æ
ã¯ãã°ããã ãªã¨ã
EUC-JPã¯ãããªãã¨ã¯ããªãã§ã1ã¤ã®ãã¤ãã«ã¯1ã¤ã®æå³ããåãããªãã
ã ãã©ãããã§ãæååããèµ·ãããã¨ããããçµé¨çã«ã¯ãããã«ããã¤ããXXæåã§åãè½ã¨ããããã¨ããã£ãå ´åãã¡ããã¨æåã³ã¼ããå¤å®ãã¦ãããPHPã§ããã°mb_substrä½ãã使ãã°åé¡ãªããã©ããã¤ãæ°ã§åã£ã¡ããsubstrã ã¨ãå¥æ°æåã§åã£ã¡ããæã¯1æåãååã«ã¡ãããå¯è½æ§ãããã
ãã¼ããããUTF-8ã¯ä½ãå±ãªãã®ï¼
ãã®ãããã®åé¡ã¨ããä»è¨èªã§æåãããé åã被ãã£ã¦ããåé¡ã解æ¶ããã®ãUincodeã§ããã®å®è£ ã®ä¸ã¤ã§ããUTF-8ãªãåé¡ãªãããããªãã®ãã£ã¦ããæããªãã ãã©ãããã¯éãã¿ããã
ãããæ¸ãããè¨äºãã第4回 UTF-8の冗長なエンコード:本当は怖い文字コードの話|gihyo.jp … 技術評論社ãã£ã¦ããè¨äºã
ãã®è¨äºãæãã¦æåã«å¼ç¨ããohgakiããã®ããã°ã§ã¯
ãã®ããäºã¯ç°¡åã«ç解ã§ããã¨æã£ã¦ããã®ã§
ã¨æ¸ããã¦ããããããå ¨ç¶ç°¡åãããªããã»ã»ã»ã£ã¦æãã§è²ã èãã¦ã¿ãã®ããã®ã¨ã³ããªãï¼åç½®ãé·ã£ï¼
ããã¾ã§ãããããªããããªãããªããã£ã¦èªåãèããã ããªãã§ãééã£ã¦ããçªã£è¾¼ã¿ãªã©ã©ããã
ãããããUTF-8ã£ã¦ã©ããã£ã¦æåãå¤å¥ãã¦ãã®ãï¼
UTF-8ã¯ããã«ããã¤ã1æåã表ãã®ã«ã1ãã¤ãã4ãã¤ãã®å¯å¤ãªãã¤ãæ°é åã使ãã
åºå®ã«ããã°è¯ãã®ã«ãä½ã§ãããªé¢åãªãã¨ããããã£ã¦ããã¨ãASCIIæåã¨äºææ§ãæããããããããã
ã§ã第4回 UTF-8の冗長なエンコード:本当は怖い文字コードの話|gihyo.jp … 技術評論社ã«ããã¨ã
Unicodeæåç¯å² | UTF-8ã§ã®ãã¤ãå |
---|---|
Uï¼0000ã Uï¼007F | 0xxxxxxx ï¼00ã7Fï¼ |
Uï¼0080ã Uï¼07FF | 110xxxxxãã10xxxxxx ï¼C2ãDFï¼ãï¼80ãBFï¼ |
Uï¼0800ã Uï¼FFFF | 1110xxxxãã10xxxxxxãã10xxxxxx ï¼E0ãEFï¼ãï¼80ãBFï¼ããï¼80ãBFï¼ |
Uï¼10000ã Uï¼10FFFF | 11110xxxã10xxxxxxã10xxxxxxã10xxxxxx ï¼F0ãF7ï¼ï¼80ãBFï¼ï¼80ãBFï¼ï¼80ãBFï¼ |
ã£ã¦ãªã£ã¦ãã
èªåãããåã«1ã¨0ã®ãã¼ã¿ãæåã¨ãã¦åºåãããã·ã³ãã«ãªã£ãã¤ããã§ãããã®ãã¼ã¿ã¯UTF-8ã®æååã§ãããã£ã¦ãã¼ã¿ãæ¥ãå ´åã«
ãããããã¯ãããã ã
ãããã¯ãã\ãã ã
ã¨ãè¦åããããã«ããä½ãã¤ãã§1æåã表ç¾ãã¦ãã®ãããå¤å®ããã«ã¯ã©ãããããããããâã®è¡¨ãè¦ã¦èãã¦ã¿ãã
ããã¨ãUTF-8ã¯ããã¶ãç°¡åã«ãããã¯3ãã¤ãã§1æåã ãªãã¨ããåããããã«ãªã£ã¦ããã
- æåã®1ãã¤ãã®1ãããç®ã0ãªãã1ãã¤ãã§1æåãã
- æåã®1ãã¤ãã®1ãããç®ã¨2ãããç®ã1ãªãã2ãã¤ãã§1æåããªã®ã§ã次ã®1ãã¤ããåããã¦1æåãåºåããã
- æåã®1ãã¤ãã®1ã3ãããç®ã1ãªãã3ãã¤ãã§1æåããªã®ã§ã次ã¨æ¬¡ã®æ¬¡ã®2åã¨ãåããã¦1æåãåºåããã
ã¨ããæãã
ã¤ã¾ããæåã®1ãã¤ãã¯ãä½ãã¤ãä¸ç·ã«é£ãã°ããããã¨ããã®ãæãã¦ããã¦ãã
ããã¦ãã10ãã®ãããã§å§ã¾ããã¤ãã¯ãæåã®ä¸éããæ§æãããã¤ãã¨ãããã¨ã«ãªãã
ã¨ããã§ãä¸ã®ãã¼ãã«ã¯110xxxxxãï¼C2ãDFï¼ã£ã¦ãªã£ã¦ããã©ãC0ãDFãããªãããªï¼ï¼
åé·ãªã¨ã³ã³ã¼ãã¨ã¯ï¼
ããããåé·ãªã¨ã³ã³ã¼ãã£ã¦ä½ï¼ã£ã¦ãã¨ãªãã ãã©ã
ããã¯ãæ¬æ¥ãªã1ãã¤ãã§æ¸ããã¼ã¿ã3ãã¤ãå¿ è¦ãªããã«è¦ãããã£ã¦ãããã¨ã ã¨æãã
ãã®ä¾ã¨ãã¦ã第4回 UTF-8の冗長なエンコード:本当は怖い文字コードの話|gihyo.jp … 技術評論社ã«ããã¨ãã/ããæãã¦ããã®ã ãã©ã
æ£ããã¨ã³ã³ã¼ã | 0x2F |
---|---|
ä¸æ£ãªã¨ã³ã³ã¼ã | 0xC0 0xAFããï¼2ãã¤ã表ç¾ï¼ 0xE0 0x80 0xAFããï¼3ãã¤ã表ç¾ï¼ 0xF0 0x80 0x80 0xAFãï¼4ãã¤ã表ç¾ï¼ |
ä½ã§ãããªããå ¨é¨ã/ãã¨ãã¦èªèããããã ï¼ï¼ã£ã¦æãã ãã©ãå®éã«ãã£ã¦ã¿ããPHPã§ã
<?php echo $sl1 = hex2bin('002f')."\n"; echo $sl2 = hex2bin('c0af')."\n"; echo $sl3 = hex2bin('e080af')."\n"; function hex2bin($hex_str) { return pack("H*" , $hex_str); }
ã£ã¦ãã£ã¦ã³ãã³ãã©ã¤ã³ããå®è¡ãã¦ã¿ããã¿ã¼ããã«ã®åºåã¯UTF-8ããªã®ã§ãã¿ã¼ããã«ããUTF-8ã§ãããã¨è§£éãããæåãç§ã®ç®ã«æ ãã¯ãã
æããã¦
ã¨ããããã«ã3ã¤ã®ã/ããåºåãããã
ãããããããæ¬å½ã«ãã¤ããªã¨ãã¦åããã¼ã¿ãªã®ãã©ããã確ããã¦ã¿ããç°¡åã«ãå¥ã®æåã³ã¼ãã«å¤æãã¦ã¿ãã°ããã
EUC-JPã«å¤æãã¦åºåãã¦ã¿ãã¨ã
ã£ã¦ãªã£ãã
ã¤ã¾ããæåã®ã/ãã¯æ¬ç©ã®1ãã¤ãã®ã¹ã©ãã·ã¥ã ãã©ãå¾ã®2ã¤ã¯1ãã¤ãã®ã¹ã©ãã·ã¥ã§ã¯ãªãã¨ãããã¨ã
SJISã«å¤æãã¦ã
ã¨ãªãã
ããã¯ä½ãæªãã®ãã¨ããã¨ãããã¯ãå¤ãªUTF-8ã¨ã³ã³ã¼ããè¦æããªãã¿ã¼ããã«ãï¼ãã®ãã£ããã£ã®å ´åã¯TeraTermPro UTF-8çï¼ãªãã ãã©ãä¸ã®ä¸ã«ã¯ããããã¢ããªãå¤ãããããããã¯ãã©ã¦ã¶ãå¤åã«ããããFirefoxãI.Eãåãåéãããã¦ãã¾ããããã
ãªãã§ãããªåéããããã®ï¼
ããããä½ã§ãããªåéããï¼ã£ã¦æãã ãã©ãããã¯ãªãã¨ãªãã ãã©ã»ã»ã»
第4回 UTF-8の冗長なエンコード:本当は怖い文字コードの話|gihyo.jp … 技術評論社ã«ãã
ã®çµµãè¦ã¦ãã0xE0 0x80 0xAFããå¦çããã¨ãã®åä½ã¨ãã¦ããã
Firefoxãç¾å¨ã®æåã³ã¼ãã¯UTF-8ã次ã®ãã¤ãã¯ã0xE0 ã»ã»ã»1110....ã¨ããã¨3ãã¤ãã§1ã¤ã®å¦çã ãªã
Firefoxã3ãã¤ãã1ã¤ã«ä¸¦ã¹ã¦ã¿ãã¨ã1100000 10000000 10101111ã»ã»ã»ã»ã
Firefoxãï¼ï¼ï¼æåã®2ãã¤ãã¯æå³ã®ããé¨åã®ããããå
¨ã¦0ã»ã»ã»æå¾ã®1ãã¤ãã¯ã0101111ãããã¯ã00101111ãã表ãã¦ãã®ããª?ã
ã¨ãããã¨ãªãã ãããï¼
ãã®è¾ºã¯ãã¼ãããã¾ãããããªãã¨ãªããããªæãããã
ãããXSSã«ã¤ãªããã£ã¦è¨ãã®ã¯
è¦ããã«ãã3ãã¤ãé£ãã¾ããããã£ã¦ãããã©ã°ãç«ã¦ã¦ãããªããï¼ã¤ã¾ã1100000ã®ãã¤ããéãï¼ã2ãã¤ãããéããªãã£ãå ´åã次ã®æåãå·»ãè¾¼ãã§ãã¾ãããããªããã£ã¦ãã¨ããªï¼ããã£ã¦ãEUC-JPãSJISã§ãã£ãã®ã¨åãåé¡ã§ããããUTF-8ã§ãèµ·ããã£ã¦ããã
ããããã¨ãHTMLã®éãã¿ã°ã¨ãã¯ã©ã¼ããé£ã£ã¡ããã°XSSãç°¡åã«æç«ããã¦ãã¨ã§ã
ãããããããããã®ããäºã¯ç°¡åã«ç解ã§ããã¨æã£ã¦ããã®ã§ããã¨è¨ã£ã¡ããohgakiããã«ã¯
ããããããrãâ、 ãããããã| â | ããããããããrââ、 ããããã_,;ï¾ - ï½²ãããããããâ§lââ⧠ãã»ãã¥ãªã㣠ã¨ãã³ã¸ã§ãªã¹ãã®è«¸åï¼ ããã ï¼â`ããã âã»ã ãã¨,、,,ï¾.-ï½²/,、 l ãããããPHPerã«ã¨ã£ã¦å¤§åãªã®ã¯ ãããã|ã½ã ~~âγâï¼ãr'âãï½!´ `âï¼ ããã使ãããµã³ãã«ããã³ããã§åãã³ã¼ãã ãã ã ãããâãã½ã¼â'^ã¼-'ãï¼ âγâ~~ã/| ãPHPerãè²·ããã¶ããªãã§ããããã ãããâãããããã |âãã|ï½ã¼^ï½°â r'ã| ãããâã/âââ|ã|ãã|/ã| ãlããï¾ï½¤ | ããã|ã irï½°-、 ï½°ã,}ã|ããã / ããããi ããã| /ãããï½X´ãã½ ãã / ã å ¥
ã¨ãè¨ãããã