2012-05-20 24 views
6

我有一個現有的軌道後端網站,使json電話到服務器。現在,我正在開發一個移動iOS應用程序來使用相同的後端,並在json中發送呼叫。但是,移動請求與失敗:安全可靠,可禁用jsr欄位調用的csrf標記?

WARNING: Can't verify CSRF token authenticity 

各地計算器搜索,許多建議使用這樣的事情以禁用JSON電話CSRF檢查:

# Or this in your application_controller.rb 
def verified_request? 
    if request.content_type == "application/json" 
    true 
    else 
    super() 
    end 
end 

但我的問題是,我不知道如何這是否可以防止json格式的csrf攻擊?攻擊者總是可以從他們的站點向我們的端點發送json請求。任何人都有這方面的見解?我找不到任何明確的答案。

回答

2

你所描述很容易利用使用Flash:

 var request:URLRequest = new URLRequest("http://stackoverflow.com"); 
     request.requestHeaders.push(new URLRequestHeader('Content-Type', 'application/json'));  
     request.data = unescape('{"a":1,"b":{"c":3}}'); 
     request.method = URLRequestMethod.POST; 
     navigateToURL(request, '_blank'); 

如果你看看CSRF prevention cheat sheet您可以檢查引薦,以確保它從你信任的域。如果引用者是空白的,那麼它可能來自https url,所以應該被視爲失敗。依靠Ruby的CSRF令牌是CSRF保護的更強大形式。

+0

謝謝Rook。是的,它有可能在csrf中破解json調用。看看這個頁面讓我更深入瞭解我們能夠解決這個問題的人。但是您是否知道如何使用由Rails生成的CSRF令牌,以便移動應用程序可以使用它們併發送請求? – Anish

+0

@Anish你可以引導它,也許有一個靜態的get調用,總是返回令牌。 – rook

+0

「你可以檢查引薦來確保它來自你信任的域名。」當然,這些可能很容易被僞造 – SooDesuNe

1

這是阿賈克斯修復

獲取csrf_token從軌或者使用別的東西,從元

// js file 
var csrf_token = $('meta[name=csrf-token]').attr('content'); 

//js.erb file 
var csrf_token = "<%= request.session["<%= _csrf_token %>"] %>"; 

然後添加這js的

$("body").bind("ajaxSend", function(elm, xhr, s){ 
    if (s.type == "POST") { 
    // place lines mentioned above here 
    // line goes here... 
    xhr.setRequestHeader('X-CSRF-Token', csrf_token); 
    } 
}); 
+2

JS示例可能很糟糕,因爲您要預編譯資源並且不會動態重新生成。只是一個小費。這可能是非常可怕的,因爲它可以用於開發,但不適用於生產。 – StingeyB

+0

@StingeyB感謝您的評論:-)我已經添加了對最後一塊代碼的評論,指示用戶在哪裏放置上面提到的行。這應該在資產預編譯之後生存下來,是否同意? – Abdo

相關問題