
En un gran porcentaje, la mayoría de nuestras aplicaciones necesitan acceder a las bases de datos para realizar consultas, actualizaciones e incluso eliminaciones de nuestros registros… El problema es cuando alguien desde fuera intenta hacer esas tareas por nosotros
Voy a proponeros algunos tips a la hora de tratar los valores ajenos a nosotros desde el lado del servidor, para evitar este tipo de catástrofes. Por otro lado, cualquier tip adicional será bienvenido
Convierte siempre el valor a su tipo correspondiente
Si por ejemplo estamos esperando un valor de tipo numérico, deberíamos intentar parsear este valor a dicho tipo para asegurarnos de que no incluye texto adicional:
var id = Request.QueryString["id"]; int result; if (Int32.TryParse(id, out result)) //Do things
Parametrizar las consultas SQL
Un error muy común es hacer uso de los valores que nos llegan sin especificar ningún tipo para el mismo. Algo parecido a esto:
var id = Request.QueryString["id"]; var query = "SELECT * FROM HOUSES WHERE ID=" + id;
Para evitarlo, podemos parametrizar las sentencias SQL y poder especificar de esta manera el tipo que estamos esperando para cada parámetro.
var objConnection = new OleDbConnection(strDbConnectionString);
objConnection.Open();
const string query = "SELECT * FROM HOUSES WHERE ID=?";
var objCommand = new OleDbCommand(query, objConnection);
var id = new OleDbParameter("@idParam", OleDbType.Integer) { Value = id};
objCommand.Parameters.Add(id);
var objReader = objCommand.ExecuteReader();;
Usar una cuenta con permisos restringidos a la base de datos
Otro dato importante a tener muy en cuenta es asegurarnos de que la cuenta de usuario utilizada por nuestra aplicación tiene los permisos necesarios para poder acceder y/o modificar unos datos concretos pero también que sea lo suficiente restrictiva para no alterar otro tipo de datos.
No mostrar al usuario la información de error generada por la base de datos
En muchos casos los mensajes de error pueden ser lo suficientemente descriptivos como para que el usuario se percate de información acerca de la estructura de la base de datos.
Rechazar las peticiones con caractéres sospechosos
| Carácter especial | Significado SQL |
|---|---|
| ; | Delimitador de consultas. |
| ‘ | Carácter delimitador de cadena de datos. |
| - | Comentario. |
| /* */ | Delimitadores de comentario. El texto entre /* y */ no es evaluado. |
| xp_ | Se utiliza en el inicio del nombre de procedimientos almacenados extendidos de catálogo, como xp_cmdshell. |
Espero que sea de utilidad
¡Saludos!
No olvidarnos de la primera advertencia clásica:
Evitar el uso de SQL concatenado y usar preferentemente SP en su lugar, ademas de seguridad mejora las consultas pues el motor puede planificarlas.
Pingback Tweets that mention Tips para evitar SQL Injection | Return(GiS); -- Topsy.com
Hola Gis, llebo har par de días leyendo tu blog además de este dominio.
Hace 2 años me brinque al opensource dejando .NET como plataforma de desarrollo, me es muy motavador leer tu blog. Y me doy de topes por haber dejado la plataforma .net. pero el trabajo lo requeria.
El punto es que además de inyecciones para romper consultas debemos evitar entradas no válidas. como por ejemplo html, espacios en blanco, mayúsculas, etc, comentaré con esta clase:
_value = $value;
$this->_escaparCadena();
$this->_quitarHmtl();
$this->_quitarEspacios();
}
public function limpiar($value)
{
$this->_value = $value;
$this->_escaparCadena();
$this->_quitarHmtl();
$this->_quitarEspacios();
}
private function _escaparCadena()
{
$this->_value = (get_magic_quotes_gpc()) ? $this->_value : addslashes($this->_value);
}
private function _quitarHmtl()
{
$this->_value = strip_tags($this->_value);
}
private function _quitarEspacios()
{
$this->_value = trim($this->_value);
}
public function obtener()
{
return $this->_value;
}
public function obtenerEnMayusculas()
{
return strtoupper($this->_value);
}
public function obtenerEnMinusculas()
{
return strtolower($this->_value);
}
}
ZendFramework lo maneja más transparente, pero esto es como lo hago en PHP y MySQL.
iniciaré en próximos días ya practicando con el VS 2010. Ya que el próxicmo año regresaré al software propietario,
Muy motivador tu blog.
Saludos
Isaac
Hola Isaac,
Tienes razón, otro punto importante sería evitar entradas no validas relacionadas con cualquier script que nos puedan inyectar además de las sentencias SQL
¡Muchas gracias por tu comentario! Me alegra que mi sitio te parezca de interés
¡Saludos!
la clase iniciaba con :
<?php
class datosEntrada
{
private $_value;
/**
* @param string $value
* Limipia una cadena de cualquier entrada no valida
*/
public function __construct($value)
{
Excelentes los tips, para evitar amenazas SQL injection
Gracias por tu comentario Pablo_eok
Me alegra que te haya resultado útil.
¡Saludos!