Resultados 1 al 14 de 14

Tema: ¿Con escapar los valores basta?

  1. #1
    I'm mad scientist Avatar de samurai1993
    Fecha de ingreso
    21 May, 08
    Mensajes
    3,903

    ¿Con escapar los valores basta?

    Esta a sido mi eterna duda respecto a las consultas SQL, ya que siempre que busco donde San Google los sitios se ponen a redundar y redundar respecto a la seguridad, pero nunca lo dicen de frentón:

    ¿Solo escapar los valores en SQL, para joderte a las comillas mágicas, es suficiente?

    Obviamente limito la pregunta al tema de la posibilidad de alterar las consultas, ya que está el tema del código HTML que puedan incrustar, pero eso es harina de otro costal.

    Gracias desde ya por sus respuestas ya que SQL y las bases de datos en general siempre han sido un tema que me da "cuco"

  2. #2
    Gordo en rehabilitación
    Avatar de tokugawa
    Fecha de ingreso
    09 Sep, 06
    Ubicación
    -37.459999,-72.36
    Mensajes
    8,091

    Re: ¿Con escapar los valores basta?

    basicamente es eso, pero al menos en php con ciertas bases de datos ni siquiera es necesario no se si el motor de base de datos se encarga de limpiar todo o es el driver escrito para ese motor el que limpia todo.

    pero no solo se trata de escapar caracteres, porque si tienes esto

    select * from huasos where ojotas=$_GET[ojotas]

    en ojotas perfectamente podemos poner
    (delete * from huasos)

    y genera una query valida.
    Sent from mi ipaj using fapfap

    http://geoturismo.cl http://farmacias.deturno.net/mapa
    busco chamba

    Warning: A toda la comunidad Troll, las pescadas que escriba en offtopic son sólo eso , y no son validas como argumento en una discusión de Actualidad y/u otro foro donde las pescadas no tengan cabida

  3. #3
    I'm mad scientist Avatar de samurai1993
    Fecha de ingreso
    21 May, 08
    Mensajes
    3,903

    Re: ¿Con escapar los valores basta?

    y dejándolo como

    where ojotas='$_GET[ojotas]' (Lo tomaría como string por tener las comillas, o igual pesca el valor de correspondiende?)

    y aplicándole a las ojotas su debido escapado de valores?

    p.s: lolié como media hora con el ejemplo

  4. #4
    Zend Certified Engineer
    Avatar de unreal4u
    Fecha de ingreso
    02 Oct, 05
    Ubicación
    Eindhoven, The Netherlands
    Mensajes
    12,128

    Re: ¿Con escapar los valores basta?

    con el conector mysqli es posible pasar los datos parametrizados, es bastante útil tb para evitar inyecciones extrañas, ya que primero tienes que evaluar qué tipo de dato es con lo cual realizas una pre-limpieza...

    Además, el conector mysqli tengo entendido que por si solo escapa las cadenas.

    En resumen, es mucho mejor trabajar con mysqli que con el conector mysql que tiene varios añitos encima ya...

    Saludos !!
    Lee Nuestra FAQ, los famosos 14 mandamientos de CHW.
    El Reglamento de Compra-Venta, Nuestra Visión y por último, Nuestra Historia


    Futurama & The IT Crowd fanboy
    Frase célebre: "Debido a la gran cantidad de guiños y referencias relacionadas con el mundo informático, esta sección permanecerá siempre incompleta, al menos hasta que se complete"
    Para el bronce: Oh, i'm very confortable with my sexuality, i just don't want to be slapped in the face with THEIR sexuality

    Mi blog | Mi Twitter | Zend Certified Engineer

  5. #5
    I'm mad scientist Avatar de samurai1993
    Fecha de ingreso
    21 May, 08
    Mensajes
    3,903

    Re: ¿Con escapar los valores basta?

    Cita Iniciado por unreal4u Ver mensaje
    con el conector mysqli es posible pasar los datos parametrizados, es bastante útil tb para evitar inyecciones extrañas, ya que primero tienes que evaluar qué tipo de dato es con lo cual realizas una pre-limpieza...

    Además, el conector mysqli tengo entendido que por si solo escapa las cadenas.

    En resumen, es mucho mejor trabajar con mysqli que con el conector mysql que tiene varios añitos encima ya...

    Saludos !!
    Con pasar datos parametrizados te refieres a usar procedimientos almacenados? (así se llamaban cierto? )
    Por lo menos en php Mysqli también incluye un real_escape_string, así que parece se hace manual igualmente.
    Igual me gustaría cachar más del mote, si pudieras recomendar algún sitio o lectura, porque la mayoría de los tutoriales, y el nivel al que me manejo, es haciendo las cosas a la antigua (mysql viejo y programación con tablas, aunque de a poco estoy aprendiendo CSS, y intente meterme a usar INNODB, aunque todavía no entiendo si basta solo con usarlo como motor de la tabla, o hay que usarlo y programar la transacción aunque sea para una sola query )

    Eso sería, perdón por preguntar tanto pero de a poco hay que irse quitando esas viejas mañas xD

    Saludos! y gracias

  6. #6
    Zend Certified Engineer
    Avatar de unreal4u
    Fecha de ingreso
    02 Oct, 05
    Ubicación
    Eindhoven, The Netherlands
    Mensajes
    12,128

    Re: ¿Con escapar los valores basta?

    no exactamente... es hacer por ejemplo esto:

    Código PHP:
    $db->query('SELECT id, nombre FROM usuarios WHERE sUser = ? AND sPass = ?',$_POST['user'],$_POST['pass']); 
    Facilita bastante la lectura de tu SQL y además es seguro

    Tengo por ahí una classe que mejoré, si lo quieres ocupar mándame mp

    Saludos !!
    Lee Nuestra FAQ, los famosos 14 mandamientos de CHW.
    El Reglamento de Compra-Venta, Nuestra Visión y por último, Nuestra Historia


    Futurama & The IT Crowd fanboy
    Frase célebre: "Debido a la gran cantidad de guiños y referencias relacionadas con el mundo informático, esta sección permanecerá siempre incompleta, al menos hasta que se complete"
    Para el bronce: Oh, i'm very confortable with my sexuality, i just don't want to be slapped in the face with THEIR sexuality

    Mi blog | Mi Twitter | Zend Certified Engineer

  7. #7
    Seller Avatar de champ4
    Fecha de ingreso
    27 Sep, 07
    Ubicación
    Santiago
    Mensajes
    110

    Re: ¿Con escapar los valores basta?

    Hay una opción en PHP o MySQL, no recuerdo, que te evita la inyección SQL automáticamente, sin llamar a una función de por medio o tener cuidado con las comillas, etc. No sé si va con PHP o MySQL... Por ejemplo yo que uso localmente XAMPP, hago mis SQL como estos:

    $sql = "SELEC usuario FROM usuarios WHERE id = $id";

    Claro, ahí me ponen una inyección SQL y me hacen zumbar. Pero yo mismo me hago inyección SQL y no pasa nada.
    Pi Es Tri

  8. #8
    I'm mad scientist Avatar de samurai1993
    Fecha de ingreso
    21 May, 08
    Mensajes
    3,903

    Re: ¿Con escapar los valores basta?

    Ahhh, creo que ya comprendí por donde va la cosa

    Y gracias por la oferta, mandé mp

  9. #9
    I'm mad scientist Avatar de samurai1993
    Fecha de ingreso
    21 May, 08
    Mensajes
    3,903

    Re: ¿Con escapar los valores basta?

    Cita Iniciado por unreal4u Ver mensaje
    no exactamente... es hacer por ejemplo esto:

    Código PHP:
    $db->query('SELECT id, nombre FROM usuarios WHERE sUser = ? AND sPass = ?',$_POST['user'],$_POST['pass']); 
    Facilita bastante la lectura de tu SQL y además es seguro

    Tengo por ahí una classe que mejoré, si lo quieres ocupar mándame mp

    Saludos !!
    Perdón por revivir este post, pero hace poco me pico el bichito denuevo, pero estoy atascado, he encontrado bastante información "por las ramas" pero no he podido ir al hueso del tema (queries parametrizadas), por ejemplo, se que:

    • La consulta parametrizada me separa la query en si de la entrada, haciendo todo intento de inyección inútil (Mucho más efectivo que escapar caracteres)
    • Cada instancia que cree del objeto mysqli sería una nueva conexión; para ahorrar recursos puedo implementar dicha instancia en otra clase aparte, y en dicha clase implementar un singleton.
    • Todavía no entiendo mucho de PHP orientado a objetos

    Pero bueno, lo de las queries esta es más o menos así?

    Código PHP:
    $stmt $mysqli->prepare("INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
    $stmt->bind_param('sssd'$code$language$official$percent); 
    No pude encontrar mucha información concreta del tema, solo treads de foros dispersos y algo documentación de las distintas funciones en php.net, pero no encuentro la forma que escribiste tu en el cuadro
    Última edición por samurai1993; 01/02/2010 a las 02:32

  10. #10
    Zend Certified Engineer
    Avatar de unreal4u
    Fecha de ingreso
    02 Oct, 05
    Ubicación
    Eindhoven, The Netherlands
    Mensajes
    12,128

    Re: ¿Con escapar los valores basta?

    1.- Así es. Básicamente la gracia está en que evalúas el tipo de dato. Si no es un número, entonces debe ser un string y será tratado como tal. Como no son necesarias las comillas, sino que estás trabajando directamente con un tipo de dato string, la base de datos lo tratará como tal (Evitando de paso todo tipo de inyección)
    2.- Obvio Así es como lo hice
    3.- jajajaja ... cambia un poco el concepto, pero en el fondo es la misma mie*** con otro olor no más
    4.- uff... ya ni me acuerdo, pero era algo así

    Así es como lo tengo implementado yo, puedes omitir la parte de la caché (primera condicional).
    Código PHP:
    /*
    ** Function that prepares and binds the query, or does nothing if an valid cache file is found.
    */
      
    private function execute_query($arg_array NULL) {
        if (
    $this->cache_query === FALSE OR $this->cache_recreate === TRUE) {
          
    $sql_query array_shift($arg_array);
          
    $types     '';
          foreach (
    $arg_array as $v) {
            switch (
    $v) {
              case 
    is_string($v):
                
    $types .= 's';
                break;
              case 
    is_int($v):
                
    $types .= 'i';
                break;
              case 
    is_double($v):
                
    $types .= 'd';
                break;
            }
          }

          if (isset(
    $this->stmt)) unset($this->stmt);
          if (!
    $this->stmt $this->db->prepare($sql_query)) $this->logError($sql_query,$this->db->errno,'fatal',$this->db->error);

          if (isset(
    $arg_array[0])) {
            
    array_unshift($arg_array,$types);
            if (!
    $this->error) {
              if (!
    $execute_query = @call_user_func_array(array($this->stmt,'bind_param'),$arg_array)) {
                
    $this->logError($sql_query,$this->stmt->errno,'fatal','Failed to bind. Do you have equal parameters for all the \'?\'?');
                
    $execute_query FALSE;
              }
            }
            else 
    $execute_query FALSE;
          }
          else {
            if (!empty(
    $sql_query)) $execute_query TRUE;
            else 
    $execute_query FALSE;
          }
          if (
    $execute_query) {
            
    $this->stmt->execute();
            
    $this->stmt->store_result();
          }
          elseif (!
    $this->error$this->logError($sql_query,0,'non-fatal','General error: Bad query or no query at all');
        }
      } 
    Como ves, evalúo el tipo de dato de acuerdo a si PHP me indica que es un string o no. Lo que me falta hacer, es poder validar los datos de tipo booleano. Se hace con is_boolean() pero no me he dado la paja de actualizarlo, puede que me de un par de problemas si el valor es un entero con valor 1 ó 0.

    Lo que dejé arriba es sólo la forma en que el usuario finalmente lo ocupará. La gracia detrás de eso es la class xD

    Recién me di cuenta que cuando hiciste este tema todavía no había publicado mi class xDDDD

    En noviembre lo publiqué, lo puedes bajar desde acá:
    Extended MySQLi (mysqli) - PHP Classes

    Esa es la versión final, creo que te había enviado uno que funcionaba a medias no más xD

    Saludos !!
    Última edición por unreal4u; 01/02/2010 a las 10:26 Razón: typo
    Lee Nuestra FAQ, los famosos 14 mandamientos de CHW.
    El Reglamento de Compra-Venta, Nuestra Visión y por último, Nuestra Historia


    Futurama & The IT Crowd fanboy
    Frase célebre: "Debido a la gran cantidad de guiños y referencias relacionadas con el mundo informático, esta sección permanecerá siempre incompleta, al menos hasta que se complete"
    Para el bronce: Oh, i'm very confortable with my sexuality, i just don't want to be slapped in the face with THEIR sexuality

    Mi blog | Mi Twitter | Zend Certified Engineer

  11. #11
    I'm mad scientist Avatar de samurai1993
    Fecha de ingreso
    21 May, 08
    Mensajes
    3,903

    Re: ¿Con escapar los valores basta?

    Cita Iniciado por unreal4u Ver mensaje
    1.- Así es. Básicamente la gracia está en que evalúas el tipo de dato. Si no es un número, entonces debe ser un string y será tratado como tal. Como no son necesarias las comillas, sino que estás trabajando directamente con un tipo de dato string, la base de datos lo tratará como tal (Evitando de paso todo tipo de inyección)
    2.- Obvio Así es como lo hice
    3.- jajajaja ... cambia un poco el concepto, pero en el fondo es la misma mie*** con otro olor no más
    4.- uff... ya ni me acuerdo, pero era algo así

    Así es como lo tengo implementado yo, puedes omitir la parte de la caché (primera condicional).
    Código PHP:
    /*
    ** Function that prepares and binds the query, or does nothing if an valid cache file is found.
    */
      
    private function execute_query($arg_array NULL) {
        if (
    $this->cache_query === FALSE OR $this->cache_recreate === TRUE) {
          
    $sql_query array_shift($arg_array);
          
    $types     '';
          foreach (
    $arg_array as $v) {
            switch (
    $v) {
              case 
    is_string($v):
                
    $types .= 's';
                break;
              case 
    is_int($v):
                
    $types .= 'i';
                break;
              case 
    is_double($v):
                
    $types .= 'd';
                break;
            }
          }

          if (isset(
    $this->stmt)) unset($this->stmt);
          if (!
    $this->stmt $this->db->prepare($sql_query)) $this->logError($sql_query,$this->db->errno,'fatal',$this->db->error);

          if (isset(
    $arg_array[0])) {
            
    array_unshift($arg_array,$types);
            if (!
    $this->error) {
              if (!
    $execute_query = @call_user_func_array(array($this->stmt,'bind_param'),$arg_array)) {
                
    $this->logError($sql_query,$this->stmt->errno,'fatal','Failed to bind. Do you have equal parameters for all the \'?\'?');
                
    $execute_query FALSE;
              }
            }
            else 
    $execute_query FALSE;
          }
          else {
            if (!empty(
    $sql_query)) $execute_query TRUE;
            else 
    $execute_query FALSE;
          }
          if (
    $execute_query) {
            
    $this->stmt->execute();
            
    $this->stmt->store_result();
          }
          elseif (!
    $this->error$this->logError($sql_query,0,'non-fatal','General error: Bad query or no query at all');
        }
      } 
    Como ves, evalúo el tipo de dato de acuerdo a si PHP me indica que es un string o no. Lo que me falta hacer, es poder validar los datos de tipo booleano. Se hace con is_boolean() pero no me he dado la paja de actualizarlo, puede que me de un par de problemas si el valor es un entero con valor 1 ó 0.

    Lo que dejé arriba es sólo la forma en que el usuario finalmente lo ocupará. La gracia detrás de eso es la class xD

    Recién me di cuenta que cuando hiciste este tema todavía no había publicado mi class xDDDD

    En noviembre lo publiqué, lo puedes bajar desde acá:
    Extended MySQLi (mysqli) - PHP Classes

    Esa es la versión final, creo que te había enviado uno que funcionaba a medias no más xD

    Saludos !!
    Si, precisamente después de ver tu clase es que me puse a investigar del tema de los singletones Y me pareció útil cuando se necesita apretar el uso de recursos. Estoy haciendo una especie de mini-framework y como hace tiempo no tiraba ninguna línea de script he tenido que releer muchas cosas denuevo

    Por lo demás felicitarte por tu class y la buena acogida que ha tenido, espero algún día poder llegar a manejarme así en este lenguaje

    Saludos!

  12. #12
    Usuario
    Fecha de ingreso
    23 Nov, 09
    Mensajes
    342

    Re: ¿Con escapar los valores basta?

    Yo mas bien escapo todos los parametros, con la siguiente funcion que me hice, no solo escapo las comillas, sino todo lo que pueda resultar perjudicial, les dejo las funcion para quien le sirva,

    Código PHP:
    function Protege$str )
    {
        if ( 
    get_magic_quotes_gpc() )
        {
            
    $str stripslashes$str ) ;
        }
        switch ( 
    gettype($str) )
        {
            case 
    'string':
                
    $str str_replace( array("\x00""\\""'"'"'"\x1a"), array("\\x00""\\\\",
                    
    "\'"'\"'"\\x1a"), $str ) ;
                break ;
            case 
    'boolean'
                
    $str = ( $str === false ) ? 0;
                break ;
            case 
    'integer':
                
    $str = ( $str === null ) ? 'NULL'$str ;
                break ;
            default:
                
    $str = ( $str === null ) ? 'NULL':  $str ;
                break ;
        }
     return 
    $str ;

    Saludos

  13. #13
    Zend Certified Engineer
    Avatar de unreal4u
    Fecha de ingreso
    02 Oct, 05
    Ubicación
    Eindhoven, The Netherlands
    Mensajes
    12,128

    Re: ¿Con escapar los valores basta?

    Cita Iniciado por el_dva Ver mensaje
    Yo mas bien escapo todos los parametros, con la siguiente funcion que me hice, no solo escapo las comillas, sino todo lo que pueda resultar perjudicial, les dejo las funcion para quien le sirva,

    Código PHP:
    function Protege$str )
    {
        if ( 
    get_magic_quotes_gpc() )
        {
            
    $str stripslashes$str ) ;
        }
        switch ( 
    gettype($str) )
        {
            case 
    'string':
                
    $str str_replace( array("\x00""\\""'"'"'"\x1a"), array("\\x00""\\\\",
                    
    "\'"'\"'"\\x1a"), $str ) ;
                break ;
            case 
    'boolean'
                
    $str = ( $str === false ) ? 0;
                break ;
            case 
    'integer':
                
    $str = ( $str === null ) ? 'NULL'$str ;
                break ;
            default:
                
    $str = ( $str === null ) ? 'NULL':  $str ;
                break ;
        }
     return 
    $str ;

    Saludos
    los magic_quotes no sirven de mucho, hay caleta de servidores donde los desactivan, ya que aunque nació originalmente como una mejor manera de poder escapar los valores, al final tenía pifias bastante grandes que permitían evitarlas y terminó en el olvido para asuntos de bases de datos, hoy en día se ocupa más que nada para leer ciertos archivos binarios.

    Saludos !!
    Lee Nuestra FAQ, los famosos 14 mandamientos de CHW.
    El Reglamento de Compra-Venta, Nuestra Visión y por último, Nuestra Historia


    Futurama & The IT Crowd fanboy
    Frase célebre: "Debido a la gran cantidad de guiños y referencias relacionadas con el mundo informático, esta sección permanecerá siempre incompleta, al menos hasta que se complete"
    Para el bronce: Oh, i'm very confortable with my sexuality, i just don't want to be slapped in the face with THEIR sexuality

    Mi blog | Mi Twitter | Zend Certified Engineer

  14. #14
    Usuario
    Fecha de ingreso
    23 Nov, 09
    Mensajes
    342

    Re: ¿Con escapar los valores basta?

    Cita Iniciado por unreal4u Ver mensaje
    los magic_quotes no sirven de mucho, hay caleta de servidores donde los desactivan, ya que aunque nació originalmente como una mejor manera de poder escapar los valores, al final tenía pifias bastante grandes que permitían evitarlas y terminó en el olvido para asuntos de bases de datos, hoy en día se ocupa más que nada para leer ciertos archivos binarios.

    Saludos !!
    para eso es la funcion get_magic_quotes_gpc en donde devuelve el valor actual de configuración de magic_quotes_gpc (0 si está deshabilitado, 1 de lo contrario).

    si esta activado tienes que desmarcar la cadena con stripslashes.

    luego solo reemplazo los caracteres peligrosos , como veras es casi igual que la mysql_real_escape_string() de la biblioteca MySQL pero no hace llamado a ella sino que reemplazas los mismo: \x00, \n, \r, \, ', " y \x1a. y puedes dejar todo en ' ' como lo dice el satardar de mysql

    saludos

Temas similares

  1. Google ya no te deja escapar de Orkut
    Por Amenadiel en el foro Noticias CHW
    Respuestas: 4
    Último mensaje: 03/10/2009, 15:51
  2. con esta fuente me basta para un sli?
    Por Third en el foro Fuentes de Poder
    Respuestas: 2
    Último mensaje: 30/07/2009, 19:45
  3. ¿Un servidor o basta con un PC?
    Por Goring en el foro Armando tu Pc
    Respuestas: 16
    Último mensaje: 08/05/2009, 18:45
  4. Sistema para escapar de incendios OWNED
    Por BUBAX en el foro Humor
    Respuestas: 1
    Último mensaje: 16/10/2006, 14:43

Permisos de publicación

  • No puedes crear nuevos temas
  • No puedes responder temas
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •  
*