Foros del Web » Programando para Internet » PHP »

Algunas dudas sobre seguridad (sql inyecciones)

Estas en el tema de Algunas dudas sobre seguridad (sql inyecciones) en el foro de PHP en Foros del Web. Que tal, es mi primer post aca, tengo la siguiente duda. Quiero evitar inyecciones sql, previamente estaba usando esta funcion que utilizan los foros SMF: ...
  #1 (permalink)  
Antiguo 06/02/2011, 17:16
 
Fecha de Ingreso: febrero-2011
Mensajes: 23
Antigüedad: 13 años, 2 meses
Puntos: 0
Pregunta Algunas dudas sobre seguridad (sql inyecciones)

Que tal, es mi primer post aca, tengo la siguiente duda.

Quiero evitar inyecciones sql, previamente estaba usando esta funcion que utilizan los foros SMF:
Código:
<?php
function addslashes__recursive($var){
if (!is_array($var))
return addslashes($var);
$new_var = array();
foreach ($var as $k => $v)$new_var[addslashes($k)]=addslashes__recursive($v);
return $new_var;
}
$_POST=addslashes__recursive($_POST);
$_GET=addslashes__recursive($_GET);
$_REQUEST=addslashes__recursive($_REQUEST);
$_SERVER=addslashes__recursive($_SERVER);
$_COOKIE=addslashes__recursive($_COOKIE);
?>
Luego me dijeron que lo recomendable es usar mysql_real_escape_string, por lo que cambie a esta funcion:
Código:
<?php
function mysql_escape($cadena) {
    if(get_magic_quotes_gpc() != 0) {
        $cadena = stripslashes($cadena);
    }
    return mysql_real_escape_string($cadena);
}  
?>
Utilice la funcion mysql_escape() para cada post y get.
Mi duda es la siguiente, con el siguiente codigo testeo si es vulnerable a inyecciones sql:
Código:
 <?
if(!isset($_GET["inyeccion"])){
header("location: ?inyeccion='");
} else {
echo 'Tu servidor ';
if($_GET["inyeccion"] != "'")echo 'no ';
echo 'tiene problemas de inyección';
}
?>
..el problema es que con la funcion de los foros SMF me dice que no tiene problemas de inyeccion, en cambio usando mysql_real_escape_string() si tiene problemas. Tengo entendido que no puedo usar ambas funciones ya que harian lo "mismo", entonces como puedo hacer para usar mysql_real_escape_string() y que no sea vulnerable a inyecciones sql?

No se si se entendio, espero que si.
Gracias.
  #2 (permalink)  
Antiguo 06/02/2011, 17:18
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Algunas dudas sobre seguridad (sql inyecciones)

Primero tendrías que entender que hace cada código, ya que uno lo que hace es iterar por todas las variables de entrada y agregarles slashes, el segundo hace lo mismo pero usando la función de MySQL mysql_real_escape_string que escapa algunos otros caracteres.

El como la uses ahí si depende de tu contexto, ya que la primera lo hace sobre todas las variables de entrada, y la segunda lo hace solo en la variable que tu quieras hacerlo.

Saludos.
  #3 (permalink)  
Antiguo 06/02/2011, 18:21
 
Fecha de Ingreso: febrero-2011
Mensajes: 23
Antigüedad: 13 años, 2 meses
Puntos: 0
Respuesta: Algunas dudas sobre seguridad (sql inyecciones)

Entiendo, pero es seguro si evito las comillas simples con mysql_real_escape_string SOLO con variables que elegi?

por ejemplo haciendo algo asi:
Código:
if(isset($_GET['id']))
{
$id=mysql_escape($_GET['id']);
if(($id)>0)
{
echo 'etc'; 
}
  #4 (permalink)  
Antiguo 06/02/2011, 19:04
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Algunas dudas sobre seguridad (sql inyecciones)

Si tu variable es númerica como indicas en ese caso, basta con que hagas un cast con (int) para forzar que tu variable solo contenga números.

Saludos.
  #5 (permalink)  
Antiguo 07/02/2011, 00:10
 
Fecha de Ingreso: febrero-2011
Mensajes: 23
Antigüedad: 13 años, 2 meses
Puntos: 0
Respuesta: Algunas dudas sobre seguridad (sql inyecciones)

Entiendo, gracias.

Etiquetas: inyecciones, seguridad, sql
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 06:37.