Hablando de codificación de URL, puede pensar en la vulnerabilidad de codificación de URL de hace N años. Es una pena que nací en el momento equivocado. Cuando entré en contacto con Internet, la laguna hacía tiempo que había desaparecido.
Más cerca de casa, ¿qué es la codificación de URL? Eche un vistazo a la definición que copié de Internet:
Cita: La codificación de URL es un formato utilizado por los navegadores para empaquetar la entrada de formulario. El navegador obtiene todos los nombres y valores del formulario y los envía al servidor como parte de la URL o por separado, utilizando la codificación del parámetro nombre/valor (eliminando caracteres no transmisibles, ordenando los datos, etc.). En cualquier caso, el formato de entrada del formulario en el lado del servidor se ve así:
theName=Ichabod+Crane&gender=male&status=missing&headless=yes
La codificación de URL sigue las siguientes reglas: Cada par de nombre/valor está separado por un signo comercial; proviene del formulario separado por caracteres =. Si el usuario no ingresa un valor para el nombre, el nombre seguirá apareciendo, pero sin valor. Todos los caracteres especiales (es decir, aquellos que no son ASCII simples de siete bits, como los caracteres chinos) se codificarán en hexadecimal con el signo de porcentaje %, incluidos, por supuesto, los caracteres especiales como =, & y %.
Jaja, entiendes, de hecho, la codificación de la URL es el código ASCII hexadecimal de un carácter. Sin embargo, hay un ligero cambio. Es necesario agregar "%" al frente. Por ejemplo, "", su código ASCII es 92 y el valor hexadecimal de 92 es 5c, por lo que la codificación URL de "" es . Entonces, ¿qué pasa con la codificación URL de caracteres chinos? Es muy simple, mire el ejemplo: el código ascii de "Hu" es -17670, el hexadecimal es BAFA y la codificación de la URL es "%BA%FA". Jaja, sabes cómo convertirlo.
Por lo general, no utilizamos codificación URL, porque IE convertirá automáticamente las letras no numéricas que ingrese en la barra de direcciones en codificación URL. Entonces, para el navegador, http://blog.csdn.net/l%61ke2 es equivalente a http://blog.csdn.net/lake2 (tenga en cuenta que reemplacé a con %61 en la primera URL). Jaja, tal vez hayas recordado que alguien sugirió agregar "#" en el nombre de la base de datos para evitar que se descargue, porque IE ignorará las siguientes letras cuando encuentre #. El método de descifrado es muy simple: reemplace # con la codificación de URL #. Originalmente intenté usar la codificación de URL para evitar comprobaciones de inyección, pero falló porque el servidor convertía la codificación de URL en caracteres.
Espera, parece que me he salido del tema, jaja, lo siento :)
La inyección SQL es muy popular ahora, por lo que algunas personas han escrito algunos scripts anti-inyección. Por supuesto, las ideas son diferentes y los resultados son muy diferentes. Estimados lectores, eche un vistazo a parte del código de la versión asp anti-inyección universal ××SQL a continuación.
Fy_Url=Request.ServerVariables("QUERY_STRING")
Fy_a=dividir(Fy_Url,"&")
redimir Fy_Cs(ubound(Fy_a))
En caso de error Continuar siguiente
para Fy_x=0 a ubound(Fy_a)
Fy_Cs(Fy_x) = izquierda(Fy_a(Fy_x),instr(Fy_a(Fy_x),"=")-1)
Próximo
Para Fy_x=0 a ubound(Fy_Cs)
Si Fy_Cs(Fy_x)<>"" Entonces
Si Instr(LCase(Request(Fy_Cs(Fy_x))),"y")<>0 entonces
Respuesta.Escribir "¡Ocurrió un error!"
Respuesta.Fin
Terminar si
Terminar si
Próximo
La idea es obtener primero los datos enviados, usar "&" como demarcación para obtener y procesar el grupo de nombre/valor, y luego determinar si el valor contiene las palabras clave definidas (para simplificar aquí, solo dejo "y"). Si es así, es una inyección.
A primera vista se comprueba el valor y no parece haber ningún problema. Jaja, sí, no hay problema con el valor, pero ¿qué pasa con el nombre?
Su valor de grupo de nombre/valor proviene de Request.ServerVariables("QUERY_STRING"), jaja, lo siento, algo salió mal aquí. Request.ServerVariables ("QUERY_STRING") es para obtener la cadena enviada por el cliente. La codificación de URL no se convertirá automáticamente aquí Jaja, si codificamos la URL y luego lo enviamos, jaja, entonces se puede omitir la verificación. Por ejemplo, si el parámetro es ph4nt0m=lake2 y lis0, el programa puede detectarlo en este momento; si envía %50h4nt0m=lake2 y lis0 (codificación de URL p), el programa juzgará el valor de %50h4nt0m y %50h4nt0m. se convertirá a ph4nt0m, por lo que el valor de %50h4nt0m está vacío, evitando así la detección.
Espere, ¿por qué se puede omitir la verificación si el nombre no está decodificado pero no se puede omitir el valor? Debido a que el valor del valor se toma de Solicitud (Fy_Cs (Fy_x)), el servidor lo decodificará.
¿Cómo se puede mejorar el programa? Siempre que pueda obtener los datos decodificados enviados por el cliente, simplemente cambie la declaración para obtener el nombre a For Each SubmitName In Request.QueryString.
Jaja, gracias por tu paciencia al leer mi artículo ^_^
lake2