Más sobre validación de datos en PHP
Por: alex | 30 Octubre 2006 | Ver comentarios |
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?
<?php 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.


ImZyos!
31 de Octubre de 2006, 01:13:30 am
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
kesar
31 de Octubre de 2006, 03:26:09 am
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');
alex
31 de Octubre de 2006, 08:00:11 am
ImZyos!, como comenté, el código solamente es referencial y hay muchos
ifpara confundir a la audiencia :-D.Si, el código es vulnerable a Sql Injection, pero como se “explotaría” eso?
farlopex
31 de Octubre de 2006, 10:50:41 am
¿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
alex
31 de Octubre de 2006, 11:07:56 am
Vá más o menos por ahí, ahora he cambiado un poco el código para “complicar” un poco las cosas
swass
31 de Octubre de 2006, 01:03:45 pm
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
ANA MILENA
22 de Febrero de 2007, 02:25:33 pm
por favor despcribir qn si en que consiste php
GUASA
17 de Diciembre de 2007, 02:59:11 pm
ESTO NO SIRVE