2016-08-20 2 views
2

InvalidAuthenticityToken 및 protect_from_forgery에 대한 StackOverflow에서 여러 질문과 대답을 읽었지만 더 현명하지 않습니다.Invalid Authenticity 모바일에서의 오류 메시지

매일 수백 개의 오류가 발생하는 웹 사이트가 있습니다. 그것들은 주로 모바일에서 온 것 같지만 샘플을 통해서만 확인했습니다. 내가 이해

은 왜 AuthenticityToken 응용 프로그램 컨트롤러에 protect_from_forgery을 application.html에

<%= csrf_meta_tags %> 

를 추가 (내가 가지고있는)뿐만 아니라 필요에 대한 필요성이있다. csrf_meta_tags와 :

protect_from_forgery with: :exception 

이 내 응용 프로그램 컨트롤러에 기본적으로 있습니다.

protect_from_forgery를 제거하여 문제를 "해결할 수"있지만 CSRF 공격에 취약해질 수 있으므로 실제로 해결책이 아닌 것 같습니다. 나는 폼 포스트에 대해 protect_from_forgery에 "except"를 추가 할 수는 있지만, 그것은 나를 취약한 것으로 남겨 둘 것입니다, 맞습니까?

편집 : 모바일에서 쿠키를 사용하지 않고 양식에 액세스하려고 시도했지만 422 오류가 발생했습니다. 예외를 일으킬 수 없습니다. 내 "결과"함수에 대한 예외를 추가하면 해당 함수가 제거되지만 취약성이 있습니다.

편집 2 : 동일한 페이지 (예 : 검색 양식)에 여러 양식이 있습니다. 아마도 이것은 문제에 영향을 미칠 수 있습니까?

하루에 수백 명의 사용자에게 오류가 발생하고 내 웹 사이트가 해킹에 취약해질 수 있으므로 두려워서 제거 할 수 없기 때문에 지금은 가질 수없는 위치에 있습니다.

그럼 어떻게해야합니까? 괜찮은 중간 지점이 있습니까?

protect_from_forgery를 변경할 수있는 방법이 있습니까? 그리고 해커가 내 데이터베이스를 파괴하지 않을 것이라고 확신 할 수 있습니까?

사이트 용 API를 사용하지 않고 있으며 모든 오류는 동일한 유형의 양식에서 비롯된 것입니다. 이 문제에 자바 스크립트 부분이 있지만 실제로 문제를 해결하기 위해 해당 정보를 어떻게 사용할 수 있는지는 알 수 없습니다.

미리 감사드립니다. 예외의

예 내가 얻을 :

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 

답변

2

이 문제는 here을 설명합니다. 문제가 발생한 경우 로그에 Can't verify CSRF token authenticity Completed 422 Unprocessable Entity이 표시되어야합니다. 두 솔루션은 널 세션 protect_from_forgery with: :null_session

  • 변경 캐시 제어를 config.action_dispatch.default_headers.merge!('Cache-Control' => 'no-store, no-cache')
  • 변화 유효하지 않은 세션을 설명하지만 여전히 열려있는 문제가 될 것으로 보인다.

+0

감사합니다. 나는이 기사의 도움을 받아 내 개발 버전에서 이슈를 만들 수있었습니다.또한 with : : null_session과 함께 protect_from_forgery를 사용하면 특정 컨트롤러에 예외를 추가하는 것처럼 문제를 "해결"하지만 여기에 내 큰 질문이 있습니다. 그렇게하는 것이 안전할까요? – Christoffer

+0

또한 "protect_from_forgery"를 지정하면 사이트가 충돌하지 않게됩니다. 그래서, 나는이 솔루션의 가장 좋은 옵션이 무엇인지에 관한 문제 일 뿐이라고 생각합니다. – Christoffer

+0

'with : : null_session'은 Rails 5와 4.2의 기본값이다. 이전 버전에 대해서는 잘 모릅니다. 나는 그것이 구원받는다고 간언했다. csrf 토큰과 관련된 문제의 경우 빈 세션 해시를 제공합니다. 'Cache-Control'을 변경하면 성능에 영향을 미칠 수 있습니다. – slowjack2k