5

サイトからのすべてのAJAXPOSTリクエストがauthenticity_tokenなしで通過できるようにする規定はレールにありますか?

コントローラメソッドを呼び出すJqueryPOSTajax呼び出しがありますが、認証コードを入れていませんが、呼び出しは成功します。

私のApplicationControllerには「request_forgery_protection」があり、変更しました

config.action_controller.consider_all_requests_local

私のenvironments/development.rbでfalseに

また、コードを検索して、真正性トークンを送信するためにajaxSendをオーバーロードしていないことを確認しました。

チェックを無効にするメカニズムはありますか?現在、CSRF保護が機能しているかどうかはわかりません。

Rails2.3.5を使用しています。

明確にするための更新:

function voteup(url, groupid){
      $.ajax({
        type: "POST",
        url: "/groups/" + groupid + "/submissions/voteup",
        data: "url=" + url,
        dataType: 'text',
        success: function(data){
          var counter = "vote_" + url;
          $('#vote_' + url.cleanify()).text(" " + data + " ");
        }
      });
    };

上記の関数を呼び出す'hrefを持つリンクがあります。

<a href='javascript:voteup(param1,param2)'>...</a>
4

2 に答える 2

7

ここで考えられるシナリオは、jQueryを使用して通常のRailsフォームをシリアル化することです...これには、シリアル化された認証トークンの非表示フィールドが含まれます(Railsはそれらをすべてのフォームに追加します)。

送信しているフォームの生成されたソースを確認してください...表示される可能性があります

<input name="authenticity_token" type="hidden" value="somethinghere...." />

もう1つできることは、ログをチェックして、authenticity_tokenフィールドが要求パラメーターに含まれているかどうかを確認することです。

于 2010-06-17T06:59:08.343 に答える
3

レイアウトビューにこれを追加します。app/views/layouts/(something).html.erb

<% if protect_against_forgery? %>
 <script type="text/javascript" charset="utf-8">
  //<![CDATA[
   window._auth_token_name = "#{request_forgery_protection_token}";
   window._auth_token = "#{form_authenticity_token}";
  //]]>
 </script>
<% end %>

そしてあなたのapplication.jsで:

$.ajaxSetup({
  'beforeSend': function(xhr) {xhr.setRequestHeader("Accept", "text/javascript")}
});

$(document).ready(function() {
 //  All non-GET requests will add the authenticity token
 //  If not already present in the data packet
 $("body").bind('ajaxSend', function(elm, xhr, s) {
   if (s.type == "GET") return;
   if (s.data && s.data.match(new RegExp("\\b" + window._auth_token_name + "="))) return;
   if (s.data) {
  s.data = s.data + "&";
  } else {
   s.data = "";
   // if there was no data, $ didn't set the content-type
   xhr.setRequestHeader("Content-Type", s.contentType);
  }
  s.data = s.data + encodeURIComponent(window._auth_token_name) + "=" + encodeURIComponent(window._auth_token);
 });

application_controller.rbにこれを追加して、IE/SAFARIが正しいacceptヘッダーを確実に受信できるようにします。

 def correct_safari_and_ie_accept_headers
    ajax_request_types = [ 'text/javascript', 'application/json', 'text/xml']
        request.accepts.sort!{ |x, y| ajax_request_types.include?(y.to_s) ? 1 : -1 } if request.xhr?
 end

これにより、acceptヘッダーがデフォルトでtext/javascriptapplication/jsonまたはtext/xmlデフォルトの代わりになりますtext/html

これで、通常のAJAX呼び出しを実行できます。認証トークンを渡します。window._auth_token_nameまた、2つのグローバル変数とを必要とするため、CDATAスクリプトタグの後にのみapplication.jsを含めるようにしてくださいwindow._auth_token

お役に立てれば!乾杯 :)

于 2010-06-17T07:37:26.590 に答える