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


 


  Mostrar Mensajes
Páginas: [1] 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ... 298
1  Programación / Desarrollo Web / Re: ¿Que me recomendais aprender antes? en: Ayer a las 23:31
Depende que es lo que quieras hacer o a que te quieras dedicar, si quieres ganar dinero entonces vas en buen camino, aprende lo que te dijeron sin desviarte a ningún otro lado, al final deberás aprender también un poco de oracle para manejar las bases de datos.

Dejame darte un consejo de un viejo programador: Si quieres programar por hobby y quieres un lenguaje potente y flexible para toda la vida entonces aprende python + django o ruby on rails o nodejs + express + jade, angular, less, boilerplate, bootstrap, jquery y mongodb.

Ahora, te recomiendo darle un vistazo a boilerplate, bootstrap (siempre usa la ultima version), fonts awesome (aprendelo por separado de bhootstrap), jquery 2.x (olvidate del 1.x), aprende un poco de photoshop, te va a servir mas de lo que piensas, necesitarás hacer logos, presentaciones en diseño vectorizado, acostumbrate a no usar imagenes para los iconos, para eso está fonts awesome.

También te recomiendo olvidarte de internet explorer 8 e inferiores versiones, terminarás necesitando el doble de tiempo para estudiar y programar. Hoy las empresas estan dejando de usar ie6 ,7 y 8, nunca aprendas lenguajes que con el tiempo puedan quedar obsoletos como visual basic 6, hta, alejate de todo aquello que no sea estandarizado y de todo aquello que sea estandarizado por la misma empresa o entidad que lo mantiene y no te da mas alternativas tales como flash. También te recomiendo no acostumbrarte al dreamweaver, es mas, si puedes no lo uses nunca porque te mal acostumbra a hacer código desordenado y no funcional ni estandarizado, etc.

Si algún día quieres aprender php hazlo sin miedo, hay muchas empresas que buscan desarrollar en el, es un lenguaje muy rápido, muy flexible, tiene muchos pros, el unico inconveniente es que no es mas rápido en ejecución que otras competencias, pero salvo de eso no es un mal lenguaje, eso si que con java puedes ganar mas.

Citar
un amigo ingeniero informática me recomienda aprender bootstrap para la capa de presentación después java y por ultimo grails

Te recomiendo seguir el mismo orden o si no te vas a complicar mas de lo que crees, bootstrap es lo bastante independiente como para aprenderlo antes que cualquier lenguaje ejecutado en el servidor.

Después de aprender grails te recomiendo aprender a hacer aplicaicones para android, te puede dejar muy buen dinero y una entrada segura a las empresas como empleado, de hecho programas en java asi que la curva de aprendizaje será mínima.

Una recomendación, usa eclipse en ves de netbeans, aprende en el camino a usar repositorios, te recomiendo darle un vistazo a bitbucket y github para que ordenes tus proyectos.

Saludos.
2  Foros Generales / Dudas Generales / Re: (Solucionado) Me sale mucha publi en Safari en: Ayer a las 21:54
Es primera ves que ayudo a un pitufo :D
3  Foros Generales / Dudas Generales / Re: Me sale mucha publi en Safari en: 30 Septiembre 2014, 23:57
Te recomiendo avira, por lo menos en wndows es uno de los mejores, en mac nunca lo he usado pero tiene que ser igual de bueno y es gratis:

http://www.avira.com/es/free-antivirus-mac

PD: Nunca te has interesado por instalar Google Chrome? ese no te impide eliminar complementos ni te rapta el computador como safari. Yo cuando trabajaba con un imac usaba firefox y andaba de lujo sin problemas ni complementos extraños.
4  Sistemas Operativos / Windows / Re: (Consulta) Conseguir privilegios de admnistrador? en: 30 Septiembre 2014, 22:39
Todo depende del sistema operativo, pero de poder se puede. Usas Windows? que versión? xp, 7, vista, 8? dependiendo de la versión es el programa que se usa para ser administrador sin tener la contraseña (exploit para escalamiento de privilegios). Ahh también es importante saber si es de 32 o 64 bits.
5  Programación / PHP / Re: crear enlaces seguros para las paginas php en: 29 Septiembre 2014, 14:03
Citar
Sería más simple irse por lo que debería ser que estar evitando lo que no. Como se supone que debería de ser es

Permitir solo de la A a la Z mas - y _ no es irse por lo que debería ser, de hecho te contradices en parte ya que con ese filtro te estás saliendo de norma, que tal si una carpeta se llama por ejemplo admin.mensajes ? según tu modelo dejará de funcionar. Tanto en los sistemas Unix como Linux y Windows tienen diferentes estándares en cuanto a que carácter es permitido como nombre de carpeta y nombre de archivo, por lo cual si tu haces un desarrollo no estandarizado omitiendo caracteres que si están permitidos por el sistema entonces dejará de ser una aplicación escalable ya que otros desarrolladores o el mismo administrador del sistema no podrá utilizar el sistema de archivos común del mismo sistema operativo. Recuerda que un directorio o archivo puede incluir incluso caracteres como acentos, espacios en blanco, puntos, signos especiales, paréntesis, arrobas, etc.

Bajo este contexto mi modelo es el mas eficiente porque cumple con todos los estándares de posibles reales carpetas y archivos bajo una lista blanca como únicos permitidos y sin la necesidad de tener que modificar el código si agregas secciones nuevas, tampoco usa expresiones regulares, o sea, usa menos memoria, menos cpu, menos lineas de código, no es vulnerable, o sea tal como dijiste tu, irse por lo que debería ser en ves de estar evitando lo que no es, no se porque aun le dan tantas vueltas al tema buscando opciones menos inseguras, mas pesadas y con problemas de seguridad.
6  Programación / PHP / Re: crear enlaces seguros para las paginas php en: 25 Septiembre 2014, 23:48
Codeigniter es el framework mas robusto y liviano que existe, las paginas se ejecutan en 0.001 segundos aprox y no tienes que preocuparte por estas cosas.

De todas formas el proyecto es tuyo y tu sabes que haces con el.

Si no quieres usar "?" puedes pasar los parámetros así: index.php/parametros/test de todas formas codeigniter también hace eso para el seo y los permalinks y el codigo de ejemplo que te di tambien lo hace.

Código
  1. if(isset($_SERVER['PATH_INFO']))
  2. $rutaInfo = trim((string)$_SERVER['PATH_INFO'], '/');
  3.  
  4. elseif(isset($_SERVER['ORIG_PATH_INFO']))
  5. $rutaInfo = trim((string)$_SERVER['ORIG_PATH_INFO'], '/');

Después ocultas el index.php con un htaccess y no necesitas crear reglas raras via htaccess como lo hace wordpress o joomla. Te ahorras tener que tocar esos archivos cada ves que tengas secciones nuevas.
7  Programación / PHP / Re: crear enlaces seguros para las paginas php en: 25 Septiembre 2014, 20:01
    preg_match('/^([\w\/]+)=?(\w+)?&?/', $_SERVER['QUERY_STRING'], $matches);
     
    if(array_key_exists($matches[0], $includes)){

Talves ese código pueda ser vulnerable a un RE-DOS (denial of service in expression Regular), por ejemplo tienes una llamada redundante si te escribo esta url:

demo/index.php/////////////// ... //////////////?&======&=&=&=&&&&&&&&&&& ...

Tu expresión puede causar que retorne nulo o que la función arroje alugn tipo de excepción especialmente por el array_key_exists ya que $matches[0] no existiría y puedes provocar un agujero de tipo path disclosure.
8  Programación / PHP / Re: crear enlaces seguros para las paginas php en: 25 Septiembre 2014, 19:46
Has considerado usar codeigniter?, o sea, si tu duda era solamente hacer un include seguro ya sabes, la lista blanca funciona de lujo pero si vas a hacer un sistema completo en base a ese tipo de inclusiones y códigos redundantes mejor usa uno estandarizado como codeigniter el cual lleva muchos años en el mismo tema, no necesitas reinventar la rueda, puedes tomarlo y ver el código fuente para saber como lo hacen y reutilizar el mismo código.

Si quieres te puedo mostrar un trozo de código de mi framework que hice hace muchos años el cual funciona con includes muy similar al tuyo pero es un poco mas flexible, por ejemplo puedes llamar a
/modulo/submodulo/accion.html?parametros=
y se incluye el archivo correspondiente a cada módulo y submódulo, es mas, soporta multiples niveles, puedes llamar a 5 submodulos si quieres una dentro de otra carpeta y todo en base a una lista blanca para prevenir problemas de seguridad, dale un vistazo para que saques algunas ideas:

Código
  1. <?php
  2. /* CORE - FDC 4.5 - yan.uniko.102@gmail.com, 2009 */
  3. /* Verifica que el archivo no se visualize de forma directa */
  4. if($_SERVER['SCRIPT_FILENAME'] == __file__) exit;
  5.  
  6. $sistema = new sistema();
  7.  
  8. class sistema{
  9. var $navegador = null;
  10. var $modulosSeleccionables = null;
  11. var $contenidoHtml = '';
  12.  
  13. function __construct(){
  14. /* Carga las configuraciones iniciales */
  15. include(dirname(__file__).'/configuraciones.php');
  16. $this->conf = new configuraciones();
  17.  
  18. /* Verifica coherencias en las configuraciones */
  19. if(
  20. isset($this->conf->perfilamiento['habilitado']) and
  21. $this->conf->perfilamiento['habilitado']
  22. ){
  23.  
  24. /* La clase de usuario no funciona sin una base de datos activa */
  25. if(
  26. (!isset($this->conf->mysql['autoCargar'])) or
  27. (!$this->conf->mysql['autoCargar'])
  28. )
  29. return die('
  30. Imposible iniciar el sistema de perfilamiento sin iniciar
  31. una conecci&oacute;n por defecto a la base de datos.
  32. ');
  33. }
  34.  
  35. /* Previene el robo de la cookie de sesión vía XSS */
  36. $cookieSesion = session_get_cookie_params();
  37. session_set_cookie_params($cookieSesion['lifetime'], $cookieSesion['path'], $cookieSesion['domain'], $cookieSesion['secure'], true);
  38. unset($cookieSesion);
  39.  
  40. $this->cargarLibreria('error');
  41. $this->cargarLibreria('str');
  42. $this->cargarLibreria('cabeceras');
  43. $this->cargarLibreria('logs');
  44. $this->cargarLibreria('ids');
  45. $this->cargarLibreria('driver_obj');
  46.  
  47. $this->cabeceras->establecerTipo('text/html');
  48.  
  49. /* Carga la conexión MySQL por defecto */
  50. if(
  51. isset($this->conf->mysql['autoCargar']) and
  52. ($this->conf->mysql['autoCargar'])
  53. ){
  54. $this->cargarLibreria('mysql');
  55. if(!$this->mysql->conectar(
  56. $this->conf->mysql['host'],
  57. $this->conf->mysql['usuario']['nombre'],
  58. $this->conf->mysql['usuario']['clave'],
  59. $this->conf->mysql['baseDeDatos'],
  60. $this->conf->mysql['codificacion'],
  61. $this->conf->desfaceGMT['mysql']
  62. ))
  63. return die($this->mysql->error->ultimo('msg'));
  64. }
  65.  
  66. /* Realiza la autocarga de la sesión de usuario */
  67. if($this->conf->perfilamiento['habilitado']){
  68.  
  69. /* Carga la librería necesaria */
  70. $this->cargarLibreria('usuario');
  71.  
  72. /* Carga la sesión de usuario por defecto via sesión de cookie */
  73. $this->usuario->perfilarViaCookie();
  74.  
  75. /* Reinicia cualquier error de carga fallida */
  76. $this->usuario->error->reiniciar();
  77.  
  78. /* Guarda sesiones temporales solo para usuarios logueados para prevenir una
  79. sobrecarga durante un ataque de DDOS o ataque distribuido */
  80. if($this->usuario->perfilado)
  81. }
  82.  
  83. $this->detectaAgenteDeUsuario();
  84.  
  85. /* Carga las autocargas antes de cargar cualquier otra cosa (librerias
  86. adicionales, módulos, etc) */
  87. $this->establecerAutocargas('pre');
  88.  
  89. /* Verifica la integridad del contexto actual en tema de
  90. * seguridad e intrusión no concentida */
  91. $this->ids->iniciar();
  92.  
  93. $this->contenidoHtml = array(
  94. 'cabecera' => '',
  95. 'modulo' => array()
  96. );
  97.  
  98. /* Obtiene las configuraciones del archivo de configuraciones del template
  99. antes de llamar a los módulos */
  100. if($this->conf->template['habilitado']){
  101.  
  102. /* Existe el template? */
  103. if(!file_exists($this->conf->rutas['template']['local'].'index.php'))
  104. return die('El Template seleccionado no existe.');
  105.  
  106. /* El archivo de configuraciones existe? */
  107. if(!file_exists($this->conf->rutas['template']['local'].'config.php'))
  108. return die('La configuración del Template no existe.');
  109.  
  110. /* Obtiene las configuraciones del template */
  111. include($this->conf->rutas['template']['local'].'config.php');
  112. }
  113.  
  114. $this->cargaModulos();
  115.  
  116. $this->establecerAutocargas('pos');
  117.  
  118. /* Muestra el contenido final entre el módulo y el template */
  119.  
  120. /* Muestra la carga de todos los módulos en orden coorelativo */
  121. $this->contenidoHtml['modulo'] = implode('', $this->contenidoHtml['modulo']);
  122.  
  123. if($this->conf->template['habilitado'])
  124. include($this->conf->rutas['template']['local'].'index.php');
  125. else
  126. echo $this->contenidoHtml['modulo'];
  127.  
  128. /* Cierra la conexión MySQL */
  129. if(is_object($this->mysql))
  130. $this->mysql->cerrar();
  131.  
  132. /* Final de la ejecución */
  133. }
  134.  
  135. function detectaAgenteDeUsuario(){
  136.  
  137. /* Valores por defecto */
  138. $this->navegador = array(
  139. 'nombre' => '',
  140. 'version' => '',
  141. 'ie<=8' => false,
  142. 'soportaHTML5' => false /* ie >= 9 && * */
  143. );
  144.  
  145. /* Detecta el motor del agente de usuario */
  146. '#(?<navegador>'.join('|', array('msie', 'firefox', 'safari', 'webkit', 'opera', 'netscape', 'konqueror', 'gecko')).')[/ ]+(?<version>[0-9]+(?:\.[0-9]+)?)#',
  147. strtolower($_SERVER['HTTP_USER_AGENT']),
  148. $navegador
  149. );
  150.  
  151. if($navegador['navegador'][0]){
  152. $ieTrident = false;
  153. if(strtolower(trim($navegador['navegador'][0])) == 'msie'){
  154. if(count(explode('.', $navegador['version'][0])) > 1){
  155. $mVersion = explode('.', $navegador['version'][0]);
  156. if((int)$mVersion[0] < 9){ /* ie<=8 */
  157. $ieTrident = true;
  158. }
  159.  
  160. }
  161. }
  162. $this->navegador = array(
  163. 'nombre' => strtolower(trim($navegador['navegador'][0])),
  164. 'version' => trim($navegador['version'][0]),
  165. 'ie<=8' => $ieTrident, /* ie<=8 */
  166. 'soportaHTML5' => ($ieTrident ? false : true) /* ie>=9&&* */
  167. );
  168. unset($navegador, $ieTrident);
  169. }
  170. }
  171.  
  172. function cargarLibreria($namespace, $nuevo = false, $parametros = null){
  173. /* Incluye el archivo de la librería una sola ves para hacer uso de el las veces
  174. que sea necesario */
  175. include_once($this->conf->rutas['librerias']['local'].$namespace.'.php');
  176.  
  177. if($nuevo){
  178. $libreria = new $namespace($parametros);
  179.  
  180. if(!$libreria->sys)
  181. $libreria->sys = $this; /* Librería recursiva */
  182.  
  183. /* Libreria por defecto sin recursividad */
  184. if(
  185. ($namespace != 'error') and
  186. (!$libreria->error)
  187. )
  188. $libreria->error = $this->cargarLibreria('error', true);
  189.  
  190. /* Retorna la librería cargada */
  191. return $libreria;
  192.  
  193. }else{
  194. /* El objeto ya existe? */
  195. if(is_object($this->$namespace))
  196. return $this->$namespace;
  197.  
  198. $this->$namespace = new $namespace($parametros);
  199.  
  200. if(!$this->$namespace->sys)
  201. $this->$namespace->sys = $this; /* Librería recursiva */
  202.  
  203. /* Libreria por defecto sin recursividad */
  204. if(
  205. ($namespace != 'error') and
  206. (!$this->$namespace->error)
  207. )
  208. $this->$namespace->error = $this->cargarLibreria('error', true);
  209.  
  210. /* Retorna la librería cargada */
  211. return $this->$namespace;
  212. }
  213. }
  214.  
  215. function establecerAutocargas($prefijo){
  216. /* Procesa archivos */
  217. if($archivos = glob($this->conf->rutas['autocargas']['local'].$prefijo.'*.php'))
  218. foreach($archivos as $archivo)
  219. include_once($archivo);
  220. unset($archivos);
  221.  
  222. /* Procesa directorios */
  223. if($archivos = glob($this->conf->rutas['autocargas']['local'].$prefijo.'*/index.php'))
  224. foreach($archivos as $archivo)
  225. include_once($archivo);
  226. unset($archivos);
  227. }
  228.  
  229. function obtieneModulosSeleccionables($base = false){
  230. /* Crea la base de la búsqueda */
  231. if(!$base)
  232. $base = $this->conf->rutas['modulos']['local'];
  233.  
  234. $mods = array();
  235.  
  236. /* Va en busca de los módulos */
  237. foreach(glob($base.'*/index.php') as $file){
  238. $mod = explode('/', $file);
  239. if($mod = $mod[count($mod) - 2])
  240. $mods[] = $mod;
  241. unset($mod, $file);
  242. }
  243.  
  244. /* Hay módulos? */
  245. if(!$mods)
  246. return array();
  247.  
  248. /* Arreglo contenedor de la totalidad de las secciones a devolver */
  249. $totalMods = array();
  250.  
  251. /* Va en busca de los submódulos de forma recursiva */
  252. foreach($mods as $mod){
  253. $totalMods[] = $mod;
  254.  
  255. /* Tiene submódulos? */
  256. if(is_dir($base.$mod.'/submodulos')){
  257.  
  258. /* Va en busca de los submódulos */
  259. if($submods = array_filter($this->obtieneModulosSeleccionables($base.$mod.'/submodulos/'))){
  260.  
  261. /* Procesa cada submódulo */
  262. foreach($submods as $submod){
  263. $totalMods[] = $mod.'/'.$submod;
  264. unset($submod);
  265. }
  266. unset($submods);
  267. }
  268. }
  269. unset($mod);
  270. }
  271. unset($mods, $base);
  272.  
  273. /* Devuelve todas las secicones seleciconables del directorio en contexto */
  274. return (array)array_filter($totalMods);
  275. }
  276.  
  277. function cargaModulos(){
  278. /* Estructura de directorios :
  279.  
  280. Modules [dir]
  281. module-1
  282. index.php <- main
  283. assets
  284. style.css <- automatico
  285. print.css <- automatico
  286. script.js <- automatico
  287. images
  288. a.jpg
  289. b.jpg
  290. submodulos
  291. submodulo-1.1
  292. index.php <- main
  293. assets
  294. images
  295. submodulos
  296. submodulo-1.1.1
  297. submodulo-1.1.2
  298. submodulos
  299. submodulos
  300. submodulos
  301. ...
  302. submodulo-1.2
  303. ...
  304. module-2
  305. ...
  306. */
  307.  
  308. $rutaInfo = '';
  309.  
  310. /* Determina el módo en que se obtendrán los módulos */
  311. if(isset($_SERVER['PATH_INFO']))
  312. $rutaInfo = trim((string)$_SERVER['PATH_INFO'], '/');
  313.  
  314. elseif(isset($_SERVER['ORIG_PATH_INFO']))
  315. $rutaInfo = trim((string)$_SERVER['ORIG_PATH_INFO'], '/');
  316.  
  317. else
  318. $rutaInfo = trim((string)$this->conf->moduloPrincipal, '/');
  319.  
  320. /* Extirpa los nombres de archivos terminados en .html para dar información a la URL
  321. canonizada, por ejemplo: http://localhost/usuarios/resumen/juan-lobos.html?id=18 la ruta
  322. de información será: usuarios/resumen */
  323. if(substr(strtolower($rutaInfo), -5) == '.html')
  324. $rutaInfo = substr($rutaInfo, 0, strrpos($rutaInfo, '/'));
  325.  
  326. /* Crea un mapa con las posibles secciones para prevenir el LFI o el Path Traversal */
  327. if(!$this->modulosSeleccionables = $this->obtieneModulosSeleccionables())
  328. die('No hay secciones establecidas en el sistema para cargar');
  329.  
  330. /* Existe la ruta seleccionada? (Control derivado desde la solicitud del navegador) */
  331. if(!in_array($rutaInfo, $this->modulosSeleccionables))
  332. return $this->cargarModulo('estado', array('get' => array('id' => 404, 'msg' => 'La sección solicitada no existe')));
  333.  
  334. /* Transforma la ruta de información a objeto array ordenado */
  335. if(strpos($rutaInfo, '/') !== false)
  336. /* Ruta compuesta por submódulos */
  337. $rutaInfo = array_filter((array)explode('/', $rutaInfo));
  338. else
  339. /* Sin submódulos */
  340. $rutaInfo = array($rutaInfo);
  341.  
  342. /* Establece el contexto, por ejemplo principal/submodulo/submodulo/submodulo */
  343. $this->conf->modulo['contextoCompleto'] = implode('/', $rutaInfo);
  344.  
  345. /* Token verificador para prevenir que siga cargando los submódulos si un módulo retornó con la inclusión de un nuevo módulo. */
  346. $idModulo = 0;
  347. $relativo = array();
  348.  
  349. /* Procesa cada sección necesitada */
  350. foreach($rutaInfo as $modulo){
  351. if(count($this->conf->modulo['contextoHistorial']) > (int)$idModulo)
  352. break;
  353.  
  354. /* Contexto actual */
  355. $relativo[] = $modulo;
  356.  
  357. $this->cargarModulo(implode('/', $relativo));
  358.  
  359. $idModulo++;
  360. }
  361. }
  362.  
  363. function cargarModulo($rutaInfo, $variablesHTTP = null){
  364.  
  365. /* Existe la ruta seleccionada? (Control derivado desde un módulo o librería) */
  366. if(!in_array($rutaInfo, $this->modulosSeleccionables))
  367. return $this->cargarModulo('estado', array('get' => array('id' => 404, 'msg' => 'La sección solicitada no existe')));
  368.  
  369. /* Compone las variables via HTTP GET y POST */
  370. if($variablesHTTP){
  371. if(isset($variablesHTTP['get']))
  372. $_GET  = array_filter(array_merge($_GET, $variablesHTTP['get']));
  373.  
  374. if(isset($variablesHTTP['post']))
  375. $_POST = array_filter(array_merge($_POST, $variablesHTTP['post']));
  376.  
  377. unset($variablesHTTP);
  378. }
  379.  
  380. /* Limpia la ruta de información */
  381. $rutaInfo = trim(trim($rutaInfo), '/');
  382.  
  383. /* Compone la ruta real */
  384. $rutaReal = array(
  385. 'local' => $this->conf->rutas['modulos']['local'].str_replace('/', '/submodulos/', $rutaInfo).'/',
  386. 'remoto' => $this->conf->rutas['modulos']['enlace'].str_replace('/', '/submodulos/', $rutaInfo).'/',
  387. 'enlace' => $this->enlace($rutaInfo)
  388. );
  389.  
  390. /* Obtiene el identificador del módulo final */
  391. if(strpos($rutaInfo, '/') !== false){
  392. $idModulo = explode('/', $rutaInfo);
  393. $idModulo = $idModulo[count($idModulo) - 1];
  394. }else
  395. $idModulo = $rutaInfo;
  396.  
  397. /* Obtiene los datos del último módulo */
  398. $this->conf->modulo['actual'] = array(
  399. 'id' => $idModulo,
  400. 'rutaInfo' => $rutaInfo,
  401. 'titulo' => '', /* Se establecerá dentro del módulo de manera opcional */
  402. 'rutas' => $rutaReal
  403. );
  404.  
  405. /* Establece el historial de secciones llamadas (útil para crear menus de navegación) */
  406. $this->conf->modulo['historial'][] = $this->conf->modulo['actual'];
  407. $this->conf->modulo['contextoHistorial'][] = $this->conf->modulo['actual']['rutaInfo'];
  408.  
  409. /* Elimina todo contenido anterior al módulo */
  410. unset($b);
  411.  
  412. /* Inicia el capturado del contenido del módulo */
  413.  
  414. /* Incluye la sección */
  415. include_once($rutaReal['local'].'index.php');
  416.  
  417. /* Obtiene el contenodo del módulo */
  418. $this->contenidoHtml['modulo'][] = ob_get_contents();
  419.  
  420. /* Incluye dependencias de forma automática (evita tener que declararlas en cada sección) */
  421. if(file_exists($rutaReal['local'].'/assets/script.js'))
  422. $this->contenidoHtml['cabecera'] .=
  423. '<script type="text/javascript">'."\n".
  424. "/*\nIncluido automáticamente desde \n".$rutaReal['remoto']."assets/script.js\n*/\n\n".
  425. file_get_contents($rutaReal['local'].'assets/script.js')."\n".
  426. '</script>'."\n";
  427.  
  428. if(file_exists($rutaReal['local'].'/assets/style.css'))
  429. $this->contenidoHtml['cabecera'] .=
  430. '<style type="text/css" media="all">'."\n".
  431. "/*\nIncluido automáticamente desde \n".$rutaReal['remoto']."assets/style.css\n*/\n\n".
  432. file_get_contents($rutaReal['local'].'assets/style.css')."\n".
  433. '</style>'."\n";
  434.  
  435. if(file_exists($rutaReal['local'].'/assets/print.css'))
  436. $this->contenidoHtml['cabecera'] .=
  437. '<style type="text/css" media="print">'."\n".
  438. "/*\nIncluido automáticamente desde \n".$rutaReal['remoto']."assets/print.css\n*/\n\n".
  439. file_get_contents($rutaReal['local'].'assets/print.css')."\n".
  440. '</style>'."\n";
  441.  
  442. /* Actualiza los datos establecidos por el módulo */
  443. $this->conf->modulo['historial'][count($this->conf->modulo['historial']) - 1] = $this->conf->modulo['actual'];
  444. }
  445.  
  446. function enlace($rutaInfo = null, $parametros = null, $informacion = null){
  447. $ruta = $this->conf->rutas['base']['enlace'];
  448.  
  449. /* Si no hay ruta lo enlaza al directorio raiz */
  450. if($rutaInfo)
  451. $ruta .= trim($rutaInfo, '/').'/';
  452.  
  453. /* Archivo .html que se mostrará al final de la ruta del enlace */
  454. if($informacion)
  455. $ruta .= urlencode($this->str->toFriendlyUrl($informacion)).'.html';
  456.  
  457. /* Parámetros vía HTTP GET */
  458. if($parametros)
  459. $ruta .= '?'.$parametros;
  460.  
  461. return $ruta;
  462. }
  463.  
  464. function redireccionaEnlace($rutaInfo = null, $parametros = null, $informacion = null){
  465. return $this->cabeceras->redireccionaUrl($this->enlace($rutaInfo, $parametros, $informacion));
  466. }
  467. }
  468.  
9  Programación / PHP / Re: crear enlaces seguros para las paginas php en: 24 Septiembre 2014, 22:24
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.
10  Foros Generales / Noticias / Re: HP regalará 72 petabytes de almacenamiento a empresas en: 24 Septiembre 2014, 22:17
copión ¬¬
11  Programación / PHP / Re: crear enlaces seguros para las paginas php en: 24 Septiembre 2014, 20:07
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.
12  Foros Generales / Noticias / Re: HP regalará 72 petabytes de almacenamiento a empresas en: 24 Septiembre 2014, 19:51
tenés razón, es dedicado xd pero al final sale casi el mismo precio que un buen vps xd
13  Foros Generales / Noticias / Re: HP regalará 72 petabytes de almacenamiento a empresas en: 24 Septiembre 2014, 17:07
Citar
81,99 €* /mes + IVA

Procesador:    Intel Xeon E5-1620v2 4c/8t 3,7 GHz+/3,9 GHz+
RAM:    64 GB DDR3 ECC 1600MHz
Discos:    2x 2 TB SATA3
IP sin coste mensual*    256 IP
Tarjeta de red pública:    1x 1  Gbps
14  Seguridad Informática / Desafíos - Wargames / Re: El reto para hackers del fin del mundo - Cicada 3301 en: 24 Septiembre 2014, 14:28
Ese si está difícil :-/ es uno de los pocos wargames que valen la pena
Páginas: [1] 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ... 298
Powered by SMF 1.1.19 | SMF © 2006-2008, Simple Machines