elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
26 Mayo 2012, 13:45  


Tema destacado: Recuperar cuenta de Google, GMail, Youtube

+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  Limpiar Variables de Formularios con PHP
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Limpiar Variables de Formularios con PHP  (Leído 1,659 veces)
FFFenix

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Limpiar Variables de Formularios con PHP
« en: 15 Agosto 2011, 06:35 »

Buenas Noches, queria saber que opinaban acerca de mi forma de limpiar las variables que entran por POST en una aplicacion web mia, Bueno sin mas les dejo el Codigo:

Adicional a eso, utilizo una Clase que encontre por ahi, InputFilter (http://www.phpclasses.org/package/2189-PHP-Filter-out-unwanted-PHP-javascript-HTML-tags-.html)
Código:
function clean($cleans){
$ifilter=new InputFilter();
return htmlentities($ifilter->process(str_ireplace(array('SCRIPT','FUNCTION','IFRAME','DOCUMENT.','GET /','/','\'','RETURN ','HTTP://','.PHP','.HTACCESS','MYSQL_','ALERT','$_POST','$_GET','$_COOKIE','WINDOW.','String.from','javascript:','ONLOAD','ONUNLOAD','ONERROR',"');",'\"',"/'",'\\','<?PHP','LOCATION.','GETURL(',' SRC=','.cookie','<META','<IMG','','DECLARE','VARCHAR','EXEC','HACK','','SELECT','FROM','WHERE','GRANT','CREATE','DATABASE','SHOW','USE','AND','DROP','LIKE','DELETE','INSERT','INTO','UPDATE','SET','USAGE','VALUES','ALTER','FLUSH','MODIFY','JOIN','"',"'",'XSS','UNION','<INPUT','<FORM','%s'),'',trim($cleans))),ENT_QUOTES,'UTF-8');}

Espero su opinion, Gracias desde ya!


En línea
Shell Root


Desconectado Desconectado

Mensajes: 2.456


Alex Jurado


Ver Perfil WWW
Re: Limpiar Variables de Formularios con PHP
« Respuesta #1 en: 15 Agosto 2011, 07:44 »

Depende de para que estés usando las variables. Mostrar datos, ejecutar consultas, etc...

Además al estar usando la función htmlentities impides la ejecución del código, ya que se convierten en entidades HTML. No se para qué realizas ese filtro para reemplazar palabras reservadas.


« Última modificación: 15 Agosto 2011, 07:50 por Shell Root » En línea

---
FFFenix

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Re: Limpiar Variables de Formularios con PHP
« Respuesta #2 en: 15 Agosto 2011, 09:02 »

La idea era armar una funcion que limpiara todas las interacciones con el usuario, es para usar en aplicaciones webs, desde login, insertar y modificar datos en una base de datos mysql. Para conectar a la base de Datos MySQL se una class PDO.

La idea de filtrar las palabras era como una especie de seguro extra creo, por si habia algun bug evitar que aprovechen a injectarlo de una forma mas sensilla, almenos reemplazando palabras de ese estilo yo creo que costaria un poco mas no?, En la Aplicacion seria no seria algo practico o que se deba usar las palabra que se reemplazan ahi de igual manera.

Que opinas al respecto? Servira como tengo armada esta funcion para impedir posibles ataques XSS e Injecciones?
En línea
Shell Root


Desconectado Desconectado

Mensajes: 2.456


Alex Jurado


Ver Perfil WWW
Re: Limpiar Variables de Formularios con PHP
« Respuesta #3 en: 15 Agosto 2011, 09:07 »

A ver, si le pones el htmlentities, no se ejecutará ninguna clase de código. Y sería mucho más fácil hacer una expresión regular que elimine todo lo que esté dentro de las etiquetas < y >, en lugar de poner todos los tag HTML.
En línea

---
FFFenix

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Re: Limpiar Variables de Formularios con PHP
« Respuesta #4 en: 15 Agosto 2011, 09:16 »

Gracias por responder tan rapido :P, Esta buena la idea de una Expresion Regular que borre todo lo que esta dentro de los < >, no se me habia ocurrido =P,
pero con respecto a las injecciones no me conviene poner esa especie de "seguro extra", de reemplazar frases especificas que son utilizadas para injecciones? como SELECT, WHERE, FROM ? o es algo que no serviria para nada?
En línea
Shell Root


Desconectado Desconectado

Mensajes: 2.456


Alex Jurado


Ver Perfil WWW
Re: Limpiar Variables de Formularios con PHP
« Respuesta #5 en: 15 Agosto 2011, 10:01 »

Pues a ver, depende del entorno en que lo estáis manejando. Es decir, supongamos que tengamos la siguiente query, y que podamos agregarle cualquier valor a la variable $_GET['id'],
Código
 SELECT id,nombre,apellido FROM usuario WHERE(id = '1'); -- 1 sería igual a la variable $_GET['id']

Entonces para poder inyectar código a nuestra query original, necesitamos de una comilla simple seguido de las sentencias, en caso de poner la comilla, se tomará como string.

CONCLUSIÓN: El parámetro que más importancia tiene para el filtro es la comilla, ya que es que permite la ejecución de la otra query en la query principal.
En línea

---
FFFenix

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Re: Limpiar Variables de Formularios con PHP
« Respuesta #6 en: 15 Agosto 2011, 10:11 »

Muchas Gracias, voy a ver de solucionar mejorar la funcion, cuando la mejoro la posteare denuevo a ver que dicen :P.
Una Consulta adicional quisiera hacer, seria posible vulnerar por ende este archivo por ejemplo? Una Parte del Codigo Fuente, el mismo agrega unos datos a la base de datos.

Código:
if(empty($_POST['nart']) or empty($_POST['rem'])){?><META HTTP-EQUIV="REFRESH"
CONTENT="2;URL=<?php echo $url;?>/funciones/add_stock.php"></head>
<body><div align="center" style="margin-top:15px;"><b>Hubo un Error, Dejo campos
 en blanco al agregar el Remito.</b><br /><br /></div>
</body></html><?php }else{if($_POST['ings'] or $_POST['outs'] or $_POST['losts']){
$art=clean($_POST['nart']);
$rem=clean($_POST['rem']);
$ings=clean($_POST['ings']);
$outs=clean($_POST['outs']);
$losts=clean($_POST['losts']);
if(!is_numeric($art) or !is_numeric($rem) or !is_numeric($ings) or !is_numeric($outs) or !is_numeric($losts)){?>
<META HTTP-EQUIV="REFRESH" CONTENT="2;URL=<?php echo $url;?>/funciones/add_stock.php"></head><body>
<div align="center" style="margin-top:15px;"><b>Hubo un Error, No ingreso correctamente el Numero de
 Remito/Cantidad de Ingresos, Egresos o Perdidas, Verifique que haya ingreso unicamente Numeros.</b></div></body></html>
<?php }else{$art=encaes($art);
$rem=encaes($rem);
$ings=encaes($ings);
$outs=encaes($outs);
$losts=encaes($losts);
$cmd=$pdo->prepare('SELECT COUNT(*) FROM stock WHERE remit=?');
$cmd->execute(array($rem));
if($cmd->fetchColumn()!=0){
?><META HTTP-EQUIV="REFRESH" CONTENT="2;URL=<?php echo $url;?>/funciones/add_stock.php"></head><body>
<div align="center" style="margin-top:15px;"><b>Hubo un Error, El N&deg;de Remito ya existe.</b><br /><br /></div>
</body></html><?php }else{$cmd=$pdo->prepare('INSERT INTO stock (art, remit, outs, ings, losts) VALUES (?, ?, ?, ?, ?);');
$cmd->execute(array($art,$rem,$outs,$ings,$losts));
$cmd=$pdo->prepare('SELECT COUNT(*) FROM rstock WHERE art=?');
$cmd->execute(array($art));
if($cmd->fetchColumn()!=0){
$cmd=$pdo->prepare('SELECT * FROM rstock WHERE art=? LIMIT 1;');
$cmd->execute(array($art));
$row=$cmd->fetch(PDO::FETCH_ASSOC);
$outs2=desaes($row['outs']);
$ings2=desaes($row['ings']);
$losts2=desaes($row['losts']);
$outs2=$outs2+desaes($outs);
$ings2=$ings2+desaes($ings);
$losts2=$losts2+desaes($losts);
$outs2=encaes($outs2);
$ings2=encaes($ings2);
$losts2=encaes($losts2);
$cmd=$pdo->prepare('UPDATE rstock SET outs=?, ings=?, losts=? where art=? LIMIT 1;');
$cmd->execute(array($outs2,$ings2,$losts2,$art));
}else{
$cmd=$pdo->prepare('INSERT INTO rstock (art, outs, ings, losts) VALUES (?, ?, ?, ?);');
$cmd->execute(array($art,$outs,$ings,$losts));}

Aclaraciones: encaes() = cifra variable en AES desaes() = descifra Variable en AES, la Funcion clean() es la que esta en el post de arriba.

Me encantaria que si alguien tiene tiempo y ganas de revisar el codigo se lo agradeceria, estoy empezando a querer programar aplicaciones con php y mysql y lo ideal es que no fueran vulnerables!

Gracias nuevamente, voy a aprovechar mañana para darme una vuelta por el foro ya que vi que hay varios post interesantes sobre como limpiar variables y varias funciones que algunos usuarios habian posteado y parece que funcionan bien.
« Última modificación: 15 Agosto 2011, 10:19 por FFFenix » En línea
Shell Root


Desconectado Desconectado

Mensajes: 2.456


Alex Jurado


Ver Perfil WWW
Re: Limpiar Variables de Formularios con PHP
« Respuesta #7 en: 16 Agosto 2011, 19:30 »

A ver, varias cosas antes de empezar con lo de la seguridad.

1. Deberías de identar el código para que sea más legible.
2. Para imprimir sólo una variable en PHP, la manera más simple es hacer, <?= $var; ?>
3. Consulta los if, else, elseif.
4. Para verificar y validar un número entero, podrías usar el método "casting", de la siguiente forma: (int)$var;
5. Sólo por curiosidad, para que conviertes el valor de las variables en AES?
En línea

---
FFFenix

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Re: Limpiar Variables de Formularios con PHP
« Respuesta #8 en: 17 Agosto 2011, 23:43 »

1. Coincido con vos jaja
2. No sabia eso!, no hay problemas de compatibilidad segun versiones o so o algo? y con respecto a la velocidad es mas rapido hacer un echo o llamar a una variable <?php= $var; ?> ?
3. No entendi que me quisiste decir u.U
4. Lo intente hacer pero por algun motivo cuando queria comprobar si eran solo numeros con el int no me lo tomaba y lo deje asi
5. La idea era para que no pudieran recuperar la info, la password de el AES es de 256 Caracteres y esta guardada en una variable en un file, el archivo esta bloqueado con el htaccess. Es mas que nada un gusto eso del AES, si en algun momento quisiera vender algo creo que decir esta cifrado en AES queda copado ajaj.
En línea
Shell Root


Desconectado Desconectado

Mensajes: 2.456


Alex Jurado


Ver Perfil WWW
Re: Limpiar Variables de Formularios con PHP
« Respuesta #9 en: 18 Agosto 2011, 01:30 »

3. Lo que quise decir es qué puedes hacer esto,
Código
if( /*Condición1*/ ){ [...] }elseif( /*Condición2*/ ){ [...] }elseif( /*Condición3*/ ){ [...] }else{ [...] }

en vez de esto,
Código
if( /*Condición1*/ ){ [...] }else{ if( /*Condición2*/ ){ [...] } }

5. Al convertir una variable en cualquier algoritmo no evita la inyección de código SQL. Esto lo digo, porque un amigo pensaba que al cifrar la variable id en base64 evitaba esta vulnerabilidad...
En línea

---
FFFenix

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Re: Limpiar Variables de Formularios con PHP
« Respuesta #10 en: 18 Agosto 2011, 01:43 »

3. Muy bueno!, la verdad no conocia eso, pense que era otra forma de llamar al else o algo asi las veces que lei "elseif" en algun codigo, voy a tener que hacer las modificaciones correspondientes entonces :).
5. Nono, no es para evitar las injecciones si no mas por un tema si roban la bases de datos almenos que no recuperen los datos, Ej. Nombre de las Personas, Datos especificos, o cualquier otra info que guarde esa DB.
En línea
Shell Root


Desconectado Desconectado

Mensajes: 2.456


Alex Jurado


Ver Perfil WWW
Re: Limpiar Variables de Formularios con PHP
« Respuesta #11 en: 18 Agosto 2011, 01:45 »

Pero si existe un sistema de cifrado, supongo que también para descifrarlo... Lo que trato de decir, es que no importa que sistema de cifrado uses, si la aplicación es vulnerable, cualquiera podrá obtener los datos. Ya qué, -como te lo dije antes-, si tienes un algoritmo para cifrar, obviamente deberás de tener el algoritmo para decifrarlo, así que no valdría de nada, solo consumes más tiempo para la devolución y consulta de datos.
« Última modificación: 18 Agosto 2011, 01:47 por Shell Root » En línea

---
Alex_bro


Desconectado Desconectado

Mensajes: 1.228



Ver Perfil
Re: Limpiar Variables de Formularios con PHP
« Respuesta #12 en: 18 Agosto 2011, 05:01 »

Dejo aqui un enlace a un post que publique hace mucho tiempo y quizás te ayude a filtrar todo mas facilmente.

http://foro.elhacker.net/php/mi_funcion_para_limpiar_variables-t244256.0.html

Saludos!
En línea

JustHost.com Suck´s
Alojamiento que recomiendo: (Enlace de afiliado)
Shell Root


Desconectado Desconectado

Mensajes: 2.456


Alex Jurado


Ver Perfil WWW
Re: Limpiar Variables de Formularios con PHP
« Respuesta #13 en: 18 Agosto 2011, 05:03 »

Pero como bien lo dijeron,

no le veo mucha funcionalidad ni practicidad, lo siento pero no es recomendale esa funcion.

1.- nada como un excelente casteo.
Código
intval();
2.- y esta mera para escapar caracteres feos   :(

Código
mysql_real_escape_string();
En línea

---
Alex_bro


Desconectado Desconectado

Mensajes: 1.228



Ver Perfil
Re: Limpiar Variables de Formularios con PHP
« Respuesta #14 en: 18 Agosto 2011, 11:55 »

Si pero con eso no consigues que en un campo, por ejemplo de un nombre, haya exclusivamente numeros y letras, y con un maximo de caracteres...

Para gustos colores, pero creo que usar una funcion, ya sea la que propongo u otra que cada cual cree, con ciertos parametros para filtrar distintos tipos de campos en nuestra aplicacion es lo mas practico.

Además si alguna de esas funciones de PHP se quedan obsoletas o se cambian de nombre en versiones posteriores, siempre será mas facil cambiarla en tu funcion que en todo el código. Es dificil que eso suceda, pero es un ejemplo.

A veces no se trata solo de escapar caracteres peligrosos... sino de filtrar lo que un campo pueda contener.

Un saludo :)
« Última modificación: 18 Agosto 2011, 11:57 por Alex_bro » En línea

JustHost.com Suck´s
Alojamiento que recomiendo: (Enlace de afiliado)
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Pasar variables por formulario sin variables globales¿?
PHP
hardkoo 11 2,512 Último mensaje 22 Noviembre 2006, 12:55
por chicuela66
Programacion Segura con PHP [Olvidate de limpiar tus variables] « 1 2 »
PHP
Azielito 15 7,864 Último mensaje 30 Junio 2008, 09:25
por Mamsaac
Pasar variables a otros formularios
Programación Visual Basic
askrator 13 1,036 Último mensaje 16 Julio 2007, 02:50
por Sancho.Mazorka
Mi funcion para limpiar variables
PHP
Alex_bro 2 1,670 Último mensaje 6 Febrero 2009, 19:00
por Alex_bro
recoger variables de formularios con php.
Desarrollo Web
mastertux 2 906 Último mensaje 24 Noviembre 2011, 15:33
por jamarchi
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines