# Markdown 콘텐츠에서 URI 처리 관련 Discourse 버그

**URL:** https://meta.discourse.org/t/bug-s-in-discourse-handing-of-uris-in-markdown-content/187125
**Category:** Bug
**Created:** [4월 16, 2021, 4:36오후 UTC](https://meta.discourse.org/t/bug-s-in-discourse-handing-of-uris-in-markdown-content/187125 "2021-04-16T16:36:33Z")
**Posts on this page:** 7
**Page:** 1

<div class="post-metadata">

### Author: ![TallTed](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/tallted/32/125029_2.png) [@TallTed](https://meta.discourse.org/u/TallTed)
#### Post date: [4월 16, 2021, 4:36오후 UTC](https://meta.discourse.org/t/bug-s-in-discourse-handing-of-uris-in-markdown-content/187125/1 "2021-04-16T16:36:33Z")

</div>

`urn:records:test:3`은 [RFC 3986 URI](https://tools.ietf.org/html/rfc3986)로 유효합니다.

Discourse는 어떤 마크다운을 사용하더라도 이를 제대로 처리하지 않습니다.

- HTTP URI처럼 단순히 붙여넣으면, Discourse는 이것이 URI라는 사실을 완전히 무시합니다. 예: urn:records:test:3.

- `<>`로 감싸서 `<urn:records:test:3>`처럼 작성하면, Discourse는 마지막 두 세그먼트를 뒤집습니다. 예: urn:records:3:test. 우클릭하여 복사하면 마우스 커서의 정확한 위치에 따라 `urn:records` 또는 `test:3` 중 하나가 복사됩니다. 좌클릭을 해도 아무 일도 일어나지 않으며, 이는 URI로 완전히 취급되지 않기 때문입니다.

- 완전한 링크 마크업, 즉 `[text over `urn:records:test:3`](urn:records:test:3)` 형태로 작성하면, Discourse는 우클릭으로 복사 가능한 – 그리고 여전히 좌클릭으로 활성화되지 않는 – URI에서 마지막 세그먼트를 제거합니다. 이는 여기서 라이브로 확인할 수 있습니다: text over `urn:records:test:3`. 여기서 우클릭하여 복사하면 `urn:records:test`가 복사됩니다. 또는 `[`urn:records:test:3`](urn:records:test:3)`와 같이 작성하면, 여기서 라이브로 확인할 수 있습니다: `urn:records:test:3`. 여기서 우클릭하여 복사하면 마우스 커서의 정확한 위치에 따라 `urn:records:test` 또는 `3`이 복사됩니다.

모든 유효한 URI 구성 요소를 포괄적으로 테스트한 것은 아닙니다. `urn:records:test:3`은 우연히도 실제 환경에서 볼 수 있는 로컬 예시일 뿐입니다.

---

<div class="post-metadata">

### Author: ![Falco](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/falco/32/179432_2.png) [@Falco](https://meta.discourse.org/u/Falco)
#### Post date: [4월 16, 2021, 4:46오후 UTC](https://meta.discourse.org/t/bug-s-in-discourse-handing-of-uris-in-markdown-content/187125/2 "2021-04-16T16:46:45Z")

</div>

실제로, `allowed_href_schemes` 사이트 설정은 `scheme://` 형식을 사용하는 스킴에서만 작동합니다.

[https://github.com/discourse/discourse/blob/master/app/assets/javascripts/pretty-text/addon/sanitizer.js#L59](https://github.com/discourse/discourse/blob/master/app/assets/javascripts/pretty-text/addon/sanitizer.js#L59)

---

<div class="post-metadata">

### Author: ![TallTed](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/tallted/32/125029_2.png) [@TallTed](https://meta.discourse.org/u/TallTed)
#### Post date: [4월 16, 2021, 5:06오후 UTC](https://meta.discourse.org/t/bug-s-in-discourse-handing-of-uris-in-markdown-content/187125/3 "2021-04-16T17:06:32Z")

</div>

> [@Falco](#):
>
> 실제로, 저희 `allowed_href_schemes` 사이트 설정은 `scheme://` 형식을 사용하는 스킴에서만 작동합니다.

이것이 버그를 인정하는 것인지, 아니면 "예, 그것이 의도된 동작입니다"라고 말하는 것인지 알 수가 없습니다…

설명해 주시겠어요?

---

<div class="post-metadata">

### Author: ![Falco](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/falco/32/179432_2.png) [@Falco](https://meta.discourse.org/u/Falco)
#### Post date: [4월 16, 2021, 5:09오후 UTC](https://meta.discourse.org/t/bug-s-in-discourse-handing-of-uris-in-markdown-content/187125/4 "2021-04-16T17:09:34Z")

</div>

실제로 버그입니다. `scheme://` 형식으로 시작하는 href 스킴만 인식하도록 작성된 우리의 세리나이저 코드 때문이죠.

---

<div class="post-metadata">

### Author: ![maiki](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/maiki/32/233950_2.png) [@maiki](https://meta.discourse.org/u/maiki)
#### Post date: [8월 14, 2021, 8:44오후 UTC](https://meta.discourse.org/t/bug-s-in-discourse-handing-of-uris-in-markdown-content/187125/5 "2021-08-14T20:44:56Z")

</div>

최근 `geo:36.95733984,-122.0172856`과 같은 형태의 geo URI에서 이 버그를 마주하게 되었습니다.

tel URI에 대한 예외 처리가 있다는 것을 확인했습니다:

```javascript
    if (allowedHrefSchemes.includes("tel")) {
      extraHrefMatchers.push(new RegExp("^tel://\\+?[\\w\\.\\-]+", "i"));

```

[Uniform Resource Identifier (URI) Schemes](https://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml) 가 있지만, 예시가 포함되어 있어 [List of URI schemes - Wikipedia](https://en.wikipedia.org/wiki/List_of_URI_schemes) 를 참고하여 스킴을 확인했습니다. 저는 그, 음, 스킴 이름의 “접미어” 부분, 즉 `://` (이걸 뭐라고 부르는 걸까요? “스킴 형식”?)을 보고 있습니다.

_주의 깊게_ 눈으로 확인해 본 결과, 사용된 패턴은 단 세 가지인 것 같습니다:

- `://`
- `:/`
- `:`

마크다운을 작성하고 `href`로 변환하는 과정에서 이것이 어디에서 일어나는지를 파악하는 데 제 머리가 좀 버거워지지만, 이 세 가지 형식을 확인하는 방법을 알아낸다면 관리자によって 추가된 어떤 스킴이든 문제없이 처리할 수 있을 것이라고 생각합니다.

스킴별로 어떻게 검증해야 할지 전혀 감이 오지 않습니다… 🤔

* * *

저의 비공식적인 형식 코드 이름들:

- `:` “관찰(observing)”
- `:/` “의심(skeptical)”
- `://` - “더 강한 의심(double skeptical)”

---

<div class="post-metadata">

### Author: ![maiki](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/maiki/32/233950_2.png) [@maiki](https://meta.discourse.org/u/maiki)
#### Post date: [8월 29, 2021, 9:13오후 UTC](https://meta.discourse.org/t/bug-s-in-discourse-handing-of-uris-in-markdown-content/187125/6 "2021-08-29T21:13:51Z")

</div>

다음 내용을 Discourse에 복사하여 붙여넣으면:

> 안전한 메시징과 통화를 위해 Snikket/XMPP(xmpp:maiki@chat.v2.talkgroup.xyz)로 연락해 주세요.

`allowed href schemes`에 `xmpp`를 추가한 경우 다음과 같이 표시됩니다:

```plaintext
For secure messaging and calls connect with me over Snikket/XMPP at <a href="mailto:xmpp:maiki@chat.v2.talkgroup.xyz" dir="ltr">xmpp:maiki@chat.v2.talkgroup.xyz</a>.

```

이 경우 문제는 `href="mailto:xmpp:maiki@chat.v2.talkgroup.xyz"` 부분입니다. 이 버그의 사용 사례로 기록합니다. 🙂

---

<div class="post-metadata">

### Author: ![boospy](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/boospy/32/282567_2.png) [@boospy](https://meta.discourse.org/u/boospy)
#### Post date: [12월 15, 2022, 7:59오후 UTC](https://meta.discourse.org/t/bug-s-in-discourse-handing-of-uris-in-markdown-content/187125/7 "2022-12-15T19:59:47Z")

</div>

이것이 GEO URI에 대한某种의 우회책일 수 있나요? 개발자가 아닙니다.
