Re: [PHP-ES] proteccion de codigo

[email protected] (Pablo Siciliano) Sun, 14 Oct 2012 00:09:38 -0300
Newsgroups php.general.es
Message-ID <CADQBSUMxfkLcHTdK=+71w5iz5sZkdnLZEwFkqDDadZEOUzEzsw@mail.gmail.com>
Hola Juan Carlos,

En principio, si hicieras includes y los compilaras es muy posible que no
aceptase modularización. Como te dije antes, no use nunca el compilador
bcompiler. Pero se me ocurre que podrias llegar a hacer algo con un patron
factory o strategy para tener tu sistema de modulos.
Habria que probarlo bien. Primero probar un escenario simple con bcompiler
y hacer que todo funcione el ejecutable. Así te vas sacando algunas dudas,
y empezas a conocer el entorno en general. Luego probar el sistema de
modulos en una web adonde tengas el entorno probado con un test simple ...
Y por ultimo mandarte a escribir un programa compilado con dos modulos
sencillos, un HolaMundoModule y un AdiosMundoModule.

No se para que estas planeando usar tu sistema de modulos. Pero te cuento
como haria uno para un uso como el que se me ocurre que podrias darle. En
mi ejemplo, voy a hacer un script, que lo que haga sea ejecutar modulos
cargados por un csv uno atras de otro. Voy a "programar" directo en el
mail, asi que te pido que por favor seas indulgente con la sintaxis y los
errores que pueda tener, seguramente vas a tener que trabajar un rato para
que corra, ademas de que por algun lado es posible que se me cuele la
sintaxis de objetos de algun otro lenguaje.




/**
*
* Supuestos: tengo un sub directorio conf en el mismo directorio adonde
corre mi programa, que contiene un archivo *llamado modules.csv. La
estructura que este archivo va a tener va a ser: path completo del archivo
con el modulo (En *linux un /path/modulo.so, en windows supongo que algo de
la pinta c:\modulos\modulo.dll, segundo campo separado por punto y coma el
nombre del modulo, el tercero el nombre de la clase y el  cuarto campo
separado por punto y coma otro separado por pipes, que contenga
variable1=valor1|variable2=valor2|...|variablen=valorn. De esta forma podes
jugar con usar el mismo modulo varias veces.
*
*/

/**
* Empieza Modularizable.class.php
*/
interface Modularizable
{
     function validate();
     function execute($args);
     function setArgs($pipeSeparatedHash);
}


/**
* Empieza Modulo.class.php
*/
abstract class Modulo
{

    protected $moduleName;
    protected $args;

    function __construct($moduleName,$args)
    {
        $this->moduleName=$moduleName;
        $this->args=$args;

    }


    function validate()
    {
         print "pase por la validacion y por default devuelvo siempre true";
         return TRUE;
    }

    function execute()
    {
       print "Hace el execute de ejemplo";
       print_r($this->args);
    }
}

/**
* Empieza ModuleConfig.class.php
*/
class ModuleConfig
{
   private $className;
   private $moduleName;
   private $moduleFile;
   private $args;

   function __construct($className,$moduleName,$moduleFile,$argsStr)
   {
        $this->className=$className;
        $this->moduleName=$moduleName;
        $this->moduleFile=$moduleFile;
        $arr=explode("|",$argsStr);
        for($i=0;$i<count($arr);$i++)
        {
               $arr2=explode("=",$arr[$i]);
               $this->args[$arr2[0]]=$arr2[1];
        }
   }

   private isLoaded()
   {
     return extension_loaded($this->moduleName);
   }

   private function load()
    {
       $ret=false;
       if(!extension_loaded($this->moduleName)
&& file_exists($this->moduleFile))$ret=dl($this->moduleFile);
       return $ret;
    }

   function getInstance()
   {
       $cargo=$this->load();
       if(!$this->isLoaded()) return null;
       $class=$this->className;
       return new $$class($this->moduleName,$this->args);
   }
}

/**
* empieza ModuleFactory.class.php
*/

class ModuleFactory
{

    private static $configFile=dirname(__FILE__)."/conf/modules.csv";
    private static $configs=array();




     private static function fillModulesFromConfig()
     {

                  $arch=fopen($configFile,"r");
                  if($arch!==FALSE)
                  {
                      while(($cfg=fgetcsv($arch,2048,";"))!==FALSE)
                      {
                                     $moduleFile=$cfg[0];
                                     $moduleName=$cfg[1];

                                     $className=$cfg[2];
                                     $argsStr=$cfg[4];

 ModuleFactory::load($moduleName,$moduleFile);
                                     $self::configs[]=new
Config($moduleFile,$moduleName,$className,$argsStr);
                      }
                  }

     }



     static function getModule($index)
     {
         if(count(self::configs)==0) ModuleFactory::fillModulesFromConfig();
         $cfg=self::configs[$index];
         return $cfg->getInstance();
     }

     static function executeModules()
     {
        for($i=0;$i<count(self::configs);$i++)
        {
            $module=self::getModule($i);
            $module->execute();
        }
     }

}

/**
* Empieza HolaMundoModule.class.php
*/
class HolaMundoModulo Extends Modulo
{

       function validate()
       {
          print "Valida Hola!!!";
          return true;
       }

       function execute()
       {
           print "Hola Mundo!!";
           print " Argumentos:";
           print_r($this->args);
       }

}

/**
* Empieza AdiosMundoModulo.class.php
*/
class AdiosMundoModulo extends Modulo
{

       function validate()
       {
          print "Valida Adios :( :( :(";
          return true;
       }

       function execute()
       {
           print "Adios Mundo :( :(";
           print " Argumentos:";
           print_r($this->args);
       }

}


Por último, deberías incluirte todos los archivos php (O so o dll, según
estes probando y sea el caso) y deberías hacer un

ModulesFactory::executeModules();

Eso te los ejecutaría en orden, con parámetros y clases repetidas. En caso
de que solo quisieras usarlo como un sencillo Factory, podrías escribirte
una rutina que se llame getInstance en ModulesFactory, que tome un nombre
de clase, recorra los configs hasta dar con uno que tenga el mismo que
estas buscando, lo instancie y lo devuelva.

Hay un par de cosas que podría un poco con la que tal vez tengas que
luchar, la primera que se me ocurre es como la forma en la que estoy
manejando el array estatico de configs. Por ahi tengas que escribir esa
clase como no abstracta, pero lo mejor es que no, al fin y al cabo es algo
similar a un Factory.

Te paso ademas unos links que revise para escribirlo, tal vez tambien te
sirvan de ayuda.

http://www.alessiomavica.com/es/2011/09/12/interface-abstract-class-php-castellano/
http://php.net/manual/en/function.dl.php
http://www.cristalab.com/tutoriales/crear-e-implementar-el-patron-de-diseno-singleton-en-php-c256l/

Saludos!
Pablo.

PD: La programacion orientada a objetos en php es una gran cosa :)


2012/10/13 juan carlos rebate <[email protected]>

>  algo asi hace real software con sus aplicaciones web permite cimpilar
> aplicaciones web en cgi y standalone que puede ser todo php o usar el
> lenguaje propio si es buena idea pablo pero si se compila la app no
> aceptaria complementos o addons en el caso de que yo desarrolle alguno o si?
>
> > Date: Sat, 13 Oct 2012 08:26:07 -0300
> > From: [email protected]
> > To: [email protected]
> > CC: [email protected]
> > Subject: Re: [PHP-ES] proteccion de codigo
>
> >
> > Hola!
> >
> > Que tal el compilador bcompiler?
> >
> > http://pecl.php.net/package/bcompiler
> >
> > Nunca lo use, pero es un proyecto que esta hace años, es parte de PECL,
> es
> > gratuito ... Y según las especificaciones debería funcionar para php 4 o
> > superior.
> >
> > Saludos!
> >
> > 2012/10/11 juan carlos rebate <[email protected]>
> >
> > >
> > > hola no se si es aqui donde me tengo que dirigir ya que en los foros
> como
> > > forosdelweb no me responden el caso es el siguiente uso php 5.3 y me
> han
> > > pedido desarrollar una aplicacion tipo cms de gestion escolar se
> tratara de
> > > software comercial el instituto para el que va dirigido el software
> esta de
> > > acuerdo en serlo pero no quiero entregarlo sin proteger el codigo por
> la
> > > web solo encuentro como proteger el codigo con javascript pero eso no
> tiene
> > > sentido porque el codigo que se veria seria html generado lo que yo
> quiero
> > > es ocultar o proteger el codigo no puedo usar incuve ya que necesito
> > > tenerlo instalado en el servidor tampoco puedo usar zend guard porque
> solo
> > > funciona con php 5.2 ademas de que es demasiado caro he probado con
> varios
> > > ofuscadores pero todos ellos producen errores en el funncionamiento del
> > > sistema ¿habria otro medio de proteger el codigo? quiza creando un
> binario
> > > con apache php y mi sistema? se que se puede hacer ya que otras
> compañias
> > > ofrecen editores que lo permiten gracias de ante mano por la ayuda
> > >
>