konekto Inc with PHP , MySQL コネクト株式会社 技術情報コンテンツ


クロスサイトスクリプティング

セキュリティ指針

説明

クロスサイトスクリプティングとは、ユーザもしくはなんらかの外部からの入力データにJavaScriptやスタイルシートなどの、危険なHTMLタグやスクリプトが埋め込まれ、他サーバーへの攻撃や、スクリプトなどによって実行可能な様様な意図しない挙動を引き起こす問題を指す。

最近では、IFrameを使用したバッファオーバーフローを伴う攻撃等も発生しており、Web上でもっとも有名なセキュリティの問題となりつつある。

被害例

例えば掲示板等や日記等での入力で不正なHTMLタグを許容する場合に、不正な書き込みによりJavaScript閲覧者側で実行され、重要なセッション情報などが不正書き込みをした人物に送信されたり、サイトを偽ることによってユーザからカード番号等の重要な番号を引き出すといった方法が考えられる。

  • 不正な入力を許容してしまっている例
    この例では、テキストに不正な文字列が反映されるとそのまま表示されてしまう。
    <HTML>
    <HEAD>
    </HEAD>
    <BODY>
    <FORM method="post">
        テキストを入力してください<BR>
        <INPUT name="input_text" type="text">
        <INPUT type="submit" value="送信">
    </FORM>
     
    <?php
       if (is_set($_POST['input_text']) {
           print $_POST['input_text'];
       }
    ?>
    </BODY>
    </HTML> 

対策

以下の文字列をサニタイズする。サニタイズするタイミングは、データ受付時ではなく、HTML出力直前に例外なく行うこと。

  • サニタイズする文字列
     変換前   変換後
     -------  --------
     <        &lt;
     >        &gt;
     "        &quot;
     '        &#39;
     &        &amp;
  • サニタイズするタイミング
    表示HTML出力の直前

コーディング手法

  • Smartyを使用している場合はescape修飾子を使用する。
    {$str|escape}
  • Smartyを使用していない場合はhtmlspecialchars関数を使用する。
    $str = htmlspecialchars($str, ENT_QUOTES);
    $array = array_map( 'htmlspecialchars', $array );
  • 不正な入力を排除している例
<HTML>
<HEAD>
</HEAD>
<BODY>
<FORM method="post">
    テキストを入力してください<BR>
    <INPUT name="input_text" type="text">
    <INPUT type="submit" value="送信">
</FORM>
 
<?php
   if (is_set($_POST['input_text']) {
       print htmlspecialchars($_POST['input_text'], ENT_QUOTES);
   }
?>
</BODY>
</HTML>

最終更新のRSS