3.0.4(안정판)에서 임베딩이 깨졌습니다

이 변경 사항으로 인해 문제가 발생했을 것 같습니다.

이 패치가 제 웹사이트에서 임베딩(embedding)을 사용하는 방식을 깨뜨린 것 같습니다. 정확히 어떤 부분이 변경되었는지 알려주시는 분 계신가요?

저는 블로그 게시물에 대한 주제를 생성하기 위해 Discourse를 사용하고 있습니다(댓글 시스템으로 활용). 제 웹사이트는 두 가지 언어로 나뉘어 있어, 두 개의 호스트를 사용하여 영어(/blog/somepost)와 독일어(/de/blog/somepost) 게시물을 서로 다른 포럼 카테고리로 필터링하고 있습니다.

Discourse가 업데이트된 이후로 웹사이트 독일어 쪽의 게시물들이 더 이상 임베딩되지 않습니다. 위 패치와 관련이 있을 것으로 추정됩니다.

이 문제를 해결하는 데 도움이 주신다면 감사하겠습니다.

2개의 좋아요

반면에, 이 문제가 무엇인지에 따라 달라질 수 있습니다:

확실히 저에게도 해당 DOMExceptions가 표시됩니다. 다시 한번, 도움이 되면 정말 감사하겠습니다!

1개의 좋아요

네, 포럼과 임베드 웹사이트의 보안 정책 및 설정을 확인해 보겠습니다. 스크린샷은 괜찮아 보입니다. 어떤 스크립트를 사용 중이신가요? 그리고 다른 임베드 설정은 어떻게 되어 있나요? 최근에 해당 부분에 변경 사항이 있었나요?

제 포럼에서는 이 임베드 게시 기능을 하루에 여러 번 사용하는데, 현재까지는 잘 작동하고 있어서 기능 자체에 문제가 있는 것은 아니라고 생각합니다. 우리는 최신 베타 버전을 사용 중이며 호스팅 서비스를 이용하고 있으므로 설정에는 문제가 없다고 확신합니다.

1개의 좋아요

안녕하세요, 도움을 주시려고 해주셔서 감사합니다!

두 사이트 모두 호스팅 제공업체에 의해 호스팅되고 있어 보안 정책에 대한 통제는 하지 못하고 있습니다. 아마도 그들이 이 문제를 일으켰을 것 같지는 않습니다. 하지만 제 Discourse 호스팅 업체와 조사해 보겠습니다.

블로그에서 이 스크립트를 사용 중입니다(이름이 Hugo인 정적 사이트 엔진):

<script type="text/javascript">
  DiscourseEmbed = { discourseUrl: 'https://forum.fab.industries/',
                     discourseEmbedUrl: '{{ .Permalink }}' };

  (function() {
    var d = document.createElement('script'); d.type = 'text/javascript'; d.async = true;
    d.src = DiscourseEmbed.discourseUrl + 'javascripts/embed.js';
    (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(d);
  })();
</script>

몇 달 전에 처음 통합한 이후로 이 부분을 변경한 적이 없습니다.

제가 실제로 변경한 것은 포럼 테마에 추가한 사소한 사용자 정의 CSS뿐입니다. 오늘 그 부분을 되돌려 보고 문제가 해결되는지 확인해 보겠습니다.

좋습니다. CSS를 되돌려 봤지만 아무런 효과가 없었습니다. 애초에 가능성이 낮은 시도였지만요.

이제 임베딩 기능이 전반적으로 깨져 있다는 것도 확인했습니다. 블로그의 영문 버전도 작동이 중단되었습니다. 새 페이지들은 “토론을 불러오는 중…” 화면에서 멈춰 있습니다.

제提供商이 포럼을 3.0.4로 업데이트했을 때 문제가 발생했다고 확신하고 있습니다. 다만 어떤 버전에서 업데이트되었는지는 알지 못합니다. 그래서 여전히 이 패치가 원인이 아닐까 의심하고 있습니다:

브라우저가 이러한 DOM 관련 오류를 던지는 것이 우연이 아니라고 생각합니다:

관리자 설정에서 CSP를 끄는 것으로는 해결되지 않는 것 같습니다.

main 브랜치에는 이 코드가 있고

TopicEmbed.import_remote(@embed_url, user: User.find_by(username_lower: username.downcase))

stable 브랜치에는 이 코드가 있습니다.

TopicEmbed.import_remote(user, @embed_url)

파라미터의 순서에 주목하세요.

보안 패치의 백포트가 stable에서 함수 시그니처를 변경하여 새로운 파라미터 순서로 바꿨기 때문에

def self.import_remote(import_user, url, opts = nil)

이

def self.import_remote(url, opts = nil)

으로 변경되었고, 이제 url 파라미터가 User 객체를 받게 됩니다.

함수 호출을 변경하면 문제가 해결됩니다.

diff --git a/lib/topic_retriever.rb b/lib/topic_retriever.rb
index b798df6cd7..6186ce5868 100644
--- a/lib/topic_retriever.rb
+++ b/lib/topic_retriever.rb
@@ -50,6 +50,6 @@ class TopicRetriever
     user = User.where(username_lower: username.downcase).first
     return if user.blank?
 
-    TopicEmbed.import_remote(user, @embed_url)
+    TopicEmbed.import_remote(@embed_url, user: user)
   end
 end

@blake

8개의 좋아요

이 문제를 수정하는 PR을 제출했습니다: FIX broken topic embedding because of incomplete security patch (#22088) - Pull Request #22184 - discourse/discourse - GitHub

9개의 좋아요

수정해 주셔서 감사합니다, @RGJ. 해당 PR은 이제 병합되었습니다.

4개의 좋아요