Rails 4에서 컨트롤러 또는 액션에 대한 X-Frame-Options를 재정의하는 방법


88

Rails 4 SAMEORIGINX-Frame-OptionsHTTP 응답 헤더 의 기본값을 설정하는 것으로 보입니다 . 이다 중대한 보안을 위해, 그러나 그것은에서 사용할 수 있도록 응용 프로그램의 일부를 허용하지 않는 iframe다른 도메인에.

X-Frame-Options다음 config.action_dispatch.default_headers설정을 사용하여 전역 적으로 의 값을 재정의 할 수 있습니다 .

config.action_dispatch.default_headers['X-Frame-Options'] = "ALLOW-FROM https://apps.facebook.com"

그러나 단일 컨트롤러 또는 작업에 대해 어떻게 재정의합니까?

답변:


137

헤더를 완전히 제거하려면 after_action필터를 만들 수 있습니다 .

class FilesController < ApplicationController
  after_action :allow_iframe, only: :embed

  def embed
  end

private

  def allow_iframe
    response.headers.except! 'X-Frame-Options'
  end
end

또는 물론을 코딩 after_action하여 값을 다른 값으로 설정할 수 있습니다 .

class FacebookController < ApplicationController
  after_action :allow_facebook_iframe

private

  def allow_facebook_iframe
    response.headers['X-Frame-Options'] = 'ALLOW-FROM https://apps.facebook.com'
  end
end

이것을 디버깅하는 동안 특정 브라우저 (Chrome for me)에서 캐시를 지워야합니다.


이것이 redirect_to에서 어떻게 작동하게할까요? (지금 Angular 앱으로 시도하고 있는데 작동하지 않습니다)
kittyminky

를 포함하는 작업 redirect_to과 리디렉션되는 작업 모두이 적용이 필요 하다고 가정합니다 . 특정 오류가 발생합니까? Stack Overflow에 대한 좋은 새로운 질문처럼 들립니다!
Chris Peters

나는 그것이 경로로 리디렉션되는 최종 컨트롤러 작업으로 리디렉션 after_action 되기 전에 내가 있다는 것을 깨달았습니다 Angular. 감사합니다!
kittyminky

에서이 작업 을 수행 할 필요 는 없지만 after_action, 예를 들어 Frontend::BaseController전체 프런트 엔드에 적용되는 경우 편리합니다 . response.headers.except! ...액션 내에서 실행할 수도 있습니다 .
codener

2
현재는 Chrome에서 작동하지 않습니다. 콘솔 오류는 " '하위'를로드 할 때 잘못된 'X-Frame-Options'헤더가 발견되었습니다. 'ALLOW-FROM parent'는 인식 된 지시문이 아닙니다. 헤더는 무시됩니다." Chromium에서 수정되지 않음으로 표시되었으며 대안 : " '프레임 조상'은 Chrome과 Firefox에서 모두 제공되며이 기능을 지원하는 올바른 방법입니다." bugs.chromium.org/p/chromium/issues/detail?id=129139
richardkmiller

7

Rails 앱이 I-Frame에 포함되어 문제가 발생하도록 허용하는 방법을 알아 내려고 할 때이 링크를 찾은 모든 사람을 위해 여기에 업데이트 된 답변을 포함하고 싶었습니다.

이 글을 쓰는 현재, 2020 년 5 월 28 일, X-Frame-Options 변경은 아마도 귀하의 문제에 대한 최선의 해결책이 아닐 것입니다. "ALLOW-FROM"옵션은 모든 주요 브라우저에서 완전히 허용되지 않았습니다.

현대적인 솔루션은 Content-Security-Policy를 구현하고 'frame_ancestors'정책을 설정하는 것입니다. 'frame_ancestors'키는 앱을 iframe으로 포함 할 수있는 도메인을 지정합니다. 현재 주요 브라우저에서 지원되며 X-Frame-Options를 재정의합니다. 이렇게하면 클릭 재킹 (X-Frame-Options가 원래 지원이 거의 중단되기 전에 도움을주기위한 목적 임)을 방지하고 최신 환경에서 앱을 잠글 수 있습니다.

이니셜 라이저 (아래 예제)에서 Rails 5.2로 Content-Security-Policy를 설정할 수 있으며, Rails <5.2의 경우 Secure Headers gem과 같은 gem을 사용할 수 있습니다 : https://github.com/github/secure_headers

원하는 경우 컨트롤러 / 작업 기준으로 정책 사양을 재정의 할 수도 있습니다.

Content-Security-Policies는 고급 보안 보호에 적합합니다. Rails 문서에서 구성 할 수있는 모든 것을 확인하세요 : https://edgeguides.rubyonrails.org/security.html

콘텐츠 보안 정책을위한 Rails 5.2 예제 :

# config/initializers/content_security_policy.rb    
    Rails.application.config.content_security_policy do |policy|
      policy.frame_ancestors :self, 'some_website_that_embeds_your_app.com'
    end

정책에 대한 컨트롤러 특정 변경의 예 :

# Override policy inline
class PostsController < ApplicationController
  content_security_policy do |p|
    p.frame_ancestors :self, 'some_other_website_that_can_embed_posts.com'
  end
end

동적 값에 람다를 사용할 수도 있습니다.p.frame_ancestors :self, -> { company&.allowed_domain || 'none' }
Sharagoz

나는 사용 frame_ancestors하고 있으며 모든 브라우저에서 작동하지만 Safari. 어떤 통찰력?
Matt

@Matt-Safari는 현재 타사 iframe이 쿠키를 저장하지 못하도록 차단한다고 생각합니다. 이것은 Safari에서 iframe을 사용하는 주요 제한 사항이며 문제의 원인 일 수 있습니다. 내가 아는 한 좋은 해결 방법은 없습니다. 자세한 내용은이 스택 오버플로를 확인하십시오. stackoverflow.com/questions/59723056/…
armont_development

0

Rails 5+의 경우 response.set_header('X-Frame-Options', 'ALLOW-FROM https://apps.facebook.com')대신 사용하십시오. 또는 작동 ALLOW-FROM하지 않고 빠른 수정이 필요한 경우 다음과 같이 설정할 수 있습니다.ALLOWALL

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.