A melhor maneira de lidar com a segurança e evitar o XSS com URLs inseridos pelo usuário

Temos um aplicativo de alta segurança e queremos permitir que os usuários insiram URLs que outros usuários verão.

Isso apresenta um alto risco de invasões XSS - um usuário pode potencialmente inserir javascript que outro usuário acaba executando. Como mantemos dados confidenciais, é essencial que isso nunca aconteça.

Quais são as melhores práticas para lidar com isso? Alguma lista de permissões ou padrão de escape por si só é boa o suficiente?

Qualquer conselho sobre como lidar com redirecionamentos (mensagem "este link sai do nosso site" em uma página de aviso antes de seguir o link, por exemplo)

Existe algum argumento para não oferecer suporte a links inseridos pelo usuário?

Esclarecimento:

Basicamente, nossos usuários desejam inserir:

stackoverflow.com

E envie-o para outro usuário:

<a href="http://stackoverflow.com">stackoverflow.com</a>

O que realmente me preocupa é que eles usem isso em um hack XSS. I.e. eles inserem:

alerta ('hackeado!');

Portanto, outros usuários obtêm este link:

<a href="alert('hacked!');">stackoverflow.com</a>

Meu exemplo é apenas para explicar o risco - estou ciente de que javascript e URLs são coisas diferentes, mas, ao permitir que eles insiram o último, eles podem executar o primeiro.

Você ficaria surpreso com quantos sites você pode quebrar com esse truque - o HTML é ainda pior. Se eles sabem lidar com links, eles também sabem higienizar<iframe>, <img> e referências CSS inteligentes?

Estou trabalhando em um ambiente de alta segurança - um único hack XSS pode resultar em perdas muito altas para nós. Estou feliz por poder produzir um Regex (ou usar uma das excelentes sugestões até agora) que poderia excluir tudo o que eu conseguia pensar, mas isso seria suficiente?

questionAnswers(9)

yourAnswerToTheQuestion