[PHP] Evitar Inyección SQL en tu sitio web

Esta es una discusión para el tema [PHP] Evitar Inyección SQL en tu sitio web en el foro Lenguajes de Programación, bajo la categoría Área Administrativa; Para poder evitar una inyección SQL desde MySQL necesitas tener un par de cosas en claro, no es nada del otro mundo. Para comenzar en una query donde ingresamos valores de tipo string siempre se ...
Página:


Resultados 1 al 3 de 3

Temas similares

  1. Por Haragan90 en el foro vBulletin 3 - Preguntas, Problemas y Soluciones
  2. Evitar doble post Respuestas: 1
    Por Sum en el foro Soporte para Productos/Plugins
  3. Por asus en el foro vBulletin 3 - Preguntas, Problemas y Soluciones
  4. Evitar Proxys Respuestas: 1
    Por Sum en el foro vBulletin 3 - Preguntas, Problemas y Soluciones
  5. Para evitar leechers Respuestas: 1
    Por serra00 en el foro vBulletin 3 - Preguntas, Problemas y Soluciones
  1. #1
    Miembro especial Miembro de platino Array Avatar de Daniel B.
    Fecha de ingreso
    25 abr, 09
    Ubicación
    cl 56 Nicolas de Federman, Apt 402
    Mensajes
    312
    Gustado
    16 Veces
    Me Gustan
    2 Veces

    Predeterminado [PHP] Evitar Inyección SQL en tu sitio web

    Para poder evitar una inyección SQL desde MySQL necesitas tener un par de cosas en claro, no es nada del otro mundo.
    Para comenzar en una query donde ingresamos valores de tipo string siempre se deben ingresar encerradas en comillas simples y los valores numéricos con (int) de la siguiente forma:

    Valores Integers
    Código PHP:
    <?php
    if(!$_GET['id'])
     
    $_GET['id'] = '1'// Da el valor por defecto

    $resultado mysql_query('
     SELECT * 
     FROM noticias 
     WHERE ID = \''
    .(int)$_GET['id'].'\'
    '
    $handle);
    .........
    ?>
    Fijense que antepuse (int), de esta forma si la variable es numérica la dejará pasar, en caso contrario el valor cerá cero.

    Valores String
    Código PHP:
    if($_GET['buscar']){
     
    mysql_query('
      SELECT * 
      FROM datos 
      WHERE palabra LIKE \'%'
    .mysql_real_escape_string($_GET['buscar'].'%\'
      LIMIT 0, 30
     '
    $handle);
    ....

    De todas formas hay que recordar que si queremos procesar una variable con magic quotes activado es recomendable filtrarlas con stripslashses como en este ejemplo:
    Si tienes problemas con magic quotes
    Código PHP:
    <?php
    $_GET 
    stripslashses_gpc($_GET);
    $_POST stripslashses_gpc($_POST);
    $_COOKIE stripslashses_gpc($_COOKIE);
    $_SERVER stripslashses_gpc($_SERVER);
     
    function 
    stripslashses_gpc($buffer){
     if(!
    function_exists('get_magic_quotes_gpc'))
      return 
    $buffer;
     if(
    get_magic_quotes_gpc()){
      if(
    is_array($buffer)){
       foreach(
    $buffer as $variable => $valor){
        
    $temp[$variable] = stripslashses_gpc($valor);
       }
       return 
    $temp;
      }else{
       return 
    stripslashes($buffer);
      }
     }else{
      return 
    $buffer;
     }
    }
    ?>
    Código PHP:
    <?php
    $_GET 
    stripslashses_gpc($_GET);
    $_POST stripslashses_gpc($_POST);
    $_COOKIE stripslashses_gpc($_COOKIE);
    $_SERVER stripslashses_gpc($_SERVER);
     
    function 
    stripslashses_gpc($buffer){
     if(!
    function_exists('get_magic_quotes_gpc'))
      return 
    $buffer;
     if(
    get_magic_quotes_gpc()){
      if(
    is_array($buffer)){
       foreach(
    $buffer as $variable => $valor){
        
    $temp[$variable] = stripslashses_gpc($valor);
       }
       return 
    $temp;
      }else{
       return 
    stripslashes($buffer);
      }
     }else{
      return 
    $buffer;
     }
    }
    ?>
    Eso es todo, no necesitan filtros especiales que borren comillas (es inutil), IDS, expresiones regulares, etc etc etc, es tan simple como utilizar comillas simples para encerrar strings mas mysql_real_escape_string() y si es numérico utilizar (int), eso es todo y cuidarse de los errores que muchos cometen al no darle un limit a sus busquedas de datos dentro de la base de datos ya que si la query contiene %dato% como comodín cualquier atacante podría solicitar un "%" quedando en "%%%" forzando a MySQL que devuelva todos los datos que se encuentren en la base de datos y cuando no tiene limite puede causar que tu servidor colapse o que el script en php almacene demasiada información en sus variables y no pueda ser ejecutado correctamente devido al límite de memoria establecido por script en el archivo de configuraciones de php (php.ini).

    Gracias amigo whk

  2. #2
    Miembro especial Miembro de diamante Array Avatar de dbembibre
    Fecha de ingreso
    01 oct, 04
    Ubicación
    Madrid
    Mensajes
    518
    Gustado
    5 Veces
    Me Gustan
    0 Veces

    Predeterminado Re: [PHP] Evitar Inyección SQL en tu sitio web

    Aparte de todo esto que es básico desde hace unos cuantos años, aunque aun haya quien siga haciendo esto por ahorrarse un cochino str_replace, un eresg o lo que sea. Magic Quotes viene desactivado y no hay forma de activarlo ya en la rama 6 de PHP. Yo creo que aunque sin descuidarlas hay que centrarse bastante más en estos tiempos de Ajax y commet en las ataques XSS que en las inyecciones en SQL

  3. #3
    Miembro especial Miembro de plata Array Avatar de orionce
    Fecha de ingreso
    15 sep, 08
    Mensajes
    95
    Gustado
    0 Veces
    Me Gustan
    10 Veces

    Predeterminado Re: [PHP] Evitar Inyección SQL en tu sitio web

    No entendi ni pepa, jeje, he buscado este tema en varios lados, y en todos olvidan mensionar, que hacer con el código, hay que crear un archivo y montarlo al servidor, hay que editar algun archivo, osea, para los menos entendidos, nos dejan en la luna