Buscar..
Introducción
La inyección de SQL es un intento de acceder a las tablas de la base de datos de un sitio web mediante la inyección de SQL en un campo de formulario. Si un servidor web no protege contra los ataques de inyección de SQL, un pirata informático puede engañar a la base de datos para que ejecute el código SQL adicional. Al ejecutar su propio código SQL, los hackers pueden actualizar el acceso a su cuenta, ver la información privada de otra persona o realizar cualquier otra modificación en la base de datos.
Muestra de inyección SQL
Suponiendo que la llamada al manejador de inicio de sesión de su aplicación web se vea así:
https://somepage.com/ajax/login.ashx?username=admin&password=123
Ahora en login.ashx, lees estos valores:
strUserName = getHttpsRequestParameterString("username");
strPassword = getHttpsRequestParameterString("password");
y consulte su base de datos para determinar si existe un usuario con esa contraseña.
Entonces construyes una cadena de consulta SQL:
txtSQL = "SELECT * FROM Users WHERE username = '" + strUserName + "' AND password = '"+ strPassword +"'";
Esto funcionará si el nombre de usuario y la contraseña no contienen una cotización.
Sin embargo, si uno de los parámetros contiene una cita, el SQL que se envía a la base de datos se verá así:
-- strUserName = "d'Alambert";
txtSQL = "SELECT * FROM Users WHERE username = 'd'Alambert' AND password = '123'";
Esto dará lugar a un error de sintaxis, porque la cita después de la d
en d'Alambert
termina la cadena SQL.
Puede corregir esto evitando comillas en el nombre de usuario y la contraseña, por ejemplo:
strUserName = strUserName.Replace("'", "''");
strPassword = strPassword.Replace("'", "''");
Sin embargo, es más apropiado usar parámetros:
cmd.CommandText = "SELECT * FROM Users WHERE username = @username AND password = @password";
cmd.Parameters.Add("@username", strUserName);
cmd.Parameters.Add("@password", strPassword);
Si no usa parámetros y se olvida de reemplazar comillas incluso en uno de los valores, un usuario malintencionado (también conocido como hacker) puede usar esto para ejecutar comandos SQL en su base de datos.
Por ejemplo, si un atacante es malo, él / ella establecerá la contraseña en
lol'; DROP DATABASE master; --
y luego el SQL se verá así:
"SELECT * FROM Users WHERE username = 'somebody' AND password = 'lol'; DROP DATABASE master; --'";
Desafortunadamente para usted, este es un SQL válido, y el DB lo ejecutará!
Este tipo de exploit se llama inyección SQL.
Hay muchas otras cosas que un usuario malintencionado podría hacer, como robar la dirección de correo electrónico de cada usuario, robar la contraseña de todos, robar números de tarjetas de crédito, robar cualquier cantidad de datos en su base de datos, etc.
Por eso siempre necesitas escapar de tus cuerdas.
Y el hecho de que siempre se olvidará de hacerlo tarde o temprano es exactamente la razón por la que debe usar parámetros. Porque si usa parámetros, entonces el marco de su lenguaje de programación hará cualquier escape necesario para usted.
muestra de inyección simple
Si la sentencia de SQL se construye así:
SQL = "SELECT * FROM Users WHERE username = '" + user + "' AND password ='" + pw + "'";
db.execute(SQL);
Luego, un pirata informático podría recuperar sus datos con una contraseña como pw' or '1'='1
; La sentencia SQL resultante será:
SELECT * FROM Users WHERE username = 'somebody' AND password ='pw' or '1'='1'
Este pasará la verificación de contraseña para todas las filas en la tabla de Users
porque '1'='1'
siempre es verdadero.
Para evitar esto, use los parámetros de SQL:
SQL = "SELECT * FROM Users WHERE username = ? AND password = ?";
db.execute(SQL, [user, pw]);