log

安全なwebアプリケーションの作り方 374-397

  • 文字コードについて。
    • 普段使う「文字コード」は、文字集合+文字エンコーディング
    • 文字集合:ASCII, JIS X 0201, Unicode.. などの”集合”
    • 文字エンコーディング文字集合をコンピュータで扱えるよう符号化したもの。Shift_JIS, EUC-JP, UTF-8などなど。
    • 色々あるんだけど、結論としてアプリケーション内で文字コードを統一すること!!!UTF-8使え!!!!
    • Shift_JISEUC-JPで起こる不正
      • 先行バイトの後にデータがないとき
      • 先行バイトに続くバイトが、後続バイトの範囲にないとき
    • UTF-8で起こる非最短形式の問題
      • たとえば、/(スラッシュ)は 0x2F, 0xC0 0xAF, 0xE0 0x80 0xAF, 0xF0 0x80 0x80 0xAF の 4 つで表現出来る。0x2Fが最短で、それ以外が非最短
      • 0xC0 0xAF はディレクトリトラバーサルのチェックとかのセキュリティチェックを通る→ファイル名として展開する→0xC0 0xAFが / スラッシュに展開される→親ディレクトリ☠
      • 最新規格では、非最短形式は不正で処理しちゃダメ!なので最新に沿ったものを使おう
    • まあ、アプリケーション全体をお押して文字集合/エンコーディングを統一するのが余計な問題を起こさずに済むのでよい◎
    • 文字集合の縮退処理
      • どうしても統一出来ない時、たとえば携帯電話向けwebアプリなどで起こるShift_JISしか対応してない問題
      • DBからデータを取ってきたあと、U+00A5とかいう、Unicode固有のものが入っているときはなんか処理かますまえにUTF-8Shift_JISUTF-8っていう変換(この本だと縮退処理って書いてある)をして、起こる文字化けを最初から起こした状態で処理することで変な問題を回避しようって感じ
      • これはエスケープ処理とかの前にやらないと脆弱性の原因になるよ
    • 文字コードチェック:不正な文字エンコーディングがエラーになるor代替文字になる/「表」「ソ」「能¥」が正しく登録表示される/尾骶骨テスト
    • 文字コード自動判定はやめろ!!!!!!!!!!!明示的に指定しよう!!!!!!!!