Melhor maneira de ler com segurança os parâmetros da string de consulta?
-
02-07-2019 - |
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.
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 só 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.)