2017-10-20 20 views
0

マイセットアップデータを送信:S3 (welcome.mydomain.com)AWS経由で提供ランディングページとしてジャンゴ - CSRFの検証に失敗しました - 私のDjangoアプリケーションに静的なWebサイト上のフォームから

  • 静的なウェブサイトを。
  • djangoアプリ(django-1.8 with python 2.7) サブドメイン(app.mydomain.com)からアクセス可能です。

私は静的なウェブサイトの一部であり、私のdjangoサーバに連絡先フォーム情報を送信して処理する連絡フォームを追加したいと思います。 異なるスタイルシートやリソースを使用していて、サーバー間で混在させたくないため、連絡先フォームをテンプレートとしてDjangoアプリケーションに追加したくありません。 フォームデータを処理するビューは、このデータを電子メールに追加し、これを内部電子メールアドレスに送信するだけです。

フォームにcsrfトークンが含まれていないため、403 csrf verification failedエラーが表示されます。

私は現在、csrf検証からリクエストを受け取ったビューを免除することができましたが、これがどのようなセキュリティリスクを引き起こすかはわかりません。

私はcsrfの攻撃と危険性を理解していないか、この問題を間違った方法で見ているかどうかはわかりません。すべての私の検索とdjango-csrf関連の質問に対するすべての回答はこれまで私を助けてくれていません。

ここに私の質問は以下のとおりです。

  • この問題を解決するためのより良い方法はありますか?
  • csrf_exemptをセキュリティリスクを追加することなく使用できますか(たとえば、追加の検証を行うなど)?

答えて

0

ajaxリクエストで使用される手法であるCSRFトークンを動的に追加できます。 https://docs.djangoproject.com/en/1.11/ref/csrf/から:

/** 
* getCookie gets a cookie called 'name' in the current session 
* @param name name of the cookie to get 
* @returns value of the cookie requested, null if not found 
*/ 
function getCookie(name) { 
    var cookieValue = null; 
    if (document.cookie && document.cookie !== '') { 
     var cookies = document.cookie.split(';'); 
     for (var i = 0; i < cookies.length; i++) { 
      var cookie = jQuery.trim(cookies[i]); 
      // Does this cookie string begin with the name we want? 
      if (cookie.substring(0, name.length + 1) === (name + '=')) { 
       cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); 
       break; 
      } 
     } 
    } 
    return cookieValue; 
} 

var csrftoken = getCookie('csrftoken'); 

function csrfSafeMethod(method) { 
    // these HTTP methods do not require CSRF protection 
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); 
} 

/** 
* When doing posts, deletes, etc. we need to transmit the CSRF cookie for 
* the request to go through properly, so add the cookie to all ajax calls 
* that need the cookie. 
*/ 
$.ajaxSetup({ 
    beforeSend: function (xhr, settings) { 
     if (!csrfSafeMethod(settings.type) && !this.crossDomain) { 
      xhr.setRequestHeader("X-CSRFToken", csrftoken); 
     } 
    } 
}); 

次に、あなたのフォーム上の[送信]をクリックします "することができますAJAX呼び出しを介してフォームデータを投稿、次のページへのリダイレクトが続きます。

1

djangoが提供するcsrf_exemptデコレータを使用してフォームからのcsrf検証を免除する前に、これを検討して決定することをお勧めします。

What is a CSRF token ? What is its importance and how does it work?

優れたセキュリティ対策のためのフォームでcsrf_tokenユーザーに、最近その良い練習けれども。

関連する問題