Как указать безопасные ссылки из поста

Я хочу связать файл с помощью file:///path/to/file из поста, но ссылка исчезает из-за проверок безопасности:

[my link](file:///path/to/file)

Как я могу разрешить эту ссылку в сообщении?

Этот случай использования не задокументирован:


1
58
2

Ответы:

Решение с использованием шорткодов

Чтобы решить проблему, я создал шорткод назвал file_link.html:

<a href = "file://{{ .Get 1 | safeURL }}">{{ .Get 0 }}</a>

Таким образом, я могу использовать в теле сообщения:

{{< file_link "this text is shown" "/path/to/file" >}}

Что было бы эквивалентно:

[this text is shown](file:///path/to/file )

Решено

Решение 1 — перезаписать рендеринг ссылки по умолчанию

Вы можете указать Goldmark (рендереру), как он должен отображать ссылки (см. документы), создав файл в layouts/_default/_markup/render-link.html. Этот код должен помочь, просто убедитесь, что он отображает все, что он должен отображать в вашем случае (см. упомянутые документы, какие переменные вы можете использовать в файле):

<!-- layouts/_default/_markup/render-link.html -->
<a href = "{{ .Destination | safeURL }}">{{ .Text }}</a>

Обратите внимание, что магия здесь вызвана функцией safeURL (документация). Если вы хотите использовать функцию safeURL только тогда, когда URL-адрес начинается с file://, вы можете сделать что-то вроде этого:

<!-- layouts/_default/_markup/render-link.html -->
{{ if hasPrefix .Destination "file://" }}
    <a href = "{{ .Destination | safeURL }}">{{ .Text }}</a>
{{ else }}
    <a href = "{{ .Destination }}">{{ .Text }}</a>
{{ end }}

Решение 2 — включить небезопасный рендеринг в конфиге (не рекомендуется)

Вы также можете включить рендеринг всех потенциально небезопасных ссылок (а также HTML) везде, обновив файл конфигурации (соответственно настройки рендерера Goldmark), как в примерах ниже. Найдите поле unsafe в эта часть документов Хьюго.

Вы не должны использовать это, если это не единственное приемлемое решение для вас. Он позволяет отображать URL-адреса, такие как javascript:unsafeFunction() или теги HTML, что может быть не тем, что вы хотите разрешить.

Синтаксис TOML (config.toml)

[markup]
    [markup.goldmark]
        [markup.goldmark.renderer]
            unsafe = true

Синтаксис YAML (config.yml)

markup:
  goldmark:
    renderer:
      unsafe: true