2017-09-13 11 views
0

純粋にjavascriptを使用して、Springで構築された特定のWebサービスにアクセスしています。サービスの1つにAjax Postコールを使用しようとしたとき、私はCSRFの問題に遭遇しました。Ajaxを使用した無効なCSRFトークン

Ajax呼び出しが行です:

var data = {'attribute1':'1','attribute2':'2'}; 

$.ajax({ 
    type: "POST", 
    url: url, 
    data: data, 
    success: function(data) 
    { 
     if (typeof inputId !== 'undefined') { 
      $("#"+inputId).val(JSON.stringify(data)); 
     } 
     console.log(JSON.stringify(data));  
    } 
    }); 

属性を取り込むために、私はウェブを検索されているが、私は発見したすべてのバックエンド(JSP、PHP)を更新することである「$ {_ CSRF。 parameterName} "を入力します。 しかし、私はバックエンドを使用していない、すべてのページはHTMLとJavaScriptのみです。

答えて

1

CSRF_Tokenは、Webフレームワーク/サーバによって送信され、ブラウザに保存されたクッキーです。通常、あなたがやっているようにajax呼び出しを使って投稿するときは、CSRF_Token値をJSONデータの一部として送信する必要があります。これを行うには... JavaScriptを使用してCookie名を見つけて値を取得する必要があります。サーバーが期待している正しい変数名に値を割り当てる必要があります。例えば、

var data = { crsf_token_name_server_expects: csrf_token_value_I_obtained }; 

CSRF_TokenはあなたのAPIと通信し、人々が実際にあなたのサイトにアクセスし、そこにデータをPOSTしようとする前に、有効なセッションを作成したことを確認するために使用されます。 stackoverflow.comがGoogle.comとStackoverflow.comの間の通信を許可するcorsヘッダーと呼ばれるものを設定していない限り、google.comのユーザーはstackoverflow.comに投稿できません。

あなたの質問に基づいて...あなたは、Java Springによって強化されたバックエンドAPIに投稿していると言っています。このapiはcsrf_tokenを期待しているので、このサービスが設定されているドメイン名に対してのみ使用されることになっているapiのようです。たとえば、ユーザーはgoogle.comに行き、www.google.com/url_to_post_to/にPOSTします。 Googleは、このリクエストでCSRF_Tokenが送信されることを保証します...彼らは有効なGoogleセッションを持たずに、このapi urlに無作為にアクセスしたくないからです。

+0

ありがとうございます。私が本当に知る必要があるのは、サーバーが期待する名前と実際のトークンの2つです。私はさらなる研究を続けてきました。そして、明らかに、Springはデフォルトでこのトークンをクライアントに見えなくします。したがって、テクノロジー(JSP)を使用しない場合は、そのテクノロジーを無効にする必要があります。 – Tony

関連する問題