クロスサイトリクエストフォージェリ(CSRF)対策

※動作テストは自己責任で必ず自分の環境で確認すること。

クロスサイトリクエストフォージェリとは

想定していない外部サイトからのHTTPリクエストにより、本来拒否すべき処理を実行させる攻撃。
例えばログイン認証が必要な掲示板や日記サービスに対して、別のWebサイトに用意されたリンクをクリックすることで掲示板への投稿や退会処理など、正規のアカウントでログインを行わなければ出来ないような処理が実行されてしまう。
サーバが必要とする情報が攻撃者によって予測できるもののみで構成されている場合、この方法での攻撃が成立してしまう。
Webアプリケーション側での対策として、リファラーを利用しリクエストの発信元が正しいかを確認する方法や、想定したページ遷移にて処理が行われていることをCookieを使って確認する方法がある。
また、エンドユーザー側にてこまめにログアウトを行うことも有効な対策となりうる。
ただし、この場合でも同一サイト内で攻撃された場合は実行されてしまうため、不審なリンクはクリックしないなどの基本的な対応が必要である。

<img>タグや自動POST JavaScript等を利用して、サイトについての権限を持った人に重大な不正操作を強いる攻撃。
権限をもった本人が踏んでしまうため、IPアドレスやセッションチェックなどは無意味となる。

■攻撃先

管理者などが行う編集・削除等、重大な操作に関係する部分

■被害

管理者にしか操作許可されていないはずの機能が次々と乗っ取られる
※データやメール内容が消される等

Case 1

&lt;?php
if($user-&gt;isAdmin() &amp;&amp; $_GET['delete_ok'] == 1)
{
  mysql_query('DELETE FROM bbs WHERE id='.intval($_GET['id']), $conn);
}
?&gt;
上記のコードに対して、下記のコードをサイト管理者にアクセスさせると削除対象以外のデータを削除されたり
予期せぬSQL文を発行させられることがある。
&lt;body onload=&quot;document.form1.submit();&quot;&gt;
  &lt;form action=&quot;【被害サイト】&quot; method=&quot;post&quot; name=&quot;form1&quot;&gt;
    &lt;input type=&quot;hidden&quot; name=&quot;id&quot; value=&quot;14&quot;&gt;
    &lt;input type=&quot;hidden&quot; name=&quot;pass&quot; value=&quot;aaa&quot;&gt;
    &lt;input type=&quot;hidden&quot; name=&quot;delete_ok&quot; value=&quot;1&quot;&gt;
  &lt;/form&gt;
&lt;/body&gt;

対策方法

・リファラーチェック法

ブラウザから渡された前のページが自サイト内でない場合、処理をスキップする。
※ただし、リファラーを送出しないブラウザからは操作不可能となる。
&lt;?php
$my_uri = 'http://【被害サイト】';

if(strncmp(@_SERVER['HTTP_REFERER'], $my_uri, strlen($my_uri)))
{
  unset($_POST);
}
?&gt;

・ワンタイムチケット法

フォームを表示する際に、チケット・半券のペアを造り、チケット側をhiddenとして埋め込む。半券はセッション変数として保存する。
実際のPOSTを処理する時に、POSTされたチケット半券の一致を確認し、半券を廃棄する。
&lt;?php
if($user-&gt;isAdmin() &amp;&amp; $_GET['delete_ok'] == 1 &amp;&amp; $myTicket-&gt;check())
{
  // 処理
}
?&gt;

・POST利用法

重大な操作の最終確認手段はGET渡しではなく、POST渡しとする。
処理の受け取り先で、$_REQUESTは利用しない。
※ただし、JavaScriptを利用すれば、自動的にPOSTすることも可能なので、本質的な対応にはなっていない。
&lt;?php
if($user-&gt;isAdmin() &amp;&amp; $_POST['delete_ok'] == 1)
{
  mysql_query('DELETE FROM bbs WHERE id='.intval($_GET['id']), $conn);
}
?&gt;

PHPサイバーテロの技法―攻撃と防御の実際

新品価格
¥1,890から
(2013/10/3 19:55時点)

Comments are closed.