5

InvalidAuthenticityToken と protect_from_forgery について StackOverflow で複数の質問と回答を読みましたが、賢明なものはありません。

毎日何百ものこれらのエラーが発生する Web サイトがあります。それらは主にモバイルからのもののようですが、サンプルで確認しただけです。

AuthenticityToken が存在する理由と追加の必要性を理解しています

<%= csrf_meta_tags %>

application.html(私が持っています)に、アプリケーションコントローラーにprotect_from_forgeryを持っています。csrf_meta_tags と次の両方があります。

protect_from_forgery with: :exception

デフォルトのように、私のアプリケーションコントローラーで。

protect_from_forgeryを削除することで問題を「解決」できることはわかっていますが、CSRF攻撃に対して脆弱になるため、実際には解決策ではありませんか? 行われるフォームの投稿に対して、protect_from_forgery に「例外」を追加することはできますが、それは私を同じように脆弱なままにしてしまいますよね?

編集: Cookie を無効にしてモバイルでフォームにアクセスしようとしたところ、422 エラーが発生しました。ただし、例外を発生させることはできませんでした。「結果」関数の例外を追加するとそれが削除されましたが、それにより脆弱になると思いますか?

Edit2: 同じページに複数のフォームがあります (検索フォームなど)。おそらくこれは問題に影響を与える可能性がありますか?

1日に何百人ものユーザーにエラーが発生し、ウェブサイトがハッキングに対して脆弱になるのではないかと恐れているため、削除できません。

それで、なにかお手伝いできますか?まともな中間点はありますか?

protect_from_forgery を変更しても、ハッカーによってデータベースが破壊されないことを確信できる方法はありますか?

サイトで API を使用していませんが、すべてのエラーは同じ種類のフォームから発生しています。この問題にはJavaScriptの部分があることは理解していますが、その情報を使用して問題を解決する方法は実際にはわかりません。

前もって感謝します!

私が得る例外の例:

An ActionController::InvalidAuthenticityToken occurred in calculations#result: 

ActionController::InvalidAuthenticityToken 

------------------------------- 
Request: 
------------------------------- 

* URL : http://www.example.com/calculation/result 
* HTTP Method: PUT 
* IP address : 217.214.148.251 
* Parameters : {"utf8"=>"✓", "_method"=>"put", "authenticity_token"=>"udnClerrF5UWvg84uaD82TzmPx/vWssv2wN9UPqyn10UwXqbOwa2FBtnZ5Nfo7HPh9xbA2OSrrUNineW50XiYg==", "commit"=>"Calculate", "controller"=>"calculations", "action"=>"result", "id"=>"123"} 
* Timestamp : 2016-08-19 12:11:09 UTC 
* Server : 2696e83c-1538-434d-ab6d-4e16577698d0 
* Rails root : /app 
* Process: 6 

------------------------------- 
Session: 
------------------------------- 

* session id: "42b36aacc78102605cb3365922a550b1" 
* data: {"session_id"=>"42b36aacc78102605cb3365922a550b1", 
"_csrf_token"=>"KU43tmmXbxxgoabHrbejg+NWWP1tUVoWABNDqO8FiFI="} 


------------------------------- 
Environment: 
------------------------------- 

* CONTENT_LENGTH : 322 
* CONTENT_TYPE : application/x-www-form-urlencoded 
* HTTP_ACCEPT : text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
* HTTP_ACCEPT_ENCODING : gzip, deflate 
* HTTP_ACCEPT_LANGUAGE : sv-se 
* HTTP_CONNECTION : close 
* HTTP_CONNECT_TIME : 0 
* HTTP_COOKIE : __unam=91429fa-156a1632125-9bccf3-3; _ga=GA1.2.357545074.1471586444; _gat=1 
* HTTP_HOST : www.example.com 
* HTTP_ORIGIN : http://www.example.com
* HTTP_REFERER : http://www.kalkyleramera.se/calculation
* HTTP_TOTAL_ROUTE_TIME : 0 
* HTTP_USER_AGENT : Mozilla/5.0 (iPhone; CPU iPhone OS 9_3_3 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13G34 Safari/601.1 
* HTTP_VERSION : HTTP/1.1 
* HTTP_VIA : 1.1 vegur 
* HTTP_X_FORWARDED_FOR : 217.214.148.251 
* HTTP_X_FORWARDED_PORT : 80 
* HTTP_X_FORWARDED_PROTO : http 
* HTTP_X_REQUEST_ID : 5e925192-d6ea-4cd3-b049-20010f11f2c2 
* HTTP_X_REQUEST_START : 1471608669086 
4

1 に答える 1

2

この問題については、こちらで説明しています。それがあなたの問題である場合はCan't verify CSRF token authenticity Completed 422 Unprocessable Entity、ログ内に表示されるはずです。2 つのソリューションについて説明します

  • キャッシュ制御を変更するconfig.action_dispatch.default_headers.merge!('Cache-Control' => 'no-store, no-cache')
  • 無効なセッションを null セッションに変更するprotect_from_forgery with: :null_session

しかし、それはまだ未解決の問題のようです。

于 2016-08-20T15:47:59.210 に答える