2010-01-07 25 views
13

¿Es posible que un usuario forje el resultado que se devuelve desde $_SERVER['REMOTE_ADDR'] en PHP, por lo que en teoría podrían usar la inyección SQL en una base de datos?Dirección IP inyección SQL

Esto es un poco tonto, pero sigo suficiente para PHP nueva que yo quiero saber si se puede hacer, ya sea o no que necesito para desinfectar entrada de base de datos cuando la declaración SELECT elige a partir de direcciones IP devueltas desde $_SERVER['REMOTE_ADDR'] . Entonces, si quisiera usar algo como $query = "SELECT * FROM users WHERE IP='" . $_SERVER['REMOTE_ADDR'] . "'";, ¿habría algún peligro para que yo haga esto?

Nuevamente, probablemente sea una pregunta "nooby", pero creo que debe ser preguntado.

Gracias

Respuesta

16

Es un tramo, y es poco probable, pero yo no iría tan lejos como para decir que es imposible. Entonces ....

Utilice consultas parametrizadas de todos modos.

Incluso si nunca te atacan a través del campo de dirección IP, aún obtendrás el beneficio adicional de consultas más rápidas mediante el almacenamiento en caché.

+0

¿Qué son las consultas parametrizadas? ¿Puede dar un ejemplo? – Cyclone

+3

Los busqué. ¡Gracias! – Cyclone

+2

Usted "no iría tan lejos como para decir" = usted no sabe la respuesta. Andrew McGregor (abajo) parece saber de lo que está hablando. –

5

desinfectar siempre todas las entradas externas - utilizar mysql_real_escape_string, o mejor aún, prepared statements

2

Puede utilizar las funciones de filtrado de datos de PHP.

filter_var() con FILTER_VALIDATE_IP validará la dirección IP remota. Si la dirección IP remota es válida, úsela en SQL.

EDIT: filter_input() con INPUT_SERVER es otra opción;)

http://www.php.net/manual/en/book.filter.php

http://www.php.net/manual/en/filter.filters.validate.php

http://www.php.net/manual/en/function.filter-var.php

http://www.php.net/manual/en/function.filter-input.php

Espero que esto ayude,

Simeon

+0

¿De qué tipo de rendimiento estamos hablando? ¿Este filtro sale literalmente a Internet para verificar la IP? –

1

Siempre pongo este código en todos mis proyectos (algunas desinfección de entrada inicial), para evitar que algo desagradable con IP falsas continúe. No estoy seguro de si pueden falsificar REMOTE_ADDR de todos modos.

function validate_ip($ip) { 
    // Try IPv4 First, as its the most used method right now 
    if(!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { 
     // Oops... try v6 
     if(!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) { 
      return false; // Sorry... 
     } 
     else { 
      return true; 
     } 
    } 
    else { 
     return true; 
    } 
} 
if(!isset($_SERVER['REMOTE_ADDR'])) # wtf? 
    die("Could not find your IP Address..."); 
else { 
    if(validate_ip($_SERVER["REMOTE_ADDR"])) 
     die("Could not validate your IP Address..."); 
} 
+3

Eso '# wtf?' Me hizo reír – Cyclone

+0

Jaja, se me olvidó ese comentario que agregué. La "codificación" tardía (bueno, escribir pequeños y simples fragmentos de código solo para permanecer despierto) me obliga a escribir comentarios terribles. –

6

Creo que la única manera para que alguien forjar $_SERVER['REMOTE_ADDR'] sería construir un paquete IP con una dirección IP falsa (ya que es fijado por el servidor, no el cliente), en la que serían encaminados respuestas de casos volver a la dirección falsa. Si está preocupado por los ataques de inyección, creo que está bien porque los campos de dirección en los paquetes de IP solo tienen espacio para las direcciones.

+0

Acepto (en realidad estaba escribiendo eso como lo publicaste). Sin embargo, teóricamente estaría bien intentar ataques de inyección que permitan alguna otra forma de ingreso (ciegamente como dijiste), pero eso es bastante improbable. – Eduardo

1

REMOTE_ADDR no es enviado por el cliente, lo configura el servidor. Si bien es técnicamente posible falsificar una dirección IP a nivel de red, el atacante tiene que trabajar a ciegas. La parte más complicada es adivinar el sequence number. (Debajo de Coldfusion, por cierto, es another story.)

Como han dicho otros, use declaraciones preparadas y no tiene que preocuparse por la inyección de SQL (aunque son posibles otros tipos de ataques de inyección).

+1

Interesante, no pensé que fuera siquiera realmente posible en absoluto – Cyclone

+0

Tenga en cuenta que la falsificación de direcciones IP no funciona como un vector para inyección SQL, simplemente significa que no puede saber con certeza REMOTE_ADDR es la dirección de la computadora que envió la solicitud Además, adivinar los números de secuencia no es fácil. En OpenBSD, que comienza en un número aleatorio, es básicamente imposible. – outis

1

Para mayor eficiencia y seguridad, es posible que desee almacenar y trabajar con IP como datos en su base de datos.

La forma sencilla de almacenar direcciones IP es usar un campo varchar en su base de datos. Sin embargo, otra forma de representar IPs es como un entero. La conversión de la IP suministrada de esta manera lo desinfectará, y también hará que su almacenamiento y consultas sean más eficientes. Almacenar una INT ocupa menos espacio en una base de datos, y funciona mejor para la indexación y creo que el almacenamiento en caché de consultas.

Consulte ip2long y long2ip para las funciones de PHP a convertir, y inet_aton y inet_ntoa para hacerlo en MySQL.

Por lo tanto, el proceso podría ser algo así

$user_ip=ip2long($_SERVER['REMOTE_ADDR']); 
if(!$user_ip){ //returned false due to odd input 
    echo 'wtf, yo'; 
    } 
else{ 
    //do your query 
    } 

También puede desinfectar una IP y mantenerla en forma de cuaterna original, mediante la combinación de los dos

$user_ip=long2ip(ip2long($_SERVER['REMOTE_ADDR'])); 
+0

Es posible que desee mejorar su estilo de codificación. $ _SERVER [REMOTE_ADDR] es horrible. –

+0

Gracias, por alguna razón, pensé que esas eran constantes sin comillas o algo así. Sí, yo debería incluir las comillas, así que actualicé mi respuesta. Realmente no creo que sea una cuestión de estilo de codificación. – JAL

9

No se puede confiar en REMOTE_ADDR es cierto ... podría ser la dirección incorrecta debido a proxies anonimizantes o algún truco similar. Usted puede confiar en que siempre es una dirección IP, por lo que la inyección SQL por esta ruta es imposible.

Descendente en la parte inferior de la pila, que se ha convertido desde la dirección de origen en los paquetes que hacen la conexión TCP a su servidor. Eso significa que a) tiene que ser una dirección IP yb) tiene que volver al cliente para que la conexión se realice.

+1

IMO esta es la verdadera respuesta. Si tuviera un centavo por cada sermón de consultas parametrizadas, LOL. –