Falando em codificação de URL, você pode pensar na vulnerabilidade de codificação de URL há N anos. É uma pena ter nascido na época errada. Quando entrei em contato com a Internet, a lacuna já havia desaparecido.
Mais perto de casa, o que é codificação de URL? Dê uma olhada na definição que copiei da Internet:
Citação: codificação de URL é um formato usado pelos navegadores para empacotar a entrada do formulário. O navegador obtém todos os nomes e valores do formulário e os envia ao servidor como parte da URL ou separadamente, usando codificação de parâmetro nome/valor (removendo caracteres intransmissíveis, classificando os dados, etc.). Em ambos os casos, o formato de entrada do formulário no lado do servidor é semelhante a este:
theName=Ichabod+Crane&gender=male&status=missing&headless=yes
A codificação de URL segue as seguintes regras: Cada par nome/valor é separado por um "e" comercial; vem do formulário separado por = caracteres. Se o usuário não inserir um valor para o nome, o nome ainda aparecerá, mas sem valor. Quaisquer caracteres especiais (ou seja, aqueles que não sejam ASCII simples de sete bits, como caracteres chineses) serão codificados em hexadecimal com o sinal de porcentagem %, incluindo, é claro, caracteres especiais como =, & e %.
Haha, você entende, na verdade, a codificação da URL é o código hexadecimal ASCII de um caractere. No entanto, há uma pequena alteração. Você precisa adicionar "%" na frente. Por exemplo, "", seu código ASCII é 92 e o valor hexadecimal de 92 é 5c, portanto a codificação de URL de "" é . E quanto à codificação de URL dos caracteres chineses? É muito simples, veja o exemplo: o código ascii de "Hu" é -17670, o hexadecimal é BAFA e a codificação da url é "%BA%FA". Haha, você sabe como convertê-lo.
Normalmente não usamos codificação de URL, porque o IE converterá automaticamente as letras não numéricas inseridas na barra de endereço em codificação de URL. Portanto, para o navegador http://blog.csdn.net/l%61ke2 é equivalente a http://blog.csdn.net/lake2 (observe que substituí a por %61 no primeiro URL). Haha, talvez você tenha se lembrado que alguém sugeriu adicionar "#" no nome do banco de dados para evitar que ele fosse baixado, pois o IE irá ignorar as seguintes letras ao encontrar #. O método de cracking é muito simples - substitua # pela codificação de URL #. Originalmente, tentei usar a codificação de URL para evitar verificações de injeção, mas falhou porque o servidor converteria a codificação de URL em caracteres.
Espere, parece que estou fora do assunto, haha, desculpe :)
A injeção de SQL é muito popular agora, então algumas pessoas escreveram alguns scripts anti-injeção. Claro, as ideias são diferentes e os resultados são muito diferentes. Caros leitores, por favor, dê uma olhada em parte do código da versão asp anti-injeção universal ××SQL abaixo.
Fy_Url=Request.ServerVariables("QUERY_STRING")
Fy_a=split(Fy_Url,"&")
redimensionar Fy_Cs(ubound(Fy_a))
Em caso de erro, retomar o próximo
para Fy_x = 0 para ubound (Fy_a)
Fy_Cs(Fy_x) = esquerda(Fy_a(Fy_x),instr(Fy_a(Fy_x),"=")-1)
Próximo
Para Fy_x=0 para ubound(Fy_Cs)
Se Fy_Cs(Fy_x)<>"" Então
Se Instr(LCase(Request(Fy_Cs(Fy_x))),"and")<>0 então
Response.Write "Ocorreu um erro!"
Resposta.Fim
Terminar se
Terminar se
Próximo
A ideia é primeiro obter os dados enviados, usar "&" como demarcação para obter e processar o grupo nome/valor e, em seguida, determinar se o valor contém as palavras-chave definidas (para simplificar aqui, deixo apenas "e"). Se sim, é uma injeção.
À primeira vista, o valor está verificado e parece não haver problema. Haha, sim, não há problema com valor, mas e o nome?
Seu valor de grupo nome/valor vem de Request.ServerVariables("QUERY_STRING"), haha, desculpe, algo deu errado aqui. Request.ServerVariables("QUERY_STRING") é para obter a string enviada pelo cliente. A codificação do URL não será convertida automaticamente aqui, se codificarmos o nome em URL e depois enviá-lo, haha, então a verificação pode ser ignorada. Por exemplo, se o parâmetro for ph4nt0m=lake2 e lis0, o programa poderá detectá-lo neste momento; se você enviar %50h4nt0m=lake2 e lis0 (codificação de URL p), o programa avaliará o valor de %50h4nt0m e %50h4nt0m. será convertido para ph4nt0m , portanto o valor de %50h4nt0m está vazio, ignorando assim a detecção.
Espere, por que a verificação pode ser ignorada se o nome não está decodificado, mas o valor não pode ser ignorado? Como o valor de value é obtido de Request(Fy_Cs(Fy_x)), o servidor irá decodificá-lo.
Como o programa pode ser melhorado? Contanto que você possa obter os dados decodificados enviados pelo cliente, basta alterar a instrução para obter o nome para For Each SubmitName In Request.QueryString.
Haha, obrigado pela sua paciência em ler meu artigo ^_^
lake2