API 액션에 대한 Rails 4의 protect_from_forgy 건너뛰기
API를 사용하여 Rails 4 어플리케이션을 구현하고 있습니다.나는 휴대폰에서 API를 호출할 수 있고 웹앱 자체에서 API를 호출할 수 있기를 원합니다.이 노트를 조사하다가 우연히 발견했어요.protect_from_forgery
:
XML 또는 JSON 요청도 영향을 받고 API를 구축하려면 다음과 같은 것이 필요합니다.
class ApplicationController < ActionController::Base
protect_from_forgery
skip_before_action :verify_authenticity_token, if: :json_request?
protected
def json_request?
request.format.json?
end
end
이 작업을 수행하려고 했는데 몇 가지 의문점/질문이 있습니다.
- 이 솔루션은 CSRF 홀을 열어두고 있는 것처럼 보입니다.왜냐하면 공격자가 이 문제를 해결하기 위해
onclick
javascript는 JSON을 게시합니까? - API 토큰을 확인하는 것이 합리적인 대체 방법일까요? 즉, 인증성 검사를 건너뛰는 대신 검사에 실패하고 복구될 수 있습니다.
handle_unverified_request
api 토큰이 존재하며 현재 사용자에 대해 올바른지 여부 - 아니면 웹 앱과 모바일 디바이스가 HTTP 헤더로 CSRF 토큰을 전송하도록 해야 할까요?그거 안전한 거야?처음에 HTML 폼을 렌더링하지 않은 휴대폰은 CSRF 토큰을 어떻게 얻을 수 있을까요?
설명을 위해 편집:
웹 앱 사용자가 조작된 CSRF 링크를 클릭하는 것이 더 걱정됩니다.모바일 사용자는 인증, 승인, API 키 보유가 가능하기 때문에 저는 신경 쓰지 않습니다.그러나 웹 앱 사용자에 대한 CSRF 보호를 활성화하면 모바일 사용자가 보호된 API를 사용할 수 없게 됩니다.올바른 대응 전략을 알고 싶은데, Rails 문서에서는 올바른 답변을 얻을 수 없다고 생각합니다.
공격자는 컨트롤러에서 원하는 대로 CURL을 수행할 수 있지만 API에 인증이 필요한 경우 아무 것도 얻을 수 없습니다.
API 사용자가 CSRF를 전송하도록 하는 것은 CSRF가 실제로 수행하는 일이 아닙니다.그러기 위해서는 클라이언트가 인증 엔드포인트에 먼저 접근하여 코드를 취득한 후 POST에 송신하는 일종의 노킹 메커니즘을 실장해야 합니다.이것은 모바일 클라이언트에 있어서는 대역폭, 전력, 지연을 사용하기 때문에 매우 어렵습니다.
어쨌든 허가된 클라이언트가 컨트롤러를 공격하면 실제로는 위조(즉 CSRF의 F)입니까?
CSRF 토큰을 HTTP 헤더로 송신하는 것은 일반적인 방법입니다.이것에 의해, 클라이언트가 유효한 토큰을 취득하고 있는 것이 보증됩니다.예를 들어 교묘하게 조작된 CSRF 링크는 credential cookie와 함께 전송되지만 헤더에는 CSRF 토큰이 포함되지 않습니다.클라이언트의 javascript는 도메인 쿠키에 액세스할 수 있으며 모든 XHR 요청에서 토큰을 쿠키에서 헤더로 복사할 수 있습니다.
여기서 설명한 바와 같이 AngularJS는 이 접근방식을 따릅니다.
처음 두 가지 질문에 대해서:
- 이 솔루션은 CSRF의 구멍을 열어두고 있는 것 같습니다.
그렇기 때문에 API에서도 CSRF 토큰을 디세블로 하면 안 됩니다.
- API 토큰을 확인하는 것이 합리적인 대체 방법일까요?
아마 아닐 것입니다.(OWASP에서) 다음 사항을 고려하십시오.
GET 요구의 CSRF 토큰은 브라우저 이력, HTTP 로그 파일, HTTP 요청의 첫 번째 행을 기록하는 네트워크 어플라이언스 및 보호된 사이트가 외부 사이트에 링크되어 있는 경우 Referer 헤더 등 여러 위치에서 누출될 수 있습니다.
일반적인 권장 사항:바퀴를 발명하려고 하지 마세요.OWASP에는 REST Security Cheet라는 페이지와 이전에 링크했던 페이지가 있습니다.Angular 어프로치(각 XHR 요구의 cookie에서 헤더로 토큰 복사)를 실행할 수 있습니다.일반적인 비 ajax 형식의 경우 스태틱서버 폼의 CSRF 보호와 마찬가지로 POST 및 숨김 필드만 사용하십시오.
언급URL : https://stackoverflow.com/questions/23773730/rails-4-skipping-protect-from-forgery-for-api-actions
'programing' 카테고리의 다른 글
reactjs 앱에 부트스트랩 css 및 js를 포함하려면 어떻게 해야 합니까? (0) | 2023.03.16 |
---|---|
TypeScript 캐스트 연산자 "as"의 ESlint 구문 분석 오류 "예상하지 않은 토큰" (0) | 2023.03.16 |
jQuery에서 이 JSON 개체를 반복하려면 어떻게 해야 합니까? (0) | 2023.03.16 |
템플릿이 렌더링되지 않습니다. (0) | 2023.03.16 |
여러 패턴에 대한 스프링 부트에서의 여러 Web Security Configurer Adapter (0) | 2023.03.16 |