CSRF治療の原則とフラスコ

 

CSRF治療の原則とフラスコ

なぜCSRF?

フラスコ-WTFフォームはCSRFの脅威からあなたを守り、あなたは任意の懸念を持っている必要はありません。フォームが含まれていないビューを持っている場合にもかかわらず、彼らはまだ保護を必要とします。

たとえば、POSTは、AJAXリクエストから送られてくるが、その背後に形成されません。フラスコ-WTF 0.9.0以前のバージョンでは、CSRFトークンを取得することはできません。我々はCSRFを達成したい理由です。

CSRF攻撃の作品:

        通常のユーザーのログイン①銀行のウェブサイト、

        ②Aのウェブサイトが利用者にクッキー情報を返し、ブラウザを格納クッキー情報

        ③(有効期限が切れていないか、またはクッキー情報)にログインせずにAサイトの場合は、悪意のあるWebサイトBをログに記録

        ④悪質なWebサイトのB、それを隠すために転送要求のフォームまたは別の準備を控え、。Aボタンは、画像リンク「クーポンを受ける」として、サイトに提出するように設定されている。ユーザーがリンクをクリックしてください

        ⑤利用者の主観不明、サイト訪問で、この時間は、ブラウザが自動的にクッキー情報を運ぶでしょう

        クッキーに⑥Aサイトの識別情報は、デフォルトでは、ユーザ自身によって行われた要求であり、要求に応じて適切な処置を行うこと。

        ⑦ユーザーが損失を受けます。

具体的な手順:

原理csrf_token検証は、以下のステップの特定の手順:
1. csrf_token生成された値は、フロントエンド・インターフェース要求の後端または遠位端に値を登録し、パスの遠位端は、次の2つの方法を有することができる
でテンプレートから隠されたフォームフィールドが追加
遠位端csrf_tokenクッキーを使用して方法を通過する
フロントエンドで、またはフォームcsrf_tokenで開始要求は、テープのリクエストヘッダで指定されたときに2
取る、後端の要求を受信した後、3 csrf_tokenは、第一検査工程csrf_token生成された値と、フロントエンドから送信された
整合性csrf_tokenのチェックは、通常の要求を表す場合4、または要求は、偽造できないことによってもよいです

:開発者は、いくつかのことを行う必要があるので、フラスコ、CSRFProtectでは、このクラスでは、具体的にのみ、指定されたアプリに検証作業をcsrf_token
のcsrf_token値生成
ブラウザcsrf_tokenの先端に渡された値が
要求csrf_tokenの先端にバンド値を

そして、実現

アプローチ:

バックエンドの書き込み:

CSRFの保護機能により、すべてのビューを可能にするために、オープンCsrfProtectモジュールする必要があります。

flask_wtf.csrf 輸入CsrfProtect 
CsrfProtect(アプリ)

その他の拡張子と同じように、フラスコのように、あなたは不活性それを読み込むことができます。

flask_wtf.csrf インポートCsrfProtect 
CSRF = CsrfProtect()
 
DEF create_app():
  アプリ =フラスコ(__name__ 
  csrf.init_app(APP)

 


CSRF保護設定用の秘密鍵が必要です。典型的には、フラスコアプリケーションとSECRET_KEYは同じです。

フォームで保護操作を追加します。

フォームテンプレートがある場合、あなたは何もする必要はありません。以前のように:

<フォームメソッド= " ポスト"アクション= " / " > 
  {{form.csrf_token}}
 </フォーム>

何のテンプレートフォームが存在しない場合でも、あなたはCSRFトークンを必要とします:

<フォームメソッド= " ポスト"アクション= " / " > 
  の<input type = " 隠れた" NAME = " csrf_token "値= " {{csrf_token()}} " /> 
</フォーム>

カスタムエラーと対応する保護を閉じます。

たびCSRF、400を返す応答を認証されていません。あなたは、このエラー応答をカスタマイズすることができます。

@ csrf.error_handler
 デフcsrf_error(理由):
   リターン render_template(' csrf_error.html '、理由=理由)、400

すべてのビューのためにCSRFの保護を有効にすることをお勧めします。また、デコレータの保護を必要としない、いくつかのビュー機能を提供します。

@ csrf.exempt 
@ app.route(' / fooの'、メソッド=(' GET '' POST ' ))
 DEF my_handler():
  ... 
  リターン ' OK '

また、あなたは()csrf.protectを呼び出すことを選択するための時間を必要とする場合にのみ、FalseにWTF_CSRF_CHECK_DEFAULTを設定することで、すべてのビューCSRFの保護ではデフォルトで無効にすることができます。また、トークンCSRFをチェックする前に、いくつかの前処理を行うことができます:

@ app.before_request
 DEF check_csrf():
   もし ないis_oauth(リクエスト):
    csrf.protect()

データのAjaxの提出:

CSRFトークンのメタタグをレンダリング:

<メタ名= " CSRFトークン"コンテンツ= " {{csrf_token()}} " >

レンダリングは、スクリプトタグでも可能です。

<スクリプトタイプ= " テキスト/ javascriptの" > 
  VAR csrftoken = " {{csrf_token()}} " 
</ SCRIPT>

次の例では、より簡単になりますスクリプトをレンダリング、レンダリングモードでメタタグを使用して、該当する例については心配しないでください。

AJAX POSTリクエストを送信するたびに、X-CSRFTokenヘッダを追加します。

VAR csrftoken = $( 'メタ[名= csrftoken] ' ).ATTR( 'コンテンツ' 
 
KaTeX解析エラー:' } '、だ' EOF '入力の終わりに:... |オプション| TRACE)/私は。試験(settings.type)&& !this.crossDomain){ 
xhr.setRequestHeader(「X - cSRFToken」、csrftoken)
} 
} 
})

またはSO書き込みAJAX:
要求を提出するとき、あなたはリクエストヘッダにX-CSRFTokenキーと値のペアを追加する必要があります。

$アヤックス({ 
  ... 
  ヘッダー:{ 
    " X-CSRFToken ":getCookie(" csrf_token " 
  }、
  ... 
})

トラブルシューティング

フォームを定義する場合、この間違い場合、:インポートフォームwtformsからではなく、flask.ext.wtfからのインポート、ほとんどのCSRF保護機能は、(form.validate_on_submit()を除く)動作しますが、CSRF保護例外が発生します。フォームが送信されると、あなたが見つからないか、不正なエラートークン不正な要求/ CSRFを取得します。このエラーは、インポートエラーではなく、設定に問題があるために発生します。

 

 

おすすめ

転載: www.cnblogs.com/ls011218/p/11817228.html