22
  1. Cookieだけでなく、GETおよびPOSTパラメーターでの認証が必要です。

  2. HTTPリファラーヘッダーを確認します。

ウィキペディアでこの投稿を見て、どうすればそれらを適用できるのか疑問に思いました

わかりました...KohanaPHPフレームワークを使用していて、リファラーヘッダーを判別する機能がありますが、リファラーヘッダーを正確にチェックインするにはどうすればよいですか?フレームワーク関数はリファラーのURLのみを返します

GETパラメータとPOSTパラメータを検証するにはどうすればよいですか?何に対して?保存された情報?期待されるタイプ?

4

3 に答える 3

48

CSRFを防ぐには、1回限りのトークンを検証し、POSTを実行して、現在のセッションに関連付けます。次のようなもの。。。

ユーザーがレコードの削除を要求するページ:

確認.php

<?php
 session_start();
 $token = isset($_SESSION['delete_customer_token']) ? $_SESSION['delete_customer_token'] : "";
 if (!$token) {
     // generate token and persist for later verification
     // - in practice use openssl_random_pseudo_bytes() or similar instead of uniqid() 
     $token = md5(uniqid());
     $_SESSION['delete_customer_token']= $token;
 }
 session_write_close();
?>
<html>
<body>
<form method="post" action="confirm_save.php">
 <input type="hidden" name="token" value="<?php echo $token; ?>" />
Do you really want to delete?
<input type="submit" value=" Yes " />
<input type="button" value=" No " onclick="history.go(-1);" />
</form>
</body>
</html>

次に、実際にレコードを削除する場合は、次のようにします。

firm_save.php

<?php
 session_start();
 // validate token
 $token = isset($_SESSION['delete_customer_token']) ? $_SESSION['delete_customer_token'] : "";
 if ($token && $_POST['token'] === $token) {
   // delete the record
   ...
   // remove token after successful delete
   unset($_SESSION['delete_customer_token']);
 } else {
   // log potential CSRF attack.
 }
 session_write_close();
?>

トークンは推測が難しく、削除リクエストごとに一意であり、$ _ POSTを介してのみ受け入れられ、数分後に期限切れになります(この例では有効期限は示されていません)。

于 2009-11-23T01:41:45.580 に答える
4

リファラーチェックでは、リファラーがサイト/システムからのものであることを確認するためにすべてのことを行っています。リファラーが存在しないか、外国のサイトからのものである場合、リファラーチェックは失敗し、要求が行われていることを尊重したくない場合があります。

過去には、さまざまなテクノロジーやブラウザー(flash..et al)の問題により、参照ヘッダーの偽造が許可されていました。考慮すべきことです。参照ヘッダーがリクエストヘッダーに存在しない/渡されないリソースにリンクするためにjavascriptを使用するいくつかの方法があります。

この動作はブラウザによって多少異なります。javascriptを使用してフォームを送信する場合は、通常は問題ありません。window.locationのようなものを使用する場合、参照データが存在することを期待すべきではない可能性があります。

CSRF防止の一般的な方法は、Cookieを使用せず、常に参照間で状態を渡すことです...アプリケーション全体のすべてのリンクでセッショントークンを渡します。

于 2009-11-23T01:42:17.207 に答える
2

[注:] Kohanaフレームワークは非推奨であり、Kohana PHP 7の新しいフォークはhttps://koseven.ga/であり、セキュリティクラスのCSRF機能をサポートしています。

公式のkosevenセキュリティ機能を使用できます。これがkosevenセキュリティクラスへのリンクです。

于 2015-11-13T13:00:38.823 に答える