6

私はWebセキュリティにかなり慣れていません。CSRFから保護するために、送信ボタン(つまり、ステータスの更新)なしでajaxリクエストとフォームでトークンを使用する正しい方法は何だろうと思っていました。誰かコードサンプルを見せてもらえますか? 送信ボタンのあるフォームに対して適切に行う方法を知っています。また、私のajaxフォルダーには、次のhtaccessがあります。

SetEnvIfNoCase X-Requested-With XMLHttpRequest ajax
Order Deny,Allow
Deny from all
Allow from env=ajax

それはajaxリクエストに対して十分なセキュリティですか、それともajaxリクエストに対してトークンセキュリティを実装する必要がありますか?

4

2 に答える 2

10

ページの読み込み時にシークレット (トークン) を生成するだけです。ページに配置し、セッションに入れます。通常、可能であれば非表示フィールドとしてフォームに配置します。または、それがより大きな非常に ajaxy ページの一部である場合は、ページ全体をラップする div のような関連要素の値属性に配置します。他の人は、シークレットに変数が設定されたスクリプト タグを追加します。

次に、AJAX 呼び出しを行うか、フォームを送信するたびに、シークレットのフィールドを含めます。(Cheekysoft の回答では、生の JS でこれを行う方法について詳しく説明しています。jQuery または使用している可能性のある他のフレームワークでもほぼ同じように行うことができます。) バックエンドのセッション値と一致させて、それらがまだであることを確認します。同じ(同じソースから来た)、そしてあなたはいいです。

セキュリティを強化したい場合は、リクエストごとにシークレットを再生成し、リクエストされたデータとともにその新しいシークレットを返します。すべての ajax リクエストで、その隠しフィールドまたは値属性を新しい値に置き換えます。多くのリクエストや同時リクエストを実行している場合、これはうまく機能しません。実際、HTTPS 経由でこれを行う場合は、ページ全体が読み込まれるたびに 1 つ生成するだけで十分です。

HTTPS 経由でこれを行っていない場合は、インターネット カフェやスターバックスに座っている誰かがセッションを盗んでページをリロードするだけで問題ありません。

これを頻繁に行う場合は、CSRF 保護を行うのに役立つjQuery とさまざまなプラグインをチェックする価値があります。また、私の方法だけが方法ではありません。

于 2012-04-13T15:26:53.100 に答える
2

XHR が GET リクエストの場合は、トークンを URL パラメーターとして含め、PHP スクリプトに から読み取らせます$_GET[]。XHR が POST の場合、トークンを POST データに挿入し、PHP スクリプトに から読み取らせ$_POST[]ます。

GETリクエスト

var token = getElementById( 'myHiddenField' ).value;
var xhr = new XMLHttpRequest();
xhr.open( 'GET', 'server.php?token=' + token );
xhr.send( null );

POST リクエスト

var token = getElementById( 'myHiddenField' ).value;
var xhr = new XMLHttpRequest();
xhr.open( 'POST', 'server.php', true );
xhr.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded' );
xhr.onreadystatechange = function() {
  if (xhreq.readystate != 4) { return; }
  // do client side stuff here
};
xhr.send( 'token=' + token );
于 2012-04-13T15:28:44.880 に答える