elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  PHP (Moderador: #!drvy)
| | | |-+  crear enlaces seguros para las paginas php
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 3 4 Ir Abajo Respuesta Imprimir
Autor Tema: crear enlaces seguros para las paginas php  (Leído 11,360 veces)
gAb1


Desconectado Desconectado

Mensajes: 731


Ver Perfil
crear enlaces seguros para las paginas php
« en: 24 Septiembre 2014, 13:16 pm »

Hola, me gustaría saber cual es la manera mas segura de crear enlaces seguros para las paginas de mi sitio web.

Acaba de leer un pequeño tutorial donde aparece un codigo con el que se supone que no será facil hackear la web, pero es del año 2006 y tengo dudas por si ya no es tan seguro como lo era antes... Aqui esta el link: Safe Dynamic Includes

Tambien he visto otra manera: Safe Dynamic Includes, pero tampoco se si hay otras maneras mas seguras para crear los links de una pagina a otra.

Lo normal es las paginas suele ser

Código
  1. <a href="index.php?x=pagename">Link</a>

Pero al parecer cambiando la variable de sesion por otra, el link puede ser de otra manera:

Código
  1. $_GET['x']; -> $_SERVER['QUERY_STRING'];

Código
  1. <a href="index.php?pagename">Link</a>

¿Podriais confirmar que maneras son más seguras?

Gracias!


En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: crear enlaces seguros para las paginas php
« Respuesta #1 en: 24 Septiembre 2014, 19:30 pm »

yo uso "tablas de rutas"

es decir, una db que contenga 2 campos, "link" y "ruta", entonces al llamar, busco en la db si algún valor coincide con el recibido, si coincide, se hace un include con la ruta devuelta, eso te sirve incluso al grado que la pagina "producto" puede ser "pagina_de_fondo.php"


En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
MinusFour
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.529


I'm fourth.


Ver Perfil WWW
Re: crear enlaces seguros para las paginas php
« Respuesta #2 en: 24 Septiembre 2014, 19:45 pm »

¿Enlaces seguros? Las rutas son tan seguras como el código que ejecuta esa ruta en especifico. Es importante 'limpiar' todo input humano o te arriegas a un XSS, RFI o algo peor.
En línea

WHK
Moderador Global
***
Desconectado Desconectado

Mensajes: 6.605


Sin conocimiento no hay espíritu


Ver Perfil WWW
Re: crear enlaces seguros para las paginas php
« Respuesta #3 en: 24 Septiembre 2014, 20:07 pm »

Es facil... solo debes hacer un array con todas las posibles rutas y luego hacer la comparación con tu parámetro get, si existe la incluyes y si no existe das un 404, de esa manera te aseguras que solamente las rutas reales van a ser solicitadas y nada de cosas extrañas con rutas extrañas.

Por ejemplo:

Código
  1. <?php
  2.  
  3. if(in_array('includes/'.(string)$_GET['sección'].'.php', glob('includes/*.php')))
  4. include('includes/'.(string)$_GET['sección'].'.php');
  5. else
  6. include('includes/404.php');
  7.  

El cast (string) es para que no te de una excepción si te pasan arrays como parámetros.

También puedes aceptar directorios como lo hace wordpress cuando puedes poner un plugin como plugin.php o una carpeta llamada plugin y un index:

Código
  1. <?php
  2.  
  3. /* Es archivo */
  4. if(in_array('includes/'.$_GET['sección'].'.php', glob('includes/*.php')))
  5. include('includes/'.$_GET['sección'].'.php');
  6.  
  7. /* Es directorio */
  8. elseif(in_array('includes/'.$_GET['sección'].'/index.php', glob('includes/*/index.php')))
  9. include('includes/'.$_GET['sección'].'/index.php');
  10.  
  11. /* No existe */
  12. else
  13. include('includes/404.php');
  14.  

Ahora, si usas file_exists() o is_dir() tendrás que tener cuidado con los agujeros de tipo LFI o RFI, usar esas fuinciones para incluir archivos es muy mala práctica.

Según el blog de donde das en enlace ( http://www.jemjabella.co.uk/2006/safe-dynamic-includes/ ) dice que se debe hacer así:

Código
  1. if (strpos($_GET['x'], "/")) {
  2.      $dir = substr(str_replace('..', '', $_GET['x']), 0, strpos($_GET['x'], "/")) . "/";

Es una malisima práctica, muchos sistemas han sido programados de esa manera y estan llenos de agujeros de seguridad como unos mods y plugins para phpnuke, joomla y wordpress, por ejemplo esto sería vulnerable en base a ese código:

index.php?x=.htpasswd

a demás strpos() solo te indica la primera coincidencia, o sea que yo podría escribir algo//algo y bypasear el filtro, insertar carácteres nulos para cortar el include con un %00, etc etc.
« Última modificación: 24 Septiembre 2014, 20:16 pm por WHK » En línea

gAb1


Desconectado Desconectado

Mensajes: 731


Ver Perfil
Re: crear enlaces seguros para las paginas php
« Respuesta #4 en: 24 Septiembre 2014, 21:15 pm »

Gracias por las respuestas.

Eso de la tabla de rutas que comenta engel lex es interesante, es algo parecido a lo que comenta WHK, las "whitelist".

Pero en el ejemplo que has puesto, ¿asi tal cual sería seguro? sin hacer un preg_replace o str_replace? Y lo que dice MinusFour, lo de limpiar los input, tiene algo que ver tambien con sanitizar?

Me gustaría algo para no tener que mostrar la ruta, simplemente un nombre, poniendo la ruta en el script.

Por ejemplo si quiero llamar al archivo: register.php dentro de 'views/user/'

Y el link quedase: index.php?register ¿O esto no es seguro?

Pero no se si seria un problema para mostrar el contenido, lo que quiero hacer tambien y no se si hay otra manera mejor, es tener un layout con header (header+menu) y footer, y en medio haciendo un echo content(); para cargar el contenido de los views y no tener que cambiar nada del layout en todas las paginas de contenido. El index.php cargaría el layout y el layout cargaria los views.

¿Hay algún problema para hacer eso? Supongo que hara falta crear una funcion para cargar el contenido.

Gracias!
« Última modificación: 24 Septiembre 2014, 21:22 pm por gAb1 » En línea

WHK
Moderador Global
***
Desconectado Desconectado

Mensajes: 6.605


Sin conocimiento no hay espíritu


Ver Perfil WWW
Re: crear enlaces seguros para las paginas php
« Respuesta #5 en: 24 Septiembre 2014, 22:24 pm »

Pero en el ejemplo que has puesto, ¿asi tal cual sería seguro? sin hacer un preg_replace o str_replace? Y lo que dice MinusFour, lo de limpiar los input, tiene algo que ver tambien con sanitizar?

Así es, es un método muy seguro, no te tienes que estar preocupando de tener que modificar tu código o base de datos cada ves que agregas secciones nuevas porque se verifican automáticamente en cada carga.

no necesitas un replace ni un limpiado de rutas ni nada de eso, es como si estuvieras intentando tapar el sol con un dedo, son técnicas que no siempre funcionan y son por decirlo muy absurdas, generalmente se ven en códigos hechos por menores de edad o personas que recién están aprendiendo a programar. Es similar a lo que antiguamente muchos hacían... ponerle safe mode en on para supuestamente proteger los servidores, muchos lo hacían pero al final no servía de mucho.

Lo de limpiar inputs es una pesima práctica, es como tratar de enumerar todas las posibles maneras que existen de como robar una casa, siempre habrá alguien que encuentre una manera nueva de entrar, en ves de eso haz una casa normal con seguros en las puertas y listo.

Por lo general debido a personas que piensan que limpiando inputs van a solucionar los problemas de seguridad es porque hoy en día hay tantos sitios expuestos a vulnerabilidades. Puede servir para intentar prevenir algunos tipos de ataques basicos pero jamas para detener todo lo que existe, en este caso limpiar inputs para prevenir el lfi o el rfi es un tema demasiado extenso y complejo si no quieres usar listas blancas, ya existen muchos sistemas que llevan años intentando solucionar este problema en base a filtros tales como phpnuke y algunos sistemas en .NET, por esocorta por lo sano y haz una lista blanca, es rápido y ultra seguro, todos los inputs que no contengan una url real serán rechazadas aunque sean rutas validas, es lo mas sano.
« Última modificación: 24 Septiembre 2014, 22:29 pm por WHK » En línea

MinusFour
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.529


I'm fourth.


Ver Perfil WWW
Re: crear enlaces seguros para las paginas php
« Respuesta #6 en: 24 Septiembre 2014, 23:01 pm »

Te estas llendo por las ramas WHK.

Filtrar texto si puede ser una mala práctica, pero cuando yo dije 'limpiar' (y lo puse entre comillas por una buena razón, porque no es exactamente limpiar) no me estaba refiriendo a filtrar el texto (que esto bien puede ser una mala forma de 'limpiar' input). Al decir yo limpiar, me estoy refiriendo a someter el input a un proceso que no permita una anomalía en la ejecución del código. Y 'limpiar' si que es una buena práctica.

Tampoco tienes que generalizar, filtrar texto se sigue haciendo. No como medida de seguridad pero si se sigue usando para los inputs.
En línea

gAb1


Desconectado Desconectado

Mensajes: 731


Ver Perfil
Re: crear enlaces seguros para las paginas php
« Respuesta #7 en: 25 Septiembre 2014, 00:14 am »

Gracias, acaba de armar algo y parece funcionar correcto, ¿veis algo mal? ¿es seguro?

index.php
Código
  1. <?php
  2.  
  3. include_once 'themes/default/views/layouts/main.php';
  4.  
  5. $whitelist_home = array("home");
  6. $whitelist_site = array("site/login", "site/logout", "site/contact", "site/about");
  7. $whitelist_user = array("user/register", "user/referral", "user/friend", "user/register_success");
  8.  
  9. if(in_array($_SERVER['QUERY_STRING'], $whitelist_home)) {
  10. if(in_array('views/'.(string)$_SERVER['QUERY_STRING'].'.php', glob('views/*.php'))) {
  11. $home = include('views/'.(string)$_SERVER['QUERY_STRING'].'.php');
  12. } else include('views/404.php');
  13. } elseif(in_array($_SERVER['QUERY_STRING'], $whitelist_site)) {
  14. if(in_array('views/'.(string)$_SERVER['QUERY_STRING'].'.php', glob('views/site/*.php'))) {
  15. $content = include('views/'.(string)$_SERVER['QUERY_STRING'].'.php');
  16. } else include('views/404.php');
  17. } elseif(in_array($_SERVER['QUERY_STRING'], $whitelist_user)) {
  18. if(in_array('views/'.(string)$_SERVER['QUERY_STRING'].'.php', glob('views/user/*.php'))) {
  19. $content = include('views/'.(string)$_SERVER['QUERY_STRING'].'.php');
  20. } else include('views/404.php');
  21. }
  22.  
  23. if(!$_SERVER['QUERY_STRING']) {
  24. echo $home = include('views/home.php'); // Esta es la pagina que se muestra por defecto
  25. }
  26.  
  27. if($_SERVER['QUERY_STRING'] == "home") {
  28. echo $home;
  29. }elseif(in_array($_SERVER['QUERY_STRING'], $whitelist_site)) {
  30. echo $content;
  31. }elseif(in_array($_SERVER['QUERY_STRING'], $whitelist_user)) {
  32. echo $content;
  33.  
  34. ?>

¿Hay algún problema si utilizo ese include_once (lo que uso actualmente para incluir paginas como functions.php) sin ningún if ni nada para mostrar una pagina (que es la base de la web) en el index.php?

Por alguna misteriosa razón justo despues del texto de home.php se añade un 1 sin espacio... ¿Que esta imprimiendo ese 1?

Aparte de que ese script de echos hay que mejorarlo, tiene que ir en el archivo main.php y cuando los he puesto han empezado los errores de variable no definida. Todo son problemas :)

Gracias!
« Última modificación: 25 Septiembre 2014, 03:26 am por gAb1 » En línea

MinusFour
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.529


I'm fourth.


Ver Perfil WWW
Re: crear enlaces seguros para las paginas php
« Respuesta #8 en: 25 Septiembre 2014, 05:19 am »

Include devuelve 1 si la la inclusión es exitosa, si le haces echo a un include exitosa, este imprime 1. A menos que dentro de tus includes tengas un return, en ese caso el echo toma el valor del return.

El código de WHK está bien para validar todos los archivos de las carpetas. Si vas a trabajar con solo algunos archivos creo que es mejor si tienes una lista para tus includes.

e.g.

Código
  1. <?php
  2.  
  3. $views = 'views/';
  4. $site = $views . 'site/';
  5. $user = $views . 'user/';
  6.  
  7. $includes = array(
  8. 'home' => $views . 'home.php',
  9. 'site/login' => $site . 'login.php',
  10. 'site/logout' => $site . 'logout.php',
  11. 'site/contact' => $site . 'contact.php',
  12. 'site/about' => $site . 'about.php',
  13. 'user/register' => $user . 'register.php',
  14. 'user/referral' => $user . 'referral.php',
  15. 'user/friend' => $user. 'friend.php',
  16. 'user/register_success' => $user . 'register_success.php'
  17. );
  18.  
  19. if(array_key_exists($_SERVER['QUERY_STRING'], $includes)){
  20. include($includes[$_SERVER['QUERY_STRING']]);
  21. }
  22. ?>
En línea

gAb1


Desconectado Desconectado

Mensajes: 731


Ver Perfil
Re: crear enlaces seguros para las paginas php
« Respuesta #9 en: 25 Septiembre 2014, 12:47 pm »

Necesito saber como darle un valor por defecto a la variable server, si lo hago asi no lee ningun input y siempre se muestra home...
index.php
Código
  1. <?php
  2.  
  3. include_once 'themes/default/views/layouts/main.php';
  4.  
  5. $views = 'views/';
  6. $site = $views . 'site/';
  7. $user = $views . 'user/';
  8.  
  9. $_SERVER['QUERY_STRING'] = 'home'; // Alguna otra manera?
  10.  
  11. $includes = array(
  12. 'home' => $views . 'home.php',
  13. 'site/login' => $site . 'login.php',
  14. 'site/logout' => $site . 'logout.php',
  15. 'site/contact' => $site . 'contact.php',
  16. 'site/about' => $site . 'about.php.php',
  17. 'user/register' => $user . 'register.php',
  18. 'user/referral' => $user . 'referral.php',
  19. 'user/friend' => $user. 'friend.php',
  20. 'user/register_success' => $user . 'register_success.php'
  21. );
  22.  
  23. if(array_key_exists($_SERVER['QUERY_STRING'], $includes)) {
  24. $content = include($includes[$_SERVER['QUERY_STRING']]);
  25. return true;
  26. } else include('views/404.php');
  27.  
  28. // Esto va en themes/default/views/layouts/main.php
  29. /*
  30. if(array_key_exists($_SERVER['QUERY_STRING'], $includes)) {
  31. echo $content;
  32. }else print_r(error_get_last());
  33. */
  34. ?>

Ahora mismo, sin ningun echo $content se muestra igualmente el include, ¿por que?
¿Como hago para que no se muestre ningún include si no hay un echo?

Gracias.

Edito: Y a todo esto... si necesito hacer inputs en esas paginas, por ejemplo, antes era: login.php?error=1 y ahora como seria? porque ?site/login&error=1 no funciona
« Última modificación: 25 Septiembre 2014, 15:28 pm por gAb1 » En línea

Páginas: [1] 2 3 4 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
¿Editores en linux para crear paginas web ?
GNU/Linux
Weeken 8 5,404 Último mensaje 24 Noviembre 2012, 01:39 am
por oPen syLar
crear paginas de inicio para hotspot Antamedia
Software
Bleach@lex 0 984 Último mensaje 11 Noviembre 2015, 03:50 am
por Bleach@lex
Un problema para empleados y usuarios, los dichosos ‘seguros’ de MediaMarkt
Noticias
wolfbcn 0 1,504 Último mensaje 2 Diciembre 2017, 14:06 pm
por wolfbcn
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines