Escudo de Link Externo – Confirmação de Saída e Validação de Confiança

:information_source: Resumo Este componente de tema adiciona proteção configurável para links externos em posts cozidos. Ele aplica regras baseadas no nível de confiança, redirecionamentos opcionais de login e informação, indicadores visuais para domínios confiáveis e um modal de confirmação de saída personalizável.
:eyeglasses: Prévia Theme Creator
:hammer_and_wrench: Repositório \u003chttps://github.com/VaperinaDEV/external-link-shield\u003e
:question: Guia de Instalação Como instalar um tema ou componente de tema
:open_book: Novo nos Temas do Discourse? Guia para iniciantes sobre como usar Temas do Discourse

\u003c!-- Preencha "repoName" e "repoURL" para o botão de instalação automática –\u003e

Instalar este componente de tema

Olá :waving_hand:

Gostaria de compartilhar um Componente de Tema que adiciona controle granular sobre links externos em posts cozidos, combinando:

  • controle de acesso baseado no nível de confiança
  • proteção para usuários anônimos
  • um modal de confirmação de saída personalizado
  • e indicadores visuais para domínios confiáveis versus desconhecidos

Este componente é projetado para comunidades onde links externos podem carregar implicações legais, de segurança ou de confiança.


:sparkles: Funcionalidades

:gear: Regras de nível de confiança configuráveis

Todos os comportamentos baseados em nível de confiança são totalmente configuráveis através das configurações do tema.

Você pode habilitar ou desabilitar independentemente:

  • bloqueio de usuários anônimos
  • substituição de informação para TL0
  • requisito de revelação manual para TL1
  • modal de confirmação de saída para níveis de confiança mais altos

Isso permite que o componente se adapte a políticas de comunidade muito diferentes, desde um blindamento de links rigoroso até um atrito mínimo para o usuário.

:locked_with_key: Links externos cientes do nível de confiança

Links externos se comportam de maneira diferente com base no nível de confiança do visualizador:

  • Usuários anônimos
    • Links externos são substituídos por um link de login ou uma URL personalizada definida nas configurações.
  • TL0
    • Links são substituídos por um redirecionamento configurável, por exemplo, um tópico explicando os níveis de confiança ou qualquer outra URL definida nas configurações.
  • TL1
    • Links exigem revelação manual (clicar para ver), então clicar no link mostra o modal de confirmação de saída.
  • TL2+
    • Links se comportam normalmente, mas sempre mostram um modal de confirmação de saída.

:door: Modal de confirmação de saída

Antes de sair do fórum, os usuários veem um modal que:

  • Afirma claramente que estão deixando a comunidade
  • Mostra a URL de destino completa em tags \u003ccode\u003e
  • Respeita a preferência external_links_in_new_tab do usuário

Isso é especialmente útil para:

  • comunidades com alta exigência de conformidade
  • mitigação de phishing
  • educar usuários menos experientes


:magnifying_glass_tilted_left: Comportamento baseado em domínio via configurações

O componente introduz duas configurações de tema:

internal_domains:
  type: list
  default: ""
  description: "Seus domínios do fórum e CDN (ex: exemplo.com|exemplo-cdn.com). Estes NÃO terão ícone NEM modal."

excluded_domains:
  type: list
  default: ""
  description: "Domínios externos confiáveis (ex: youtube.com|google.com). Estes mostrarão um ícone de CADEADO, mas pularão o modal/blindagem."
  • Domínios internos
    • Tratados como internos → sem ícone, sem modal
  • Domínios excluídos (confiáveis)
    • Mostram um ícone de cadeado :locked:
    • Ignoram o controle de nível de confiança e o modal
  • Todos os outros links externos
    • Mostram um ícone de link externo
    • São controlados e/ou confirmados dependendo do nível de confiança

:artist_palette: Indicadores visuais (SCSS)

Ícones são adicionados puramente via CSS:

  • Links externos desconhecidos → ícone external-link
  • Links externos confiáveis → ícone de cadeado (cor de sucesso)

Isso mantém o DOM limpo e evita a injeção de ícones baseada em JS.

Esta captura de tela mostra como o componente distingue visualmente entre:

  • Domínios excluídos: links externos confiáveis (ícone de cadeado, sem confirmação de saída),
  • Domínios internos: links internos (sem ícone, sem confirmação de saída),
  • links externos desconhecidos (ícone external-link com confirmação de saída).

:pushpin: Casos de uso

Este componente é útil se você deseja:

  • Proteger usuários de links externos inseguros ou enganosos
  • Educar novos usuários antes de permitir que saiam do fórum
  • Aplicar a progressão de confiança da comunidade
  • Adicionar avisos legais/de conformidade sem quebrar a UX
12 curtidas

Componente de Tema Fantástico!!!

Nós, na verdade, construímos algo semelhante onde também ocultamos os emblemas de contagem de cliques e os substituímos por emblemas de verificado/perigo.

Nós o usamos principalmente para nossos fornecedores e comerciantes verificados/confiáveis com quem temos uma parceria de afiliados.

Além disso, nosso pop-up também exibe códigos de cupom que são gerenciados através do editor de configurações de Objeto do componente de tema.

3 curtidas

Este é um ótimo componente de tema! Obrigado por compartilhar!!!

1 curtida

Mas visitantes não logados podem abrir um link externo diretamente (eles têm permissão para abrir links). Foi planejado assim e a informação/aviso é mostrada apenas para alguns Níveis de Confiança (TL)?

1 curtida

Clique com o botão direito para abrir em uma nova guia e ignorar a verificação de link externo.

Esta parte pode ser restrita?

Isso é ótimo, Don, obrigado por construir e compartilhar!

Me pergunto por que os links externos confiáveis usam um ícone de cadeado? Quer dizer, pode ser interpretado como “bloqueado” :sweat_smile: quando eles são permitidos.

Vou tentar esse componente; parece cobrir todos os nossos casos de uso para links externos. Também vou tentar mover os ícones para a direita, pois entendo que esse é o padrão comum.

Como sempre, estou apenas compartilhando meus pensamentos e fico feliz se o TC puder ser melhorado com eles.

2 curtidas

Olá :waving_hand:

Atualizei o componente de tema para a v2.0 :tada:: DEV: Replace CSS-drawn link icons with configurable d-icon rendering; fix anonymous blocking crashAdd files via upload - Pull Request #1 - VaperinaDEV/external-link-shield - GitHub

Esta atualização contém:

  • Substituição dos ícones mask-image em SVG mantidos manualmente por elementos <svg class="d-icon"> reais, renderizados via iconHTML() e inseridos ao lado dos links pelo secure-links.js

  • Adição de configurações:

    • exit_confirmation_continue_icon
    • external_link_icon,
    • trusted_link_icon,
    • external_link_icon_color,
    • trusted_link_icon_color,
    • link_icon_position (antes/depois)
  • Correção de um erro (crash) quando enable_anonymous_blocking está desativado: currentUser.trust_level era lido para usuários anônimos (null), o que causava uma exceção e deixava silenciosamente o <a> original sem processamento/proteção; agora, visitantes anônimos recebem uma passagem bem definida (ícone + modal de confirmação opcional, sem restrição por TL)


> ./support --coffee :heart:

2 curtidas

Sugestão para a v2.1: Usando o tipo de configuração de ícone

4 curtidas

Legal, obrigado, já mudei. :slightly_smiling_face:

3 curtidas

Como eu não sabia da existência desse componente? Muito obrigado por fazer a manutenção, irei testa-lo :heart_eyes:

2 curtidas

Com as últimas e rápidas melhorias, posso confirmar que este Componente de Tema lida com todos os casos de uso que tínhamos com links externos.

Parabéns ao incrível Don!

1 curtida

Ao visualizar um tópico na Modal de Pré-visualização de Tópico, clicar em uma imagem para ampliá-la (abrindo a lightbox) também aciona a modal de “confirmação de saída” do componente External Link Shield — mesmo que esses links de imagem não sejam links externos. São imagens enviadas localmente, servidas a partir do nosso próprio domínio/CDN, e não imagens hotlinkadas ou externas.

O domínio do CDN é diferente do domínio do seu fórum? Se sim, você também precisa adicionar o domínio do CDN à configuração internal_domains.

2 curtidas

Adicionei meu próprio domínio à configuração internal_domains e isso resolveu o problema.

2 curtidas