CSRFの防御例(PHP)

5532 ワード

原文接続:http://www.pythontab.com/html/2014/php_1121/923.html
CSRFの防御はサービス側とクライアント側の両方から着手することができ、防御効果はサービス側から着手したほうが効果的であり、現在では一般的なCSRF防御もサービス側で行われている.1サービス・エンド
CSRFの防御はサービス側とクライアント側の両方から着手することができ、防御効果はサービス側から着手したほうが効果的であり、現在では一般的なCSRF防御もサービス側で行われている.
1.サービス側がCSRF防御を行う
サービス側のCSRF方式の方法は様々であるが,クライアントページに擬似乱数を増やすことが全体的な考え方で一致している.
(1)-Cookie Hashing(すべてのフォームに同じ擬似ランダム値が含まれています):
これは最も簡単な解決策かもしれませんが、攻撃者はサードパーティのCookie(理論的に)を得ることができないため、フォームのデータの構築に失敗しました:>
      // Cookie     $value   = “DefenseSCRF”;    setcookie(”cookie”,  $value , time()+3600);  ?>
フォームにHash値を追加して、これがユーザーから送信されたリクエストであることを確認します.    $hash   = md5( $_COOKIE [ 'cookie' ]); ?>          $hash ;?>”>   
そしてサーバ でHash を う              if (isset( $_POST [ 'check' ])) {                $hash   = md5( $_COOKIE [ 'cookie' ]);                if ( $_POST [ 'check' ] ==  $hash ) {                    doJob();              }  else   {          //...               }         }  else   {        //...         }        ?>
この は には99%のCSRF を ぐことができると いますが、まだ1%あります.ユーザーのCookieはサイトのXSSの で まれやすいので、 の1%です. な はHash を する があるのを て、 に します.いくつかは されます.だから、100%の が なら、これは の ではありません.
(2). コード
この の は: のユーザーの はすべてユーザーがフォームの で1つのピクチャーの のランダムな を する があって、 ....この は にCSRFを することができて、しかし は いやすい の であまりよくないようで、また コードのピクチャーの は1つのMHTMLと ばれるBugに していると いて、いくつかのバージョンのマイクロソフトのIEの で を けるかもしれません.
(3).One-Time Tokens( なるフォームには なる ランダム が まれています)
One-Time Tokensを する は、「パラレルセッションの 」に してください.ユーザーが1つのサイトで に2つの なるフォームを いた 、CSRF は、どのフォームへの にも を えるべきではありません.フォームがロードされるたびにサイトが の ランダム を きする ランダム を すると、 のすべてのフォームに な ランダム が まれているため、ユーザーは に いたフォームを にコミットするしかありません.CSRF がオプションカードのブラウズに しないか、 のブラウザウィンドウを して1つのサイトをブラウズしないように してください.
の の :
1).まずトークン (gen_token()        function   gen_token() {        // , Rand() , 。      // Findbugs 《Random object created and used only once》            $token   = md5(uniqid(rand(), true));            return   $token ;       }
2). はSessionトークン (gen_stoken()です.               function   gen_stoken() {        $pToken   "" ;        if ( $_SESSION [STOKEN_NAME]  ==  $pToken ){          // ,          $_SESSION [STOKEN_NAME] = gen_token();       }            else {          //       }         }       ?>
3).WEBフォームは ドメインの を する:              function   gen_input() {              gen_stoken();              echo                     value=\”" .  $_SESSION [STOKEN_NAME] . “\”> “;         }       ?>
4).WEBフォーム :                 session_start();            include (”functions.php”);       ?>                                         gen_input(); ?>                 
5).サービス トークン:
これは です.ここではもうくどくどしません.