Pergunta

Temos um projeto que gera um trecho de código que pode ser usado em vários outros projetos. O objetivo do código é ler dois parâmetros da sequência de consultas e atribuí -los ao atributo "SRC" de um iframe.

Por exemplo, a página no URL http: //oursite/page.aspx? A = 1 & b = 2 Teria JavaScript para ler os parâmetros "A" e "B". O JavaScript definiria o atributo "SRC" de um iframe com base nesses parâmetros. Por exemplo, "u003Ciframe src="http://someothersite/Page.aspx?a=1&b=2" /> "

No momento, estamos fazendo isso com o código do lado do servidor que usa a biblioteca anti-scripts da Microsoft para verificar os parâmetros. No entanto, chegou um novo requisito afirmando que precisamos usar o JavaScript e que ele não pode usar nenhuma ferramenta JavaScript de terceiros (como jQuery ou protótipo).

Uma maneira que eu conheço é substituir quaisquer instâncias de "<", citação única e citação dupla dos parâmetros antes de usá -los, mas isso não parece seguro o suficiente para mim.

Um dos parâmetros é sempre um "p", seguido por 9 números inteiros. O outro parâmetro são sempre 15 caracteres alfa-numéricos. (Obrigado Liam por sugerir que eu deixei isso claro).

Alguém tem alguma sugestão para nós?

Muito obrigado pelo seu tempo.

Foi útil?

Solução

Não use Escape e Undecape, use decodeuricomponent. Por exemplo

function queryParameters(query) {
  var keyValuePairs = query.split(/[&?]/g);
  var params = {};
  for (var i = 0, n = keyValuePairs.length; i < n; ++i) {
    var m = keyValuePairs[i].match(/^([^=]+)(?:=([\s\S]*))?/);
    if (m) {
      var key = decodeURIComponent(m[1]);
      (params[key] || (params[key] = [])).push(decodeURIComponent(m[2]));
    }
  }
  return params;
}

e passe em document.location.search.

Quanto a transformar <em <, isso não é suficiente para garantir que o conteúdo possa ser injetado com segurança em HTML sem permitir a execução do script. Certifique -se de escapar do seguinte <,>, & e ".

Não garantirá que os parâmetros não tenham sido falsificados. Se você precisar verificar se um de seus servidores gerou o URL, faça uma pesquisa na assinatura de URL.

Outras dicas

Usar uma abordagem da lista de permissões seria melhor, eu acho. Evite apenas tirar coisas "ruins". Retire qualquer coisa, exceto o que você acha que é "seguro".

Além disso, eu incentivaria fortemente a fazer um HTMLencode os parâmetros. Deve haver muitas funções JavaScript que podem isso.

Você pode usar as funções de escape () e unescape () do JavaScript.

Várias coisas que você deveria estar fazendo:

  • Strictly Whitelist seus valores aceitos, de acordo com tipo, formato, alcance, etc.
  • Explicitamente na lista negra certos personagens (mesmo que isso geralmente seja desviado), se sua lista de permissões não puder ser extremamente apertada.
  • Codifique os valores antes da saída, se você está usando anti-xss, você já sabe que um simples htmlencode não é suficiente
  • Defina a propriedade SRC através do DOM - e não Ao gerar fragmento HTML
  • Use o valor dinâmico como um parâmetro de tentativa de consulta, e não para sites arbitrários; ou seja, code o nome do servidor, a página de destino, etc.
  • O seu site está no SSL? Nesse caso, o uso de um quadro pode causar inconsistências com a UI SSL ...
  • Usando quadros nomeados em geral, pode permitir a falsificação de quadros; Se em um site seguro, este pode ser um vetor de ataque relevante (para uso com phishing etc.)

Você pode usar expressões regulares para validar que possui um P seguido por 9 números inteiros e que possui 15 valores alfanuméricos. Eu acho que o livro que tenho na minha mesa de Regex tem alguns exemplos em JavaScript para ajudá -lo.

Limitar o charset apenas a valores ASCII ajudará e seguirá todos os conselhos acima (Whitelist, definir SRC através do DOM, etc.)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top