4

레일에서 초보자를 도와주세요 :) 내 ApplicationController 클래스에 속성이없는 호출 (기본적으로 제공됨)이 있습니다.Rails가 위조 방지 설정을 요청합니다

class ApplicationController < ActionController::Base 
    helper :all # include all helpers, all the time 
    protect_from_forgery 
    helper_method :current_user_session, :current_user 
    filter_parameter_logging :password, :password_confirmation 

내가 그것을해야 가정하는 것은 :

은 기본적으로 여기에 코드의 IT는 올바른 authenticity_token없이 POST 요청을 방지해야한다. 하지만 jQuery와 함께 게시물 요청을 보내면 아래와 같이 제대로 작동합니다 (데이터베이스에서 실행되는 업데이트 문이 있음)!

$.post($(this).attr("href"), { _method: "PUT", data: { test: true } }); 

나는이 전송 매개 변수들 사이에 authenticity_token을 없지만 요청이 여전히 유효한 것으로 간주됩니다 콘솔을 참조하십시오. 왜 그런가요?

는 UPD 때문에 DEV 환경과 로컬 요청의

config.action_controller.consider_all_requests_local = true 

설정/환경/development.rb에서 찾을 구성 설정은 다음의 jQuery POST 요청을 확인했다.

답변

2

$.post($(this).attr("href"), { _method: "PUT", data: { test: true } }); 요청이 앱 자체 내에서 실행되는 한 코드에 아무런 문제가 없습니다. localhost : 3001에서 예를 들어 다른 곳에서 실행중인 다른 앱이 있고 거기에서 게시물을 보내면 작동하지 않습니다. Infact 당신이 파이어 폭스> 3.0에 있다면 그것은 크로스 사이트 xhr의 초기 구현을 가지고 있습니다. 예를 들어 다른 사이트에서 POST를 보낼 수 있습니다 (그러나이 경우 protect_from_forgery는 꺼져 있습니다!). auth 토큰이 xhr에 필요하지 않은 이유는 크로스 사이트 xhr이 비활성화되어 있기 때문입니다. 따라서 인증 토큰을 제공하지 않고 xhr을 사용하는 것이 안전합니다. 당신이 다른 곳에서 당신의 앱이 아닌 다른 곳에서 시도한다면, 인증 토큰을 요청하는 예외가 발생할 것이라 확신합니다. 또한 외부 소스에서 액세스하지 못하도록 crossdomain.xml을 정의해야합니다.

curl -X -d url_endpoint_of_your_app을 시도해보십시오. 200 응답 코드가 있는지 확인하십시오. 너가 그때하면 뭔가 비린내가있다.

+0

다른 응용 프로그램에서도 localhost를 사용해서는 안됩니다. 나는 아마 당신이 옳았는지 점검 할 것이고 이것은 추가적인 보안 검사없이 지역 전화로 간주 될 것이다. – Vitaly

+0

localhost에서 수행하더라도 다른 포트에서 실행됩니다. 따라서 앱은 다른 도메인에서 실행됩니다. 유일한 해결책은 crossdomain.xml을 수정하는 것입니다. –

+0

굉장합니다. 이 동작을 변경하기 위해 수정할 수있는 DEV env에 대한 설정을 찾았습니다. – Vitaly

0

어쩌면 질문 : 아마도 ApplicationController를 서브 클래 싱하고 있습니까? 당신의 노선도는 어떻게 생겼습니까? 그리고 Rails의 어떤 버전 (명확성을 위해서)?

jQuery의 호출이 실제로 POST이고 GET이 아닌지 확인 했습니까? (나는 그것이 명백하게 보인다는 것을 안다). Rails는 비 GET 요청에 대해서만 보호를 수행합니다.

또한 콘텐츠 유형의 외출 요청은 입니다. 레일스는 또한 the docs에 따라 HTML/자바 스크립트 요청 인 경우에만 보호 기능을 수행합니다.

+0

실제로, verified_request의 소스를보고 있습니까? (레일스가 인증 토큰을 검증하기 위해 사용하는) 요청이 xhr이면 인증 토큰에 아무런주의를 기울이지 않는 것처럼 보입니다. 아마 * jQuery는 content-type을 Rails가 xhr 요청에 응답하고 auth 토큰의 부족을 무시한다고 생각하게 만듭니다. – davemyron

+0

응답 해 주셔서 감사합니다! 예, 저는 확실히 ApplicationController를 상속하고 있습니다. (사실, ApplicationController를 서브 클래 싱하는 AdminController를 서브 클래 싱합니다.) 그리고 네, 이것은 "development.log"파일에 따라 POST/PUT 요청입니다. 거기에 모든 POST 요청 매개 변수가 표시되며 authenticity_token도 없습니다. 기본 jQuery contentType의 경우에도 예외를 발생시켜야하지 않습니까?! – Vitaly

+1

xhr 요청 인 경우 Rails는 인증 토큰에 아무런주의를 기울이지 않습니까? 이 구멍이 아닌가요? – Vitaly

관련 문제