RE: [PHP-ES] proteccion de codigo
[email protected] (juan carlos rebate) Sun, 14 Oct 2012 19:45:31 +0200
| Newsgroups | php.general.es |
|---|---|
| Message-ID | <[email protected]> |
el sistema de modulos es para un pequeño cms para mi antiguo instituto donde estudiaba para que ellos gestionen a los alumnos y que ellos puedan subir y entregar sus trabajos desde casa o publicar tareas extra el sistema de modulos es para aplicar actualizaciones y nuevas funciones sin tener que reemplazar todo algo asi como un joomla pero en pequeñito la razon de protegerlo es para que ellos no puedan editarlo pero me parece que es mucho lio el tener que probar todo ya que eso tiene fecha de entrega sin protegerlo puedo tenerlo en 3 semanas pero probaar compilar probar compilar........ eso me parece lento por eso buscaba alguna alternativa mas no obstante revisare todo y lo modificare para mi caso gracias Date: Sun, 14 Oct 2012 00:09:38 -0300 Subject: Re: [PHP-ES] proteccion de codigo From: [email protected] To: [email protected] CC: [email protected] 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.phphttp://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 > >