2012-10-22 3 views
1

좋아, 그래서 레일에 사용할 수 있도록 Javascript 변수를 전달해야하는 페이지 중 하나에 내 레일 애플 리케이션. 이제 하나는 서버 측을 실행하고 하나는 클라이언트 측을 실행하므로 매우 어렵다는 것을 알고 있습니다. 나는 인터넷을 보았고, 내 외부 자바 스크립트 페이지에 포함 된 함수에서 동적으로 폼을 만드는 방법을 발견했다.레일이 CSRF를 감지 할 수 있습니까?

기본적으로 document.createElement 문을 사용하여 숨겨진 필드가있는 양식이 만들어졌으며 숨겨진 필드에 양식을 제출하기 위해 form.submit()이 호출 된 값이 주어졌습니다. 양식에 게시 방법이 주어졌으며 이동 경로가 주어졌습니다. 그래서 제출할 때 페이지가 호출되어 숨겨진 필드가 이제 params 해시에 있고 다른 레일 페이지로 params[:param]으로 액세스 할 수있는 다른 페이지로 리디렉션됩니다.

로그인 한 사용자를 추적하기 위해 세션을 사용할 때까지 잠시 동안 좋은 결과를 얻었습니다. 해당 동적 양식으로 리디렉션되도록 단추를 클릭하면 세션이 지워집니다. 내가 세션에서 지워지는 것에 대해 온라인에서 발견 한 유일한 사실은 레일스가 세션을 지우는 CSRF를 탐지했을 때입니다.

그럼 내가 레일스에서 ​​CSRF를 감지하여 세션을 정리할 수 있습니까? 아무도 모르는 세션이 취소 될 수있는 다른 이유가 있습니까? 또한, 아약스없이 (왜냐하면 난 그걸로 망쳐 놨기 때문에 멋지게 놀지 않는다.) javascript 변수를 전달하는 또 다른 좋은 방법 메신저 (자바 스크립트가 있어야합니다, 나는 자바 스크립트 함수를 사용하고 있습니다. 사용자에게 현재 위치 가져 오기) 레일에 사용할 수 있도록하려면? (나는 폼을 javascripting하는 것보다 오히려 내 페이지에 숨겨진 폼을 만들 수도 있습니다. 소스를보고있는 누군가가 그것을 볼 수 있고 거기에 왜 그곳에 왜 있는지 궁금해하기 때문에 조금 덜 우아합니다.)

누군가가 관심이 있다면 아래는 내 동적 양식 기능을위한 코드입니다.

function post_to_url(path, params, method) { 
method = method || "post"; // Set method to post by default, if not specified. 


var form = document.createElement("form"); 
form.setAttribute("method", method); 
form.setAttribute("action", path);  //page to go redirect to when form submitted 


var hiddenField = document.createElement("input"); 
hiddenField.setAttribute("type", "hidden"); 

//after form is submitted params is available by params[:location] 
hiddenField.setAttribute("name", 'location');  
hiddenField.setAttribute("value", params) 

form.appendChild(hiddenField); 



document.body.appendChild(form); 



form.submit(); 
} 

답변

1

모든 양식 요청 및 ajax에서 CSRF 토큰이 전달되어야합니다. 이름이 authenticity_token 인 양식에 숨겨진 필드를 만들어야합니다. 그런 다음 메타 태그에서 값을 잡아해야합니다과 같이

<meta content="some_token_value" name="csrf-token" /> 

:

var token = ""; 
var tags = document.getElementsByTagName("meta"); 
for(var i = 0; i < tags.length; i++) { 
    if(tags[i].name == "csrf-param") { 
    token = tags[i].content; 
    } 
} 

그런 다음 단순히 숨겨진 태그의 값이 드롭, 당신은 위치 값했던 많은처럼. , 귀하의 요청에 다음

var csrf_token = '<%= form_authenticity_token %>'; 

을 포스트 데이터 'authenticity_token' : csrf_token을 추가

+0

감사합니다. 당신은 신사이고 학자입니다. 너는 그것을 고쳤다 !!!!!!!!!!! 우리는 지금 2 일 동안 이것으로 고투하고있다 그리고 그것은 작동한다! !!! : DDDD – user1759942

+0

네, 몇 달 전에 아약스로이 비트를 접해 주셔서 대단히 환영합니다. :) – agmcleod

0

당신은 당신의 자바 스크립트 파일에서 ERB 라인을 추가 할 수 있습니다.

관련 문제