<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Sergi Quiñonero &#187; Programación</title>
	<atom:link href="http://www.sergiquinonero.net/categoria/programacion/feed" rel="self" type="application/rss+xml" />
	<link>http://www.sergiquinonero.net</link>
	<description>Sergi Quiñonero Blog Page</description>
	<lastBuildDate>Sat, 20 Mar 2010 22:35:30 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Configurar PHPUnit en XAMPP</title>
		<link>http://www.sergiquinonero.net/configurar-phpunit-en-xampp.html</link>
		<comments>http://www.sergiquinonero.net/configurar-phpunit-en-xampp.html#comments</comments>
		<pubDate>Thu, 28 Jan 2010 11:17:36 +0000</pubDate>
		<dc:creator>Sergi</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[configuración]]></category>
		<category><![CDATA[phpunit]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[xampp]]></category>

		<guid isPermaLink="false">http://www.sergiquinonero.net/?p=86</guid>
		<description><![CDATA[Esta semana, en clase de programación, hemos estado viendo las bondades de contar con unit testing y TDD.
El problema nos surgió cuando quisimos ponerlo en práctica. Dado que trabajamos con Windows, hemos utilizando XAMPP para poder trabajar en un entorno de programación, pero al utilizar PHPUnit comenzaron los problemas. Así que iniciamos una búsqueda de [...]]]></description>
			<content:encoded><![CDATA[<p>Esta semana, en clase de programación, hemos estado viendo las bondades de contar con <strong>unit testing</strong> y <strong>TDD</strong>.</p>
<p>El problema nos surgió cuando quisimos ponerlo en práctica. Dado que trabajamos con Windows, hemos utilizando <strong>XAMPP </strong>para poder trabajar en un entorno de programación, pero al utilizar <strong>PHPUnit </strong>comenzaron los problemas. Así que iniciamos una búsqueda de cómo <strong>configurar PHPUnit en XAMPP</strong>.<span id="more-86"></span></p>
<p>Después de mucho buscar y buscar, encontramos una solución que espero que os sirva. Para este ejemplo hemos/vamos a utilizar:</p>
<ul>
<li>PHP 5.2.9</li>
<li>Xdebug 2.0.5</li>
<li>PHPUnit 3.4.9</li>
</ul>
<p><strong>Configurar PHPUnit en XAMPP</strong>:</p>
<ol>
<li>Descargar la librería DLL v.2.0.5 desde la página de <a title="página de descarga de XDebug" href="http://xdebug.org/download.php" target="_blank">XDebug </a>(en nuestro caso hemos utilizado la <a title="dll xdebug " href="http://xdebug.org/files/php_xdebug-2.0.5-5.2.dll">versión 5.2 VC6 32 bits</a>)</li>
<li>Renombrara (o eliminar) la anterior librería (php_xdebug.dll) ubicada en C:/xampp/php/ext/ y renombrar la que hemos descargado (renombrarla a php_xdebug.dll)</li>
<li>Abrir una ventana de comandos (Menú Inicio &gt; ejecutar &gt; cmd ) y lanzar
<ol>
<li>cd C:\xampp\php</li>
<li>pear upgrade pear</li>
<li>pear upgrade &#8211;alldeps phpunit/phpunit-3.4.9</li>
</ol>
</li>
</ol>
<p>y ya podéis ejecutar <strong>PHUnit </strong>en <strong>XAMPP </strong>sin marearos.</p>
<p>P.D.: Quiero dar las gracias a Javier F., Raul M y Mari Ángeles por la ayuda que me han brindado <img src='http://www.sergiquinonero.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<!-- AdSense Now! V1.83 -->
<!-- Post[count: 2] -->
<div class="adsense adsense-leadout" style="float:left;margin: 12px;"><script type="text/javascript"><!--
google_ad_client = "pub-3509193416949473";
/* Sergiquinonero.net */
google_ad_slot = "0327514928";
google_ad_width = 234;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>]]></content:encoded>
			<wfw:commentRss>http://www.sergiquinonero.net/configurar-phpunit-en-xampp.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Diferentes tipos de ataques en páginas y aplicaciones Web</title>
		<link>http://www.sergiquinonero.net/diferentes-tipos-de-ataques-en-paginas-y-aplicaciones-web.html</link>
		<comments>http://www.sergiquinonero.net/diferentes-tipos-de-ataques-en-paginas-y-aplicaciones-web.html#comments</comments>
		<pubDate>Fri, 22 Jan 2010 12:10:50 +0000</pubDate>
		<dc:creator>Sergi</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[CSRF]]></category>
		<category><![CDATA[HTML Inyection]]></category>
		<category><![CDATA[SQL Inyection]]></category>
		<category><![CDATA[XSS]]></category>

		<guid isPermaLink="false">http://www.sergiquinonero.net/?p=74</guid>
		<description><![CDATA[En el día a día de un programador Web, nos vienen a la cabeza el cómo mejorar nuestra aplicación. No siempre la mejora de una aplicación se basa en una mejora visual y/o de nuevas funcionalidades, sino de una mejora a nivel de seguridad.
Ante este gran dilema, la seguridad web, nos planteamos una serie de [...]]]></description>
			<content:encoded><![CDATA[<p>En el día a día de un programador Web, nos vienen a la cabeza el cómo mejorar nuestra aplicación. No siempre la mejora de una aplicación se basa en una mejora visual y/o de nuevas funcionalidades, sino de una mejora a nivel de seguridad.</p>
<p>Ante este gran dilema, la <strong>seguridad web</strong>, nos planteamos una serie de mecanismos que nos permitan hacer, de nuestra aplicación, un lugar mejor. Seguro que a la mayoría no nos gustaría ver un día, al entrar en nuestra aplicación Web, un &#8220;bonito&#8221; mensaje del tipo &#8220;This Web has been hacked by&#8230;&#8221;.  Hay <strong>diferentes tipos de ataques a una página Web</strong> y cada uno de ello se puede solventar de forma diversa. En este caso solo hablaré de los <strong>ataques </strong>al servidor (aunque la mejor palabra para definirlo sería <strong>vulnerabilidades</strong> del software).<span id="more-74"></span></p>
<p>Las diferentes <strong>vulnerabilidades Web</strong>, entre otras, son:</p>
<p style="padding-left: 30px;">1. <strong>Cross Site Scripting</strong> (<strong>XSS</strong>). Básicamente se basa en aplicaciones que permite ejecutar código de scripting (javascript, entre otros) y es causado por la no verificación de los valores introducidos por el usuario. <strong>XSS </strong>es un tipo de inyección HTML y permite a una persona mal intencionada ejecutar código en el navegador de la víctima y pudiendo insertar contenido nefasto, realizar ataques de phising, robar las sesiones de usuario,&#8230; entre otros. Generalmente, <strong>Cross Site Scripting</strong>, se suele utilizar JavaScript para esta finalidad, pero en realidad, cualquier lenguaje de script puede ser utilizado.</p>
<p style="padding-left: 30px;">2. <strong>Inyecciones de código</strong>. Se basa en el envío de datos por parte del cliente a la aplicación con contenido malicioso y  utilizados directamente, por ejemplo, en sentencias SQL.</p>
<p style="padding-left: 30px;">El típico caso de ataque de inyección es <strong>SQL Inyection</strong>, aunque también tenemos <strong>HTML Inyection</strong> (como el <strong>XSS</strong>), <strong>XPath</strong>, <strong>XML</strong>&#8230; Al igual que comentaba en el punto anterior, todos estos ataques suele producirse cuando el desarrollador confía demasiado en el usuario y no filtra correctamente todos los puntos de entrada de datos.</p>
<p style="padding-left: 30px;">3. <strong>Ejecución maliciosa de código</strong>. Esta <strong>vulnerabilidad </strong>se basa en el uso de una variable procedente del usuario para incluir en nuestro código un fichero determinado.</p>
<p style="padding-left: 30px;">Un claro ejemplo de ello, son aquellas aplicaciones que mediante el uso de un parámetro específico en la URI, hacen la inclusión de ese &#8220;módulo&#8221;. <em><span style="color: #808080;">www.sergiquinonero.net/index.php?controlador=inicio</span></em> donde en inicio podríamos encontrar algo tal que <em><span style="color: #808080;">include $_GET['controlador'] .  &#8217;.php&#8217;;</span></em></p>
<p style="padding-left: 30px;"><em><span style="color: #808080;"><span style="color: #000000; font-style: normal;">4. <strong>Cross Site Request Forgery</strong> (<strong>CSRF</strong>). Este tipo de ataque permite a una página mal intencionada, al ser visitado por una víctima, ejecutar una llamada Web a otra página (susceptible al usuario) y realizar una acción determinada sobre el site víctima.</span></span></em></p>
<p style="padding-left: 30px;"><em><span style="color: #808080;"><span style="color: #000000; font-style: normal;">Imaginaos qué, en una Web A tenemos una imagen oculta, cuya fuente de imagen sea <em><span style="color: #808080;">http://www.facebook.com/profile/modify-mail/correo-malintencionado@miserver.com</span></em> (obivamente esto es un ejemplo IRREAL).El usuario que visitase esa página Web A, si está identificado en facebook (en este caso) estaría permitiendo a la Web malintencionada, modificar su e-mail sin que éste se diera cuenta.</span></span></em></p>
<p style="padding-left: 30px;"><em><span style="color: #808080;"><span style="color: #000000; font-style: normal;">5. <strong>Fuga de información</strong> o <strong>Error en el manejo de errores</strong>. Esto suele ocurrir cuando nuestro servidor muestra los errores de programación (Fatal Error, Warning, Notices) que dan al usuario mal intencionado información de cómo es nuestra estructura permitiéndole utilizar otro tipo de vulnerabilidades para hacerse con el control total o parcial de nuestro sitio.</span></span></em></p>
<p style="padding-left: 30px;"><em><span style="color: #808080;"><span style="color: #000000; font-style: normal;">6. <strong>Robo de Sesión</strong>. Cuando un usuario inicia sesión en una página Web, normalmente, ese sitió dejará una galletita (cookie) en el ordenador del usuario con un session id que identificará ese usuario con esa máquina. El servidor también almacena ese ID junto con información del usuario. Como no es frecuente el uso de navegación segura (mediante HTTPS), cualquier persona mal intencionada (y con los medios) podría obtener esa información y suplantar a la víctima (creando una cookie con esa información).</span></span></em></p>
<p><em><span style="color: #808080;"><span style="color: #000000; font-style: normal;">No son todos estos puntos los únicos que hay que tomar en cuenta para prevenir ataques en páginas y aplicaciones Web, pero con ellos, estaremos un poco más seguros y podremos conciliar mejor el sueño.</span></span></em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.sergiquinonero.net/diferentes-tipos-de-ataques-en-paginas-y-aplicaciones-web.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Acceder a un array de manera más limpia en PHP</title>
		<link>http://www.sergiquinonero.net/acceder-a-un-array-de-manera-mas-limpia-en-php.html</link>
		<comments>http://www.sergiquinonero.net/acceder-a-un-array-de-manera-mas-limpia-en-php.html#comments</comments>
		<pubDate>Thu, 28 Aug 2008 15:57:37 +0000</pubDate>
		<dc:creator>Sergi</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[array]]></category>
		<category><![CDATA[objeto]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.sergiquinonero.net/?p=45</guid>
		<description><![CDATA[Navegando un poquito por php.net he encontrado una manera curiosa de acceder al valor de un array asociativo.
La cuestión está en transformar el array, con una sola línea, en un objeto. De esta manera, el acceso a un valor del array es similar al acceso a una propiedad de objeto.
$persona = array(
'nombre' =&#62; 'Sergi',
'apellidos' =&#62; [...]]]></description>
			<content:encoded><![CDATA[<p>Navegando un poquito por <a rel="nofollow" href="http://www.php.net" target="_blank">php.net</a> he encontrado una manera curiosa de acceder al valor de un array asociativo.</p>
<p>La cuestión está en transformar el array, con una sola línea, en un objeto. De esta manera, el acceso a un valor del array es similar al acceso a una propiedad de objeto.<span id="more-45"></span></p>
<pre>$persona = array(
'nombre' =&gt; 'Sergi',
'apellidos' =&gt; 'Quiñonero Gasent',
'web' =&gt; 'www.sergiquinonero.net'
);
$persona = (object) $persona; #En esta línea está la solución
echo $persona-&gt;nombre . " " . $persona-&gt;apellidos;</pre>
<p>El causante es el modificador explicito (object). Éste transforma nuestro array en un objeto. ¿Una forma limpia de acceder? o de lo contrario ¿Una chapuza que solo hace más ilegible el código?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sergiquinonero.net/acceder-a-un-array-de-manera-mas-limpia-en-php.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Cómo ofuscar código PHP</title>
		<link>http://www.sergiquinonero.net/como-ofuscar-codigo-php.html</link>
		<comments>http://www.sergiquinonero.net/como-ofuscar-codigo-php.html#comments</comments>
		<pubDate>Mon, 18 Aug 2008 12:55:00 +0000</pubDate>
		<dc:creator>Sergi</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[código]]></category>
		<category><![CDATA[ofuscar]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.sergiquinonero.net/?p=43</guid>
		<description><![CDATA[Muchos programadores trabajan con códigos desarrollados para un tipo de cliente específico. La estructura del código les permite generar, con unas pequeñas modificaciones, aplicaciones específicas para un determinado cliente. A raíz de esto, surge un &#8220;pequeño&#8221; problema, la propiedad intelectual.
Cuando el desarrollador sustenta su economía a través de la venta de sus productos -diseñados por [...]]]></description>
			<content:encoded><![CDATA[<p>Muchos programadores trabajan con códigos desarrollados para un tipo de cliente específico. La estructura del código les permite generar, con unas pequeñas modificaciones, aplicaciones específicas para un determinado cliente. A raíz de esto, surge un &#8220;pequeño&#8221; problema, la propiedad intelectual.</p>
<p>Cuando el desarrollador sustenta su economía a través de la venta de sus productos -diseñados por él o por su empresa-, el que el cliente disponga del código y pueda ofrecerlo a terceros puede ocasionar, entre otras, un aumento del precio final del producto, para evitar los denominados daños colaterales.<span id="more-43"></span></p>
<p>¿Cómo evitar éste talón de Aquiles? la respuesta está en <strong><span style="color: #800000;">ofuscar</span> </strong>el <span style="color: #800000;"><strong>código PHP</strong></span>. A través de la <span style="color: #800000;"><strong>ofuscación</strong></span> del <span style="color: #800000;"><strong>código PHP</strong></span>, el cliente podrá disponer siempre de la aplicación a un precio inferior (comparándolo al precio de venta de la aplicación más <span style="color: #800000;"><strong>código fuente</strong></span>) y el desarrollador estará libre de sus más temibles pesadillas.</p>
<p>En el mercado existen varias alternativas para <span style="color: #800000;"><strong>ofuscar código PHP</strong></span>. Una de ellas, y la que más me convence, viene de la mano de ZEND, <a rel="nofollow" href="http://www.zend.com/en/products/guard/" target="_blank">ZEND GUARD</a>.</p>
<p><span style="color: #800000;"><strong>Zend Guard</strong></span> es una herramienta de escritorio (de pago) que protege las aplicaciones de la ingeniería inversa y no autorizada mediante el suministro de codificación y ofuscación. Asímismo, protege de uso sin licencia y de la redistribución, tan temida por desarrolladores. Junto al motor <a rel="nofollow" href="http://www.zend.com/en/products/guard/optimizer/" target="_blank">ZEND OPTIMIZER</a> (gratuito), se transforma en el aliado perfecto.</p>
<p>En Internet existen otras aplicaciones on-line que <span style="color: #800000;"><strong>ofuscan el código PHP</strong></span>. Puedes encontrar un ejemplo en la Web de <a rel="nofollow" href="http://jcarlosrendon.morelosplaza.com/herramientas/ofuscador.php" target="_blank">jcarlosrendon</a> o en la de <a rel="nofollow" href="http://www.stunnix.com/" target="_blank">Stunnix</a>.</p>
<p>Estos últimos quizá sirvan solo para un par de ficheros, dado que hay que ir haciendo &#8220;copiar y pegar&#8221; y, para un sistema formado por decenas de ficheros, pueda ser un poco engorroso.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sergiquinonero.net/como-ofuscar-codigo-php.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Base de datos con países, provincias y localidades de todo el mundo</title>
		<link>http://www.sergiquinonero.net/base-de-datos-con-paises-provincias-y-localidades-de-todo-el-mundo.html</link>
		<comments>http://www.sergiquinonero.net/base-de-datos-con-paises-provincias-y-localidades-de-todo-el-mundo.html#comments</comments>
		<pubDate>Sun, 22 Jun 2008 10:39:13 +0000</pubDate>
		<dc:creator>Sergi</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[base de datos]]></category>
		<category><![CDATA[localidades]]></category>
		<category><![CDATA[mundo]]></category>
		<category><![CDATA[países]]></category>
		<category><![CDATA[provincias]]></category>
		<category><![CDATA[regiones]]></category>

		<guid isPermaLink="false">http://www.sergiquinonero.net/?p=20</guid>
		<description><![CDATA[Uno de los problemas de un proyecto Web el cual necesita tener referencias de países, provincias y localidades con la mayor cantidad correcta de registros es, precisamente, encontrar una buena base de datos.
Después de buscar y buscar encontré una URL donde nos ofrecen una base de datos con países, provincias y localidades de todo el [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft alignnone size-thumbnail wp-image-21" style="border: 0pt none; margin: 10px; float: left;" title="Mapa del mundo" src="http://www.sergiquinonero.net/wp-content/uploads/2008/06/mapa_del_mundo-150x150.jpg" alt="Mapa del mundo" width="150" height="115" />Uno de los problemas de un proyecto Web el cual necesita tener referencias de <span style="color: #800000;"><strong>países</strong></span>, <span style="color: #800000;"><strong>provincias </strong></span>y <span style="color: #800000;"><strong>localidades </strong></span>con la mayor cantidad correcta de registros es, precisamente, encontrar una buena <span style="color: #800000;"><strong>base de datos</strong></span>.</p>
<p>Después de buscar y buscar encontré una URL donde nos ofrecen una <span style="color: #800000;"><strong>base de datos con países, provincias y localidades de todo el mundo</strong></span> (lo del todo no es una afirmación exacta, pero sí aproximada) en ocho idiomas diferentes (Ruso, Inglés, Alemán, Francés, Castellano, Italiano, Portugués y Chino).</p>
<p><span id="more-20"></span></p>
<p>A parte de los  más de  200 <span style="color: #800000;"><strong>países</strong></span>, casi 2.000 <span style="color: #800000;"><strong>provincias </strong></span>y sus casi 130.000 <span style="color: #800000;"><strong>localidades</strong><span style="color: #000000;">, viene acompañado de su posición (latitud y longitud) de Google Maps (aunque no todas son exactas).</span></span></p>
<p>Os dejo el enlace con esta <a rel="nofollow" href="http://rapidshare.com/files/119757880/paises.sql.gz" target="_blank">base de datos de países, provincias y localidades de todo el mundo</a>.</p>
<p>No he podido dejar referencia del sitio donde la encontré porque la URL hacia el fichero era un servidor de Rapidshare y no mencionaba ninguna otra Web.</p>
<p>Espero que sea de utilidad este listado de <a rel="nofollow" href="http://rapidshare.com/files/119757880/paises.sql.gz">países y sus provincias</a>.</p>
<p>Edito: En el <strong>listado de países y sus provincias</strong> se ha detectado algunas duplicidades en la tabla de localidades (mismo país, misma región, mismo idioma y mismo nombre de localidad con diferente ID). Para solventar esto, he creado un pequeño script PHP:</p>
<blockquote>
<pre>$sql = "SELECT count(id) as total, localidades.* FROM `localidades` group by id_region, ".
"id_pais, id_idioma, nombre having total &gt; 1";</pre>
<pre>$contador = 0;
$res = $conexion-&gt;db_query($sql);

echo "Total seleccioandas: " . $conexion-&gt;db_num_rows($res);
echo "&lt;br&gt;";

while ($row = $conexion-&gt;db_fetch_array($res)){
    $sql = "DELETE FROM localidades WHERE id_region = '{$row['id_region']}' ".
" AND id_pais = '{$row['id_pais']}' AND nombre = \"{$row['nombre']}\" ".
" AND id_idioma = '{$row['id_idioma']}' AND id &lt;&gt; '{$row['id']}'";
    if (!$conexion-&gt;db_query($sql)){
        echo $sql."&lt;br&gt;".$conexion-&gt;db_error()."&lt;br&gt;&lt;br&gt;";
        die;
    }
    else $contador++;
}
echo "Total: $contador";</pre>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.sergiquinonero.net/base-de-datos-con-paises-provincias-y-localidades-de-todo-el-mundo.html/feed</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>Cómo ofuscar el directorio de un fichero mediante PHP</title>
		<link>http://www.sergiquinonero.net/como-ofuscar-el-directorio-de-un-fichero-mediante-php.html</link>
		<comments>http://www.sergiquinonero.net/como-ofuscar-el-directorio-de-un-fichero-mediante-php.html#comments</comments>
		<pubDate>Fri, 20 Jun 2008 09:01:55 +0000</pubDate>
		<dc:creator>Sergi</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[fichero]]></category>
		<category><![CDATA[ofuscar]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[ruta]]></category>

		<guid isPermaLink="false">http://www.sergiquinonero.net/?p=17</guid>
		<description><![CDATA[A veces, nos surge la necesidad de poner ficheros en nuestro servidor para ser descargados vía Web. El problema puede surgir cuando tenemos la necesidad de ofuscar (Ocultar ruta de las descargas exteriores) la ruta del fichero para que nadie pueda acceder a él desde una vía diferente a la &#8220;permitida&#8221; por el programador y [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.sergiquinonero.net/wp-content/uploads/2008/06/php.gif"><img class="alignleft alignnone size-medium wp-image-18" style="border: 0pt none; margin: 10px; float: left;" title="Logo PHP" src="http://www.sergiquinonero.net/wp-content/uploads/2008/06/php.gif" alt="Logo PHP" width="120" height="67" /></a>A veces, nos surge la necesidad de poner ficheros en nuestro servidor para ser descargados vía Web. El problema puede surgir cuando tenemos la necesidad de <span style="color: #800000;"><strong>ofuscar (</strong></span><span style="color: #800000;"><strong>Ocultar ruta de las descargas exteriores</strong></span><span style="color: #800000;"><strong>) la ruta del fichero</strong></span> para que nadie pueda acceder a él desde una vía diferente a la &#8220;permitida&#8221; por el programador y que nadie pueda publicar el enlace directo desde su propio portal.</p>
<p>Como he recibido varios e-mails de compañeros programadores pidiéndome consejo de cómo poder <span style="color: #800000;"><strong>ofuscar el directorio de un fichero mediante PHP</strong></span> (ocultar ruta), dejo aquí una de las varias formas.</p>
<p><span id="more-17"></span></p>
<p>&lt;?php</p>
<p>/**<br />
* Manejador de ficheros<br />
*<br />
* Permite ofuscar la ruta y fichero para su descarga vía PHP<br />
*<br />
* @package COMMON<br />
* @category Algorithm<br />
* @author Sergi Quiñonero Gasent &lt;cuentame arroba sergiquinonero punto net&gt;<br />
* @author sergiquinonero.net<br />
* @copyright GPLv3<br />
* @version CVS: $Id: Exp $<br />
*<br />
*/</p>
<p>if ($bTienePermiso){ /* Valor Booleano que indica si puede o no descargar el fichero */</p>
<p style="padding-left: 30px;">$filename = &#8220;nas.rar&#8221;; /* Ruta y nombre del fichero */</p>
<p style="padding-left: 30px;">/* NO TOCAR */<br />
$size = filesize($filename);<br />
header(&#8220;Pragma: no-cache&#8221;);<br />
header(&#8220;Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0&#8243;);<br />
header(&#8220;Expires: 0&#8243;);<br />
header(&#8220;Content-Transfer-Encoding: binary&#8221;);<br />
header(&#8220;Content-type: application/force-download&#8221;);<br />
header(&#8220;Content-Disposition: attachment; filename=$filename&#8221;);<br />
header(&#8220;Content-Length: $size&#8221;);<br />
readfile(&#8220;$filename&#8221;);</p>
<p style="padding-left: 30px;">/* NO TOCAR */</p>
<p>}</p>
<p>?&gt;</p>
<p>Espero que haya sido de utilidad</p>
<p>[<strong>Como ocultar la ruta de un archivo en la barra de url</strong>]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sergiquinonero.net/como-ofuscar-el-directorio-de-un-fichero-mediante-php.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
