¿Deben validarse las direcciones IP para evitar la inyección SQL?

12

En PHP recupero la dirección IP de un usuario ( $_SERVER['REMOTE_ADDR'] ) para usarla en algunas consultas de MySQL, pero no las valida para que sean verdaderas direcciones IP.

¿Debo validar las direcciones IP de los usuarios antes de usarlas en las consultas de MySQL, o siempre serán direcciones IP válidas cuando use $_SERVER['REMOTE_ADDR'] ? Intento evitar una inyección de SQL.

Si debo validar, ¿qué función de PHP me recomienda usar? ¿Debo enviar la dirección IP a través de mysqli_real_escape_string() , etc.?

    
pregunta Hope4You 25.07.2012 - 16:48
fuente

3 respuestas

14

Debería usar declaraciones preparadas para evitar inyecciones SQL. Eche un vistazo a esta pregunta .

Sin embargo, $_SERVER['REMOTE_ADDR'] debe ser una dirección IP válida, ya que proviene del servidor, según lo verifica el protocolo TCP. Consulte esta pregunta para una discusión extendida sobre esto.

    
respondido por el Oleksi 25.07.2012 - 16:59
fuente
6

Desde esta página parece que el elemento REMOTE_ADDR de la matriz $ _SERVER se llena con el servidor, en lugar de ser pasado por el cliente, por lo que debería (en ausencia de cualquier error) ser una suposición razonable de que es la dirección IP del cliente remoto (o un servidor proxy que actúa en nombre del cliente remoto).

Como @ Lucb1e comentó a continuación, algunos elementos de la matriz $ _SERVER provienen del cliente y deberían ser menos confiables

Como @Oleksi menciona que no confían en la entrada a las consultas SQL es una buena idea en general.

    
respondido por el Rоry McCune 25.07.2012 - 17:45
fuente
3

REMOTE_ADDR está determinado por la pila TCP receptora, no son datos 'enviados' por el cliente. Ni IPv4 ni ipv6 utilizan caracteres que son expresiones inseguras / delimitadas en SQL.

Sin embargo, no tiene mucho sentido almacenar la dirección IP (es decir, xxx.xxx.xxx.xxx o xxxx: xxxx: xxxx: xxxx: xxxx: xxxx: xxxx: xxxx) el valor numérico es mucho más útil y requiere menos almacenamiento - consulte el manual de las funciones inet_aton () e inet6_aton ().

    
respondido por el symcbean 25.07.2012 - 23:59
fuente

Lea otras preguntas en las etiquetas