Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Evitar inyeccion SQL

Estas en el tema de Evitar inyeccion SQL en el foro de PHP en Foros del Web. Hola gente, espero esten bien. Bueno, voy a tocar el tema de "Inyecciones SQL". Se muy bien que muchos lo usan para cometer actos que ...
  #1 (permalink)  
Antiguo 17/11/2015, 16:36
 
Fecha de Ingreso: agosto-2015
Ubicación: Rosario - Argentina
Mensajes: 424
Antigüedad: 8 años, 8 meses
Puntos: 12
Evitar inyeccion SQL

Hola gente, espero esten bien.


Bueno, voy a tocar el tema de "Inyecciones SQL".
Se muy bien que muchos lo usan para cometer actos que no deben cometerse...

Pero bueno, el caso es.. que si no toco este tema entonces mi web sera muy vulnerable... y la verdad deseo evitar esto...

ASi que suponiendo que yo tenga este sistema de busqueda, tengo dos preguntas:

1- ¿Como es posible hacer una inyeccion sql en ese campo de texto?

2- ¿Como evitar dicha inyeccion?

¿Con el metodo para evitar la inyeccion de la pregunta dos, podria evitarla en todo tipo de codigo?, ya sea login, registro, busqueda, etc?

Código HTML:
<form method='post'>
<input type='text' name='producto'>
<input type='submit' name='buscar' value='Buscar Producto'>
</form> 
Código PHP:
<?php
require('config.php');
mysqli_select_db($conexion,$productos)or die("Error al seleccionar la DB.");
if(isset(
$_POST['buscar'])){
extract($_POST);
$consultar_productos mysqli_query($conexion,"SELECT * FROM productos WHERE nombre='$producto'")or die(mysqli_error($conexion));
$rconsultar_productos mysqli_num_rows($consultar_productos);
while(
$linea mysqli_fetch_array($consultar_productos,MYSQL_ASSOC)){
$nombre $linea['nombre'];
$precio $linea['precio'];
$stock $linea['stock'];
echo 
$nombre."<br>";
echo 
$precio."<br>";
echo 
$stock."<br>";
}
}
?>
Espero me puedan ayudar y muchas gracias de antemano!
  #2 (permalink)  
Antiguo 17/11/2015, 16:42
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Evitar inyeccion SQL

El primer error que cometes es construir la consulta de SQL a mano, a partir de ahí todo lo que hagas será un error tras otro si lo sigues haciendo igual.

Lo ideal es que uses PDO (o MySQLi) y sus prepared-statementes, básicamente un método llamado prepare() en ambas librerías.

Así evitas construir el SQL a mano y te evitas problemas de SQL-Injection.

Cualquier otra "solución" es pérdida de tiempo.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 18/11/2015, 02:13
 
Fecha de Ingreso: noviembre-2015
Mensajes: 34
Antigüedad: 8 años, 5 meses
Puntos: 4
Respuesta: Evitar inyeccion SQL

Cita:
Iniciado por pateketrueke Ver Mensaje
El primer error que cometes es construir la consulta de SQL a mano, a partir de ahí todo lo que hagas será un error tras otro si lo sigues haciendo igual.

Lo ideal es que uses PDO (o MySQLi) y sus prepared-statementes, básicamente un método llamado prepare() en ambas librerías.

Así evitas construir el SQL a mano y te evitas problemas de SQL-Injection.

Cualquier otra "solución" es pérdida de tiempo.
Realmente solo con eso evitas toda inyección sql posible?, no he tocado apenas ese tema, pero me sorprende bastante, que hace esa función exactamente y como funciona para hacer eso posible sin ninguna otra medida?
  #4 (permalink)  
Antiguo 18/11/2015, 10:07
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Evitar inyeccion SQL

Cita:
Iniciado por Knaak53 Ver Mensaje
Realmente solo con eso evitas toda inyección sql posible?, no he tocado apenas ese tema, pero me sorprende bastante, que hace esa función exactamente y como funciona para hacer eso posible sin ninguna otra medida?
Sí, efectivamente.

No necesitas nada más que "preparar" las consultas para evitar inyecciones.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 20/11/2015, 14:32
 
Fecha de Ingreso: agosto-2015
Ubicación: Rosario - Argentina
Mensajes: 424
Antigüedad: 8 años, 8 meses
Puntos: 12
Respuesta: Evitar inyeccion SQL

Cita:
Iniciado por pateketrueke Ver Mensaje
Sí, efectivamente.

No necesitas nada más que "preparar" las consultas para evitar inyecciones.
Si, no se a que te refieres con "Preparar la consulta a mano"...

Podrias darme un ejemplo con el codigo que he puesto?
Asi yo podria orientarme...

Gracias de antemano.
  #6 (permalink)  
Antiguo 20/11/2015, 14:47
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Evitar inyeccion SQL

Cita:
Si, no se a que te refieres con "Preparar la consulta a mano"...
A esto me refiero:
Código PHP:
Ver original
  1. $x = $_POST['y'];
  2.  
  3. // esto significa "preparar la consulta a mano"
  4. $sql = "SELECT * FROM table WHERE value = '$x'";
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #7 (permalink)  
Antiguo 22/11/2015, 08:39
 
Fecha de Ingreso: agosto-2015
Ubicación: Rosario - Argentina
Mensajes: 424
Antigüedad: 8 años, 8 meses
Puntos: 12
Respuesta: Evitar inyeccion SQL

Cita:
Iniciado por pateketrueke Ver Mensaje
A esto me refiero:
Código PHP:
Ver original
  1. $x = $_POST['y'];
  2.  
  3. // esto significa "preparar la consulta a mano"
  4. $sql = "SELECT * FROM table WHERE value = '$x'";
Seria mucha molestia mostrar la manera correcta de hacerlo para comenzar a editar todos mis codigos??

Te agradeceria
  #8 (permalink)  
Antiguo 22/11/2015, 08:59
Avatar de xfxstudios  
Fecha de Ingreso: junio-2015
Ubicación: Valencia - Venezuela
Mensajes: 2.448
Antigüedad: 8 años, 10 meses
Puntos: 263
Respuesta: Evitar inyeccion SQL

podria ser algo asi:

Código PHP:
Ver original
  1. //preparamos la sentencia
  2. $q = $db->prepare("INSERT INTO tabla (campoA, campoB) VALUES (?,?)");
  3. $q->bind_param("ss", $datoA, $datoB);
  4.  
  5. //recogemos los datos
  6.  
  7. $datoA = $_post['datoA'];
  8. $datoB = $_post['datoB'];
  9.  
  10. //ejecutamos la sentencia y la cerramos
  11. $q->execute();
  12. $q->close();

seria algo asi mas o menos
__________________
[email protected]
HITCEL
  #9 (permalink)  
Antiguo 22/11/2015, 10:44
 
Fecha de Ingreso: noviembre-2004
Ubicación: NULL
Mensajes: 652
Antigüedad: 19 años, 5 meses
Puntos: 6
Respuesta: Evitar inyeccion SQL

Te Felicito xfxstudios

Por los ejemplos que das, yo aprendo siempre de ese modo e intento aprender lento lento

Por que eso de 'Auto te lleva al mundial = 'Yet .... avion te lleva mas rapido, y fijate si esta prendido tu computadora,.. etc... son preguntas que uno se formula antes de pedir ayuda, pero con ejemplos uno va teniendo major una idea o una pista de como hacer las cosas.

Bueno a mi si me agrado este ejemplo usando VALUES (?,?) y no VALUES ('$campoA', '$campoB')

Etiquetas: mysql, registro, select, 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 22:54.