Foros del Web » Programando para Internet » PHP »

Como Evitar SQL Injection

Estas en el tema de Como Evitar SQL Injection en el foro de PHP en Foros del Web. Estimado escribo a ver is alguien me puede hechar una manito. tengo un formulario en PHP con conexion DB Mysql y quisiera saber de que ...
  #1 (permalink)  
Antiguo 06/05/2013, 17:30
 
Fecha de Ingreso: abril-2013
Mensajes: 11
Antigüedad: 11 años, 6 meses
Puntos: 1
Como Evitar SQL Injection

Estimado escribo a ver is alguien me puede hechar una manito.
tengo un formulario en PHP con conexion DB Mysql y quisiera saber de que forma me podria defender de un ataque de "SQL Injection".
Este es parte de mi codigo.
Saludos:
Código:
<?php
$bd=mysql_connect("localhost","root","") or die ("no puedo conectarme");
mysql_select_db("formulario1");

    $rut = $_POST['rut'];
	$razonsocial  = $_POST['razonsocial'];
	$direccion1 = $_POST['direccion1'];
$sql="insert into dato2 (razonsocial, rut, direccion1)
$res=mysql_query($sql,$bd) or die (mysql_error());
 ?>
  #2 (permalink)  
Antiguo 06/05/2013, 17:45
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 3 meses
Puntos: 2237
Respuesta: Como Evitar SQL Injection

Podrías leer esto para darte una idea: http://www.forosdelweb.com/f18/aport...8/#post4265377
__________________
- León, Guanajuato
- GV-Foto
  #3 (permalink)  
Antiguo 07/05/2013, 08:12
 
Fecha de Ingreso: septiembre-2007
Ubicación: Barcelona
Mensajes: 227
Antigüedad: 17 años, 2 meses
Puntos: 12
Respuesta: Como Evitar SQL Injection

Creo que te faltan las bases de programación. Das por hecho que la entrada del usuario (los datos post) son validos. Deberías verificarlos y escaparlos.
  #4 (permalink)  
Antiguo 08/05/2013, 08:31
 
Fecha de Ingreso: abril-2013
Mensajes: 11
Antigüedad: 11 años, 6 meses
Puntos: 1
Respuesta: Como Evitar SQL Injection

Estimado Patrik, gracias por tu respuesta
me puede ayudar un poco con eso ?.
slds.
  #5 (permalink)  
Antiguo 08/05/2013, 08:53
Avatar de bulter  
Fecha de Ingreso: enero-2008
Mensajes: 137
Antigüedad: 16 años, 10 meses
Puntos: 20
Respuesta: Como Evitar SQL Injection

Lo que quiere decir patrick_ que nunca te debes de fiar al usurio, siempre tienes que asumir que lo que te pasa el user es malo para tu script.

ejemplo:
Formulario al usuario: ( le pides el nombre )
Código PHP:
Type your name here: <input type="text" name="data" /> 
Resultado: (le dices hola)
Código PHP:
echo "Hola " $_POST["data"]; 
Pues, el usuario debe de poner por ejemplo Pepito, pero igual puede poner

Código PHP:
<script>alert("xss injection");</script> 
( que por cierto es lo de menos :D ) Esto es una entrada mala para tu codigo y la tienes que evitar la, es decir filtrar y comprobar la entrada. En el caso de un nombre $_POST["data"] debe de contener solo letras y si hay apellidos espacios. En caso de edad $_POST["age"] debe de ser integer etc.

Código PHP:
$age = (int)$_POST["age"];
preg_match("/^[a-zA-Z-\s]*/"$_POST["name"], $name);

echo 
"Hi, " $name[0] . ". You are " $age " years old"
esto es un ejemplo. Otro seria:

Código PHP:
$age = (int)$_POST["age"];
$name htmlspecialchars(trim(addslashes($_POST["name"])));

echo 
"Hi, " $name[0] . ". You are " $age " years old"
  #6 (permalink)  
Antiguo 08/05/2013, 09:32
Avatar de efenollal  
Fecha de Ingreso: abril-2012
Ubicación: Toa Baja
Mensajes: 63
Antigüedad: 12 años, 7 meses
Puntos: 3
Respuesta: Como Evitar SQL Injection

Deberias considerar conectarte a MySQL con PDO en el futuro ya que mysql_connect fue depreciada. Aqui te dejo un enlace:

http://php.net/manual/es/ref.pdo-mysql.php
  #7 (permalink)  
Antiguo 08/05/2013, 09:48
 
Fecha de Ingreso: abril-2013
Mensajes: 11
Antigüedad: 11 años, 6 meses
Puntos: 1
Respuesta: Como Evitar SQL Injection

Cita:
Iniciado por bulter Ver Mensaje
Lo que quiere decir patrick_ que nunca te debes de fiar al usurio, siempre tienes que asumir que lo que te pasa el user es malo para tu script.

ejemplo:
Formulario al usuario: ( le pides el nombre )
Código PHP:
Type your name here: <input type="text" name="data" /> 
Resultado: (le dices hola)
Código PHP:
echo "Hola " $_POST["data"]; 
Pues, el usuario debe de poner por ejemplo Pepito, pero igual puede poner

Código PHP:
<script>alert("xss injection");</script> 
( que por cierto es lo de menos :D ) Esto es una entrada mala para tu codigo y la tienes que evitar la, es decir filtrar y comprobar la entrada. En el caso de un nombre $_POST["data"] debe de contener solo letras y si hay apellidos espacios. En caso de edad $_POST["age"] debe de ser integer etc.

Código PHP:
$age = (int)$_POST["age"];
preg_match("/^[a-zA-Z-\s]*/"$_POST["name"], $name);

echo 
"Hi, " $name[0] . ". You are " $age " years old"
esto es un ejemplo. Otro seria:

Código PHP:
$age = (int)$_POST["age"];
$name htmlspecialchars(trim(addslashes($_POST["name"])));

echo 
"Hi, " $name[0] . ". You are " $age " years old"

Muchas gracias Bulter, y dime..esa especificacion debo hacer ara cada una de las variables de mi formulario que son :
Código:
    $rut = $_POST['rut'];
	$razonsocial  = $_POST['razonsocial'];
	$direccion1 = $_POST['direccion1'];
	$nombrecomercial = $_POST['nombrecomercial'];
	$giro = $_POST['giro'];
	$numero = $_POST['numero'];
	$depto = $_POST['depto'];
	$comuna = $_POST['comuna'];
	$ciudad = $_POST['ciudad'];
	$telefono = $_POST['telefono'];
	$web = $_POST['web'];
  #8 (permalink)  
Antiguo 08/05/2013, 09:58
Avatar de bulter  
Fecha de Ingreso: enero-2008
Mensajes: 137
Antigüedad: 16 años, 10 meses
Puntos: 20
Respuesta: Como Evitar SQL Injection

Si, para todo.
Lee te primero algo de RegExp, htmlspecialchars, variable types , no puedes ir asi sin leer , es decir lo tienes que entender, no que te lo haga otro. Tienes que saber cada variable que debe de contener/guardar y comprobar si el valor indicado es correcto.

Por ejemplo los telefonos deben de empezar por 6,7 o 9 y tener 9 numeros:

Código PHP:
preg_match("/^[6|7|9|][0-9]{8}$/"$_POST['telefono'], $outTel); 
La razon social creo que puede contener varios caracteres asi que:

Código PHP:
$razonsocial  htmlspecialchars(trim(addslashes($_POST['razonsocial']))); 
Numero ... bueno tiene que ser integer (supongo)
Código PHP:
$numero = (int)$_POST['numero']; 
Bueno el resto intenta averiguarlo tu. Pero te aconsejo que te leas algo...
  #9 (permalink)  
Antiguo 08/05/2013, 10:05
 
Fecha de Ingreso: abril-2013
Mensajes: 11
Antigüedad: 11 años, 6 meses
Puntos: 1
Respuesta: Como Evitar SQL Injection

Muchas gracias amigo..la ultima consulta y no te molesto mas.
mi formulario tiene dos paginas, en la primera se capturan los en datos con el formulario y los <imput form> y esta ne HTML
y en la segunda pagina declaro las variables e inserto los datos en la base.
con:
$sql="insert into dato2 (razonsocial, rut, direccion1, direccion2, nombrecomercial, giro)
$res=mysql_query($sql,$bd) or die (mysql_error());

En este parte de la inserción de datos tambien debo protegerme del ataque con algun script o con la proteccion en la declaracion de las variables es suficiente ??

saludos y mil gracias
  #10 (permalink)  
Antiguo 08/05/2013, 10:09
Avatar de bulter  
Fecha de Ingreso: enero-2008
Mensajes: 137
Antigüedad: 16 años, 10 meses
Puntos: 20
Respuesta: Como Evitar SQL Injection

Claro. No puedes poner:

Código PHP:
$sql="insert into dato2 (razonsocial, rut, direccion1, direccion2, nombrecomercial, giro) VALUES($_POST["razonsocial"], $_POST["rut"] ......)"
esto es suicida :D

Código PHP:
$razonsocial  htmlspecialchars(trim(addslashes($_POST['razonsocial'])));  

$sql="insert into dato2 (razonsocial, rut, direccion1, direccion2, nombrecomercial, giro) VALUES(" $razonsocial ", " $_POST["rut"] . " ......)"
  #11 (permalink)  
Antiguo 08/05/2013, 10:14
 
Fecha de Ingreso: abril-2013
Mensajes: 11
Antigüedad: 11 años, 6 meses
Puntos: 1
Respuesta: Como Evitar SQL Injection

Mil gracias amigazo..
eres un grande.
slds

Etiquetas: formulario, injection, mysql, 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 11:44.