Metodologia para optimizar codigo

Buenas, como veo que os gustan los códigos de mi compadre, yo voy aportar algo que llevo usando durante algún tiempo cuando quiero generalizar y agilizar el código de mis encargos web.

Quizá algunos no estén de acuerdo con esta metodología, pero es lo que es, una metodología. Como las lentejas, o las tomas o las dejas.

Usado para optimizar secciones
Este código usa las variables $_GET para llamar al fichero *.php para incluirlos con el include.

PHP:
  1. //Carpeta donde estan las secciones!
  2. $path = "secciones";
  3. $subsec_path = $path."/sub"//carpetas de subsecciones
  4. if(isset($_GET['seccion']) && isset($_GET['subseccion']))
  5. {
  6. @include $subsec_path."/".$_GET['subseccion'].".php";
  7. }
  8. else if(isset($_GET['seccion']))
  9. {
  10. if(file_exist($path."/".$_GET['seccion'].".php"))
  11. {
  12. @include($path."/".$_GET['seccion'].".php");
  13.  
  14. }else @include($path."/error/errorseccion.php");
  15.  
  16. }else @include($path."benvenida.php");

Codigo Rectificado ( Necesidad de mejora expuesta por Alex )

PHP:
  1. //Carpeta donde estan las secciones!
  2. $path = "secciones";
  3. $subsec_path = $path."/sub"; //carpetas de subsecciones
  4.  
  5. if(isset($_GET['seccion']) && isset($_GET['subseccion']))
  6. {
  7. if(eregi('\.\.\/',$_GET['seccion']) || eregi('\.\.\/',$_GET['subseccion'])) die ('No permitido');
  8. else
  9. {
  10. @include $subsec_path."/".$_GET['subseccion'].".php";
  11. }
  12. }
  13. else if(isset($_GET['seccion']))
  14. {
  15. if(eregi('\.\.\/',$_GET['seccion'])) die ('No permitido');
  16. else
  17. {
  18. if(file_exist($path."/".$_GET['seccion'].".php"))
  19. {
  20. include($path."/".$_GET['seccion'].".php");
  21. }else include($path."/error/errorseccion.php");
  22. }
  23. }else include($path."benvenida.php");

-- No pongo una comprobación de las secciones permitidas, porque solo estan permitidas las que hay en la carpeta, logico.

Para hacer que funcione solo tendríamos que usar enlaces como:

http://www.vicao2k3.net/index.php?seccion=galeria

http://www.vicao2k3.net/index.php?seccion=links

http://www.vicao2k3.net/index.php?seccion=galeria&subseccion=favoritos

Así de sencillo. Lo único que obliga tener por cada sección un fichero diferente.
Pero lo tienes todo dividido así no tienes que buscar el código especifico en el index.php, solo dirigirse al fichero con nombre de la sección y listo. Además, hace que el servidor tenga que enviar código menos pesado que si lo hiciéramos todo con condicionales.

Yo lo he usado profesionalmente en 3 sitios webs, con un añadido de SQL, y funcionan perfectamente. Y en el mantenimiento, personalmente me han ido bastante bien. Este código siempre es mejorable.

He aquí un consejillo.

PHP      2 Agosto, 2007      3144 lecturas      17 comentarios

  1. ewiggin

    Se me olvidaba, tambien puede usarse en orientacion a objetos, envez de ficheros.

    Si quereis un ejemplo puedo hacerlo. — El editor de wp es una mi… los amp; amp; son && del condicional.

    Ya me direis que opinais.

    Salut.



  2. Javier

    No me deja comentar, supongo que es porque estoy poniendo codigo php dentro del comentario. Hay que poner algun tipo de tag para diferenciarlo ??



  3. ewiggin

    Pues no lo se, prueba con [php][/php] es el que se usa en el editor.



  4. gafeman

    @ewiggin: creo que con [php][/php] no se soluciona el problema

    vaya tendremos que hacer una lista de los caracteres conflictivos


    @javier: la verdad es que no tengo ni idea, muchas veces hemos puesto cachos de codigo y no habido problemas :(



  5. Javier

    Si quereis os envio el codigo que he puesto para que lo testeis, haber que caracter es el conflictivo.


    Ha por cierto, el error que me sale es “Lo siento, los comentarios de este artículo están cerrados.” y debajo pone “undefined”



  6. Alex

    A mi ese error me sale a veces. En una ocasión lo enmendé quitando algunos enlaces, y en otra quitando el caracter (menor-que).


    Respecto al código sugerido, es un pequeño agujero de seguridad. No demasiado grave, pero lo es. Ofreces al usuario utilizar la función include sobre CUALQUIER archivo de tu ordenador. Esta metodología no es muy recomendable. Al menos se debería tener un cierto control sobre las secciones admitidas.

    Además haces sólo testeo de existencia de archivo en uno de los dos casos.


    Te propongo el siguiente código:


    //Carpeta donde estan las secciones!

    $path = “secciones”;

    $subsec_path = $path.”/sub”; //carpetas de subsecciones

    $permitidos = array(

    ‘galeria’,

    ‘links’,

    ‘info’

    );


    $sec = $_GET['seccion'];

    $ssec = $_GET['subseccion'];


    if(!empty($sec) AND !empty($ssec))

    $inc = $subsec_path.”/”.$ssec.”.php”;

    elseif(!empty($_GET['seccion']))

    $inc = $path.”/”.$sec.”.php”;

    else

    $inc = $path.”benvenida.php”; // no se ha determinado una ruta


    if(!in_array($sec,$permitidos))

    $inc = $path.”benvenida.php”; // no esta permitida la entrada


    if(file_exist($inc))

    {

    @include $inc;

    }

    else

    {

    @include $path.”/error/errorseccion.php”;

    }


    De todas formas aún hay algunas inconcluencias.



  7. ewiggin

    Vaya, no lo habia pensado.

    Pero para aprobecharlo, tienes que saber que se esta usando esta metodologia en concreto, y clabar los nombres de los ficheros que no necesariamente tienen que tener nombres, tambien pueden ser numeros o una mezcla.


    Ya dije que el codigo era mejorable.



  8. Alex

    Evidentemente, tienes que averiguar que se está usando est metodología (aúnque acceder a una URL con la forma ?seccion=talycual ya nos da pistas).


    Los archivos a los que puede acceder, y que son peligrosos, no son precisamente los del directorio secciones, sinó que puede utilizar ../ para retroceder en el arbol de directorios, hasta alcanzar ciertos archivos.


    Estas metodologías suelen parecer surrealistas y muy complicadas, pero lo mismo parece con la inyección SQL, y es una de las mayores amenazas de los programas en PHP, y existen miles de programas que intentan explotar estos fallos de seguridad de forma automática y en ocasiones muy efectiva.


    No hay que preocuparse mucho, estas amenazas no suelen implicar mucha problemática, y son poco probables, pero por si las moscas, mejor cerrar todas las puertas.


    De todas formas es una interesante metodología, puede ser de utilidad a programadores que estén iniciándose, o que tengan mucha prisa.



  9. ewiggin

    La intencion del post es enseñar cómo ahorrarse tiempo y esfuerzo… los que estamos cansados de escribir y escribir codigo acabamos haciendo inventos de estos, se evoluciona ( pienso yo ).

    Lo que e escrito es el motor. Despues que le quieras poner Frenos, Airbags, ruedas, volante, chasis, carroceria y lo quieras llamar coche, eso ya cada cual.

    Buscando los 3 pies al gato todo codigo es inseguro.

    La proxima vez, pondré todos los metodos de seguridad antes del codigo que quiera mostrar. U_u

    Aunque ha servido para sacar el tema de las vulnerabilidades.

    bye



  10. Alex

    Jeje, tranquilo, no te sientas atacado.


    Entiende que mi intención era completar información, y aportar mi ayuda. En ningún momento pretendo descalificarte, al contrario alavo la tarea que hacéis.


    En lo de que todo código es inseguro tienes toda la razón. Es una putada pero siempre se está expuesto. Lo que hay que hacer es no comportarse de forma paranoica…. igualmente estamos expuestos a que nos caiga una maceta de un balcón… y no pasa muy amenudo.


    Venga, mucha suerte. Saludos.



  11. Chicoblog

    Interesante, se ve bastante interesante :o


    lo usare ma de una vez :P


    jejejeje xDDD


    Saludos y gracias!



  12. ewiggin

    He editado el post con una rectificación del codigo para mejorar un poco la seguridad de este, para que los mas novatos no tropiecen…


    Creo que aun se puede simplificar mas y mejorar el rendimiento.. como usar requieres, comillas simples y usar alguna otra funcion que no sea el eregi. Pero me duele la cocorota y tengo sueño.


    Bona nit!



  13. Alex

    referente a la nota de

    # — No pongo una comprobación de las secciones permitidas, porque solo estan permitidas las que hay en la carpeta, logico.


    Creo que no entendiste la forma en que se puede retroceder en el árbol de carpetas.


    escribiendo esto: “carpeta/seccion/../../../script_privado.php” estamos accediendo al archivo script_privado situado en el directorio padre de “carpeta”, es decir, aúnque hemos comenzado avanzando dos directorios, después hemos retrocedido tres.


    De esta forma, si en la variable GET se intruduce el comndo /.. varias veces, nos podremos dirigir a cualquier archivo.


    Es un detalle a tener en cuenta.



  14. gafeman

    alex, parece que en la correccion hay un eregi que comprueba si hay algun ../

    creo que con esto ya es suficiente


    vaya me alegro que tenga repercusion en este tema, pero no tanto, ya que no contestan a mis noticias :(



  15. Alex

    Culpa Mia



  16. Chicoblog

    @GafeMan, Yo si :P


    Saludos ;)



  17. ewiggin

    @gafeman: Donde haya calité…


    Quizá saque tiempo y haga una demo de este codigo… mejorado y con sus prevenciones… para que veais lo que se ahorra.


    Aun me sigue doliendo la cabeza. :S









Additional comments powered by BackType