Como había mencionado anteriormente, para desarrollar aplicaciones seguras, hay que conocer bien la herramienta o lenguaje con el que se trabaja. Espero que estos pequeños quiz intenten mostrar algunas de las fallas más comunes que cometen los que recién empiezan o ya desarrollan con PHP.
El código mostrado a continuación, ¿tiene alguna falla? ¿cuál?
if ( empty( $_GET['user'] ) && empty( $_POST['user'] ) )
die( 'Bad parameter' );
elseif ( ! empty( $_GET['user'] ) && intval( $_GET['user'] ) < 0 )
die( 'Bad parameter' );
elseif ( ! empty( $_POST['user'] ) && intval( $_POST['user'] ) < 0 )
die( 'Bad parameter' );
$sql = 'SELECT id, name, email
FROM users
WHERE id = ' . mysql_real_escape_string($_REQUEST['user']);
echo $sql;
?>
Como ya saben, el código mostrado sólo es referencial, pero vale comentar la forma correcta de implementar ese pedazo de código.
13 replies on “Más sobre validación de datos en PHP”
Sin observarlo mucho está muy mal indentado(aunque hay de gustos a gustos),demasiados if, y muchas validaciones que no son necesarias, los errores son muy genericos, permite inyeccion SQL, sería bueno sacar las variales con extract($_POST), y el get respectivamente
Yo lo pondría así :]
if(isset($_REQUEST['user'] && is_numeric($_REQUEST['user']))
{
$sql = 'SELECT id, name, email
FROM users
WHERE id = ' . mysql_real_escape_string($_REQUEST['user']);
echo $sql;
}
else
die('lol');
ImZyos!, como comenté, el código solamente es referencial y hay muchos
if
para confundir a la audiencia :-D.Si, el código es vulnerable a Sql Injection, pero como se "explotaría" eso?
¿Podría ser por ...?
if ( ( ! empty( $_GET['user'] ) && intval( $_GET['user'] )
tiene un bonito OR, o || y posteriormente un $_REQUEST en el SQL, es decir, podriamos pasar un $_GET['user'] = 'string' y un $_POST['user'] = 4
Así pasamos la validación de este IF, lo que no se es exactamente como explotar el error :-)
Vá más o menos por ahí, ahora he cambiado un poco el código para "complicar" un poco las cosas 🙂
Hola!
No he pensado mucho que ataques hacer pero ya que mysql_real_escape_string($_REQUEST['user']) no esta encerrado entre comillas, podríamos crear sentencias del tipo
SELECT id, name, email
FROM users
WHERE id = 5 OR 1=1
En este script no haría mucho daño en este caso, pero accederíamos a todos los usuarios en vez de a uno en concreto.
La cantidad de controles de a los arrays superglobales $_POST y $_GET podria evitarse metiendo el valor de "user" en una cookie, ya que el array $_REQUEST contiene los valores de $_GET, $_POST y $_COOKIE
Seguro que se pueden hacer ataques mucho mas malignos, bueno espero que mas o menos este encaminado.
Saludos
por favor despcribir qn si en que consiste php
ESTO NO SIRVE
necesito saber como hago con este problema: estoy en php pero necesito que cuando presione la tecla backspace no se me regrese a la anterior pagina necesito validar eso como hago e intentado de todas las formas posibles
necesito saber como hago con este problema: estoy en php pero necesito que cuando presione la tecla backspace no se me regrese a la anterior pagina necesito validar eso como hago e intentado de todas las formas posibles
denme respuesta lo mas rapido posible
<?php
$id_link = mysql_connect($hostname, $username, $password);
if (! $id_link) {
$message = "La base de datos de usuarios no esta disponible, intente más tarde";
}
else {
$num_cliente = $arr_request['num_clientes'];
$str_sql = "select cliente_nombres from clientespaf where num_clientes='$num_clientes'";
$result = mysql_db_query($dbname,$str_sql,$id_link);
$message = "";
if (! $result) {
$message = "Número de cliente no existe";
}
$number_of_rows = @mysql_num_rows($result);
if ($number_of_rows
cliente_nombres == "") {
$forma = "index08.php";
$message = "¡Número de cliente correcto!";
$boton = "Continuar";
}
else {
$forma = "pag03.php";
$message = "Bienvenido ".$record->cliente_nombres;
$boton = "Ir a mi pagina";
}
}
else {
$forma = "pag01.php";
$boton = "
alguien me puede explicar este codigoasi funciona
pero quiero que me identifique 3 campos si estab vacios que me mande a una pagina. no lo puedo hacer...
asi como esta identifica el numero de cliente y lo compara con el nombre si esta vacio entonces ve rl apagina 8 pero si encontro el campo lleno mandarlo a la pagina 3 asi es como funciona pero si deseo que entre por tercera ocacion que detecto un segundo campo lleno y me mande a una tercer pagina como le hago????
num_clientes es la variable la cual cual yo voy a dejar entrar al sitio esos numeros es el uno campo que tengo como dato o lleno en los campos
cliente_ nombres es la variable para nombre
tengo un problema para balidar me podrian ayudar profavor 🙂 nesesito balidar todos los campos el de id como es la yave primaria ya esta balidado pero no se como balidar lso demas para que no los inserte vacios en la base de datos aki el codigo
Forma insertar
Datos proximos a insertar
<?php
echo $_POST['id']."";
echo $_POST['nombre']."";
echo $_POST['apellidos']."";
echo $_POST['direccion']."";
echo $_POST['edad']."";
echo "";
require("config.php");
$con = @mysql_connect($HOST,$USER,$PASSWOR);
if ($con)
{
$BD= mysql_select_db("ips");
if ($BD)
{
$query= "insert into usuarios values(
".$_POST['id'].",
'".$_POST['nombre']."',
'".$_POST['apellidos']."',
'".$_POST['direccion']."',
".$_POST['edad']."
)";
echo $query;
$consulta = mysql_query($query, $con);
if ($consulta)
{
echo "Registro insertado";
}
else
{
echo " Error : ".mysql_errno()." Error: ".mysql_error();
}
}
}
?>
Regresar