何そのCSRF?
(クロスサイト・リクエスト・フォージェリ、クロスサイトリクエストフォージェリのドメイン)が、それはまた、通常、「ワンクリックアタック」やセッション乗馬、として知られている大きなセキュリティリスクインターネット20で2007、の1つとして表示されたネットワーク攻撃ですCSRFまたはXSRFと略記、サイトの悪質な利用がある人、既知のフィッシングサイトです。それは、クロスサイトスクリプティング(XSS)のように聞こえるが、それはほとんどの確率で非常にXSSと異なる、と攻撃ですが。CSRFは、信頼済みサイトを利用するために信頼されたユーザーからの要求により装っている間にXSSは、サイトの利用でユーザーを信頼できます。XSS攻撃と比較すると、CSRF攻撃は、多くの場合、非常に人気がありません(したがって、そのリソースを防ぐために非常にまれである)と擁護することは困難で、それがXSSよりも危険と考えられています。
あなたは何CSRFを行うことができますか?
あなたは、この理解することができます CSRF
攻撃:攻撃者は、あなたが悪質なリクエストを送信するに変装し、自分のアイデンティティを盗みました。CSRFは、物事には、行うことができます:アカウントを盗む、電子メール、メッセージングの名前を送信し、さらに商品の購入、仮想通貨転送する......起因する問題は、次のとおりです。個人のプライバシーや財産の安全性の開示を。
これは、原則として何であるか、その後、非常に強力ですか!
CSRFの原則が概説します
ユーザーが(セッションクッキーを暗号化し、その後でクッキーに保存されていると考えることができる)のサイトには、クッキーに保存されているユーザの情報になります訪問、その後、ユーザーが危険なウェブサイトを訪問した、あなたはこのサイトを使用します。サイトにアクセスする前に、悪質なリクエストを送信するためにクッキーを残します
ウェイCSRF防止
CSRF攻撃(個人声明)とフロントエンドの道のAJAXリクエストを直接背景の契約:私は、CSRF攻撃を防ぐ二つの方法でまとめ
バックグラウンド処理CSRF攻撃
非常に単純な、単にフォームcsrf_tokenのname属性の値を増加させるために、value属性値{{csrf_token()}}の隠し入力フォームタグです。
< フォームクラス= "フォームサインイン" 方式= "POST" > < H2 クラス= "フォームサインイン-見出し" >请登录</ H2 > < 入力タイプ= "隠し" 名= "csrf_token" 値= "{{ csrf_token()}} " > < ラベル用inputEmail "=" クラス= "SR-のみ" >邮箱:</ ラベル> < 入力タイプ= "メール" ID ="inputEmail」 クラス= 『フォームコントロール』の名前= "メール" プレースホルダ= "请输入邮箱地址" 必要なオートフォーカス> < ラベル用= "inputPassword" クラス= "SR-のみ" >密码:</ ラベル> < 入力タイプ= "パスワード" ID = "inputPassword" クラス= "フォームコントロール" 名= "パスワード" プレースホルダ= "请输入密码" 必要な> < divのクラス= "チェックボックス" > < ラベル> <入力タイプ=「チェックボックス」名前=「覚えています」値= "1" > 记住我 </ ラベル> </ DIV > < ボタンクラス= "BTN BTN-LG BTNプライマリBTNブロック" タイプ= "送信" >立即登录</ ボタン> </ 構成>
フォームのCSRF攻撃で渡されたパラメータのフロントエンドは、ポストパラメータ(パートPythonのWebフレームワークフラスコ背景のログインを取得するのが普通ではないことができるように、アプリケーションに必要な背景バインドをcsrftoken、それはCSRF攻撃に対するこのアプローチを使用することですの)
DEF create_app(): "" " メインエントリファイル作成アプリ、他の使用のための青写真 :リターン:アプリケーションへの回帰 " "" アプリケーションはフラスコ(= __name__ ) #をCSRFインジェクション攻撃を防ぐ CSRFProtect(APP) #の登録青写真モジュール (app.register_blueprintをcms_bp、URL_PREFIX = " / CMS " ) app.register_blueprint(common_bp、URL_PREFIX = " /共通" ) app.register_blueprint(front_bp) #のインポート・プロファイルの app.config.from_object(設定) #のデータベースDBの初期化アプリケーション db.init_app(APP ) #バックグラウンドの初期化のApp login_managerログイン cms_login_manager.init_app(APP) のリターンのAppを IF __name__ == ' __main__ ' : アプリケーション = create_app() app.run()
Ajaxリクエスト遠位実施形態
フロントエンドのAjaxリクエストは、ページを更新するために非常に良い方法を達成することであるが、Ajaxリクエストは、CSRF攻撃を持っています。防ぐCSRF攻撃は、また、ちょうど2つの手順は非常に簡単です:
1)現在のページCSRFトークン、{{csrf_token()}}メタタグの内容に名前を追加します
< メタ名= "CSRFトークン" コンテンツ= "{{csrf_token()}}" >
2)のAjaxリクエストを書き換え、及びcsrftokenを含む要求ヘッダを返します
「厳格な使用」。 VaRの cpajax = { "GET":関数(引数){ 引数[ "方法"] = "GET" 。 このアヤックス(引数); }、 "ポスト":関数(引数){ 引数[ "方法"] = "POST" 。 このアヤックス(引数); }、 "AJAX":関数(引数){ この._ajaxSetup()。 $アヤックス(引数); }、 "_ajaxSetup":関数(引数){ $ .ajaxSetup({ "beforeSend":(XHR、設定){ 場合(/ ^(GET!| HEAD |オプション|!TRACE)$ / i.test(settings.type)&& この.crossDomain){ VAR csrftoken = $( "メタ[名= csrftoken ] ")ATTR("コンテンツ」)。 xhr.setRequestHeader( "X-CSRFToken" 、csrftoken)。 } } })。 } }。
3)ように、フロントエンドは、$ .post()要求を(そのような要求は、CSRF攻撃を防ぐことはできません)を使用することはできませんが、Ajaxを使用することは、私たちの書き換えを要求します。
$(関数(){ $( "#Submit")( "クリック"、ON。機能(イベント){ event.preventDefault(); VAR oldpwdE = $( "INPUT [名= OLDPWD]" ); VAR newpwdE = $ ( "INPUT [NAME = NEWPWD]" ); VAR newpwd2E = $( "INPUT [NAME = newpwd2]" ); VAR OLDPWD = oldpwdE.val(); VAR NEWPWD = newpwdE.val(); VAR newpwd2 = newpwd2E.val (); // 1は、テンプレートメタタグでCSRFトークンをレンダリングする // 2、ヘッドAJAXリクエストCSRFtoken-Xで提供さ はconsole.log( "AAAAAAA" )。 cpajax.post({ "URL": "/ CMS / resetpwd" 、 "データ" :{ "OLDPWD" :OLDPWD、 "NEWPWD" :NEWPWD、 "newpwd2" :newpwd2 }、 "成功":機能(データ){ コンソール.logの(データ) }、 "失敗":機能(エラー){ にconsole.log(エラー) } }) }) })。