Foros del Web » Programando para Internet » PHP »

Injección o isercción como sea con SQL. problema con MySQL y PHP... no son seguros?

Estas en el tema de Injección o isercción como sea con SQL. problema con MySQL y PHP... no son seguros? en el foro de PHP en Foros del Web. Hola foristas.. oi algo de injeccion SQL mediante URL en las web y eso trae un gran problema .. como puedo eviatr esto... tendria que ...
  #1 (permalink)  
Antiguo 27/04/2005, 16:27
Avatar de richardinj  
Fecha de Ingreso: enero-2005
Ubicación: Ciber Espacio
Mensajes: 2.180
Antigüedad: 19 años, 2 meses
Puntos: 11
Injección o isercción como sea con SQL. problema con MySQL y PHP... no son seguros?

Hola foristas..
oi algo de injeccion SQL mediante URL en las web y eso trae un gran problema .. como puedo eviatr esto... tendria que cambiar mi metodo de programacion?

osea

como se evita que hagan esto en mi web?

pagintabonita.php?id=145225;DELETE FROM usuarios

Con eso me arruinan...

Pienso en una solcuion basica... usar tablas codificadas, osea que no se llame usuarios, sino usuarios_a1b25 de ese modo no sabran el nombre de la tabla y no haran nada...

pero eso es un metodo, hay otros modos de hacer inyeccion SQL ayuda en generalllllllllll

  #2 (permalink)  
Antiguo 27/04/2005, 17:13
Avatar de andinistas  
Fecha de Ingreso: julio-2003
Ubicación: Bogotá COL
Mensajes: 1.000
Antigüedad: 20 años, 9 meses
Puntos: 0
leete esto http://www.maestrosdelweb.com/editorial/inyecsql/
__________________
Un Saludo, Andinistas.
"Llegaron... Ellos tenían la biblia y nosotros la tierra... y nos dijieron: 'Cierren los ojos y recen.' Cerramos los ojos y cuando los abrimos,
ellos tenían la tierra y nosotros la biblia." Abadío Green.
  #3 (permalink)  
Antiguo 27/04/2005, 17:22
Avatar de richardinj  
Fecha de Ingreso: enero-2005
Ubicación: Ciber Espacio
Mensajes: 2.180
Antigüedad: 19 años, 2 meses
Puntos: 11
Evitar la inyección SQL

La inyección SQL consiste en la modificación de las consultas a nuestra base de datos a partir de los parametros pasados por URL al script en PHP.

¿En que consiste?
Vamos a ver un ejemplo de lo que es la inyección, imaginemos que para validar el acceso de un usuario registrado utilizamos la siguiente consulta SQL:

<?
$sql = "SELECT * FROM usr WHERE id = '" . $id ;
$sql .= "' AND pwd = '" . $pwd . "'" ;
?>

Cuando tengamos unos valores para el nombre de usuario (id) y la contraseña del usuario (pwd) tendremos una consulta normal a la base de datos que nos devolverá los datos del usuario si la contraseña es correcta:

SELECT * FROM usr WHERE id = 'root' AND pwd = '4358'

Pero vamos a ver que pasaria si intentaramos modificar la consulta poniendo cómo contraseña ' OR '' = '
SELECT * FROM usr WHERE id = 'root' AND pwd = ' ' OR '' = ' '

En este caso, como '' siempre es igual a '', habremos modificado la consulta para que nos devuelva siempre los datos del usuario aunque la contraseña sea incorrecta, y el visitante malintencionado se podrá conectar como cualquier usuario.

Pero esto es solo un ejemplo, asimismo, el visitante malintencionado podra conseguir contraseñas, borrar, anñadir y modificar datos de nuestra base de datos... por eso es importanto que nos aseguremos que nuestro sitio es seguro en este aspecto.

¿Estoy afectado?
Según la configuración de tu servidor es posible que no te encuentres afectado por este tipo de problemas, pero de todos modos es mejor asegurarse, vamos a ver si nuestro servidor toma la precaución de cambiar las comillas pasadas en las variables ejecutando este código:

prueba.php
<?
if(!isset( $_GET [ "inyeccion" ])){
header ( "location: ?inyeccion='" );
} else {
echo 'Tu servidor ' ;
if( $_GET [ "inyeccion" ] != "'" )echo 'no ' ;
echo 'tiene problemas de inyección' ;
}
?>

Segun el mensaje que nos muestre deberemos o no preocuparnos.

¿Que debo hacer?
En el caso de que tu servidor haya dado resultado positivo, será porque no se preocupa de cambiar la comilla simple por \' , y en este caso, deberemos ser nosotros los que manualmente lo cambiemos de todas las variables pasadas tanto por URL como vía formulario:


inyeccion.php
<?
// Evitamos la inyeccion SQL

// Modificamos las variables pasadas por URL
foreach( $_GET as $variable => $valor ){
$_GET [ $variable ] = str_replace ( "'" , "\'" , $_GET [ $variable ]);
}
// Modificamos las variables de formularios
foreach( $_POST as $variable => $valor ){
$_POST [ $variable ] = str_replace ( "'" , "\'" , $_POST [ $variable ]);
}
?>



Y incluiremos este script en todas las páginas en las que realizemos consultas a la base de datos:

<?
// Evitamos la inyeccion SQL
include 'inyeccion.php' ;
//
// Contenido de la página PHP
//
?>

De esta manera conseguiremos hacer consultas a la base de datos desde PHP de forma más segura, vean cómo si incluyen este archivo en la página de prueba, les dirá que el servidor es seguro ;)

Artículo por cortesía de Eloi de San Martín
  #4 (permalink)  
Antiguo 28/04/2005, 07:22
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Esto de aquí:
$_GET [ $variable ] = str_replace ( "'" , "\'" , $_GET [ $variable ]);

Se pude solventar con:
mysql_escape_string()

y aplicarlo sólo a las variables que realmente intervengan en tu consulta SQL .. Pero bueno .. si quieres aplicarlo a todo .. OK.

El caso es que todo depende del estado de (php.ini) magic_guote_gpc() .. (por lo menos en la solución que plantea " Eloi de San Martín" (me gustaría ver el link de donde publicó ese tema para hacerle el comentario) Por defecto dicha directiva suele estar a "ON" .. por ende se añaden automáticamente los caracteres de espace (el /) a comillas ... Por eso si se usa a ON esta directiva y luego se vuelve añadir otro / .. el resultado no será el correcto (tendremos dos) como para luego aplicar un stripslashess() a la hora de recuperar el dato.

por otro lado .. por ejemplo .. depende del RDBMS que se use .. así podrás hacer algo como tu ejemplo:
pagintabonita.php?id=145225;DELETE FROM usuarios

o no ..

Por ejemplo Mysql (con su cliente mysql_xxx() funciones) .. no permite ejecutar várias sentencias SQL en un mysql_query() separadas por ; .. pero otros motores de BD como MS SQL Server .. o incluso Mysql con sus mysqli_xxx() (para Mysql 4.1.x en adelante) si que permite ejecutar várias sentencias SQL separadas por ; ... Así que en determinados casos estamos "salvados" por "defecto" según que BD se use ...

Un saludo,
  #5 (permalink)  
Antiguo 28/04/2005, 10:14
Avatar de richardinj  
Fecha de Ingreso: enero-2005
Ubicación: Ciber Espacio
Mensajes: 2.180
Antigüedad: 19 años, 2 meses
Puntos: 11
a yaaaaaaaa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:34.