<?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>Sebastián Barría &#187; Seguridad</title>
	<atom:link href="http://www.sebastianbarria.com/category/seguridad/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.sebastianbarria.com</link>
	<description>Desarrollo web y multimedia</description>
	<lastBuildDate>Wed, 11 Jan 2012 18:17:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Usar registros SPF en tu servidor para evitar ser catalogado como SPAM</title>
		<link>http://www.sebastianbarria.com/web/usar-registros-spf-en-tu-servidor-para-evitar-ser-catalogado-como-spam/</link>
		<comments>http://www.sebastianbarria.com/web/usar-registros-spf-en-tu-servidor-para-evitar-ser-catalogado-como-spam/#comments</comments>
		<pubDate>Mon, 31 May 2010 15:10:23 +0000</pubDate>
		<dc:creator>Sebastian Barria</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[Servidor]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.sebastianbarria.com/?p=106</guid>
		<description><![CDATA[Uf!&#8230; ese fue el título más específico que se me ocurrió&#8230; porque literalmente es eso. Acá les voy a plantear cual fue mi situación:
En <a href="http://www.geekbox.cl" target="_blank">GEEKBOX</a> estuvimos haciendo las primeras pruebas de registro para el juego <a href="http://www.brooksbrothers.cl/mundial/" target="_blank">Brooks Brothers Mundial</a>, y parte de este proceso correspondía a enviar correos a los usuarios que se registraban para poder validar sus cuentas. Estos correos se autogeneraban vía PHP y se enviaban con la típica funcion <em>mail()&#8230;</em>.
Resulta que extrañamente los correos dirigidos a cuentas de hotmail no llegaban (ni siquiera al spam), pues el sistema interno de hotmail los bloqueaba al]]></description>
			<content:encoded><![CDATA[<p>Uf!&#8230; ese fue el título más específico que se me ocurrió&#8230; porque literalmente es eso. Acá les voy a plantear cual fue mi situación:</p>
<p>En <a href="http://www.geekbox.cl" target="_blank">GEEKBOX</a> estuvimos haciendo las primeras pruebas de registro para el juego <a href="http://www.brooksbrothers.cl/mundial/" target="_blank">Brooks Brothers Mundial</a>, y parte de este proceso correspondía a enviar correos a los usuarios que se registraban para poder validar sus cuentas. Estos correos se autogeneraban vía PHP y se enviaban con la típica funcion <em>mail()</em>.</p>
<p>Resulta que extrañamente los correos dirigidos a cuentas de hotmail no llegaban (ni siquiera al spam), pues el sistema interno de hotmail los bloqueaba al ser generados por programación. La duda que le da a este servicio de correo (por la cual no quería aceptar los correos) era que éstos se enviaban desde una dirección IP xxx.xxx.xxx.xxx (la de los servidores del servicio de alojamiento), pero no era necesariamente la misma IP que la que utiliza el sitio en cuestión (que tiene una de las tantas direcciones IP de los servidores). Esto quiere decir que estos correos le producían &#8220;desconfianza&#8221; porque no sabía con certeza si eran enviados por terceros utilizando una dirección falsa o si eran enviados REALMENTE por el sitio. Asique, &#8220;ante la duda abstente&#8221; y ellos lo rechazan.</p>
<p>En resumidas cuentas no llegaban los correos y necesitaba una solución.</p>
<h2>La solución!</h2>
<p>Buscando y buscando logré entender como se tiene que hacer para que esto no ocurra: el concepto principal es asociarle a nuestro servidor un dato que defina cuales son las direcciones IP válidas para enviar correos &#8220;autorizados&#8221; por el sitio. Este &#8220;dato&#8221; es un &#8220;registro&#8221; (como los típicos registros A o CNAME) del tipo TXT que define los valores (IPs) para que los sistemas de correo (como Hotmail) puedan consultarle. Este &#8220;dato&#8221; es el llamado registro SPF o <em>SPF record </em>(<em>Sender Policy Framework</em>).</p>
<p>En resumidas cuentas, si Hotmail ve que le están enviando un correo desde la IP xxx.xxx.xxx.xxx diciendo que viene desde <em>tusitio.com</em>, se conectará <em>tusitio.com</em> y consultará si dentro de sus registros del tipo TXT hay alguno que tenga la información de los SPF. Si la encuntra, consultará cuales son las direcciones IP autorizadas desde las cuales el sitio enviará correos. Si todo está en orden (la IP desde donde se envía el correo calza con la autorizada por el servidor) recibirá el correo sin problemas; si no, lo rechazará y probablemente asumirá como que el correo nunca existió.</p>
<p>Un ejemplo de registro TXT que contiene esta información es el siguiente (para Dreamhost):</p>
<pre>v=spf1 ip4:64.111.100.0/24 ip4:66.33.201.0/24 ip4:66.33.216.0/24 ip4:208.97.132.0/24
ip4:208.97.187.0/24 ip4:208.113.200.0/24 ip4:208.113.244.0/24 ip4:208.113.175.0/24 mx -all</pre>
<p>Este dato se le asocia al servidor y listo. Luego de un rato todo debería funcionar normalmente.</p>
<blockquote><p>Hay que tener en consideración que los SPF son independientes para cada subdominio. Es decir, que si los aplicas en <em>tudominio.com</em>, no van a ser considerados para <em>tusubdominio.tudominio.com</em>. Hotmail no los considera el mismo sitio (pues no lo son).</p>
<p>Para saber si tu servidor tiene asociado algún registro SPF puedes visitar <a href="http://www.microsoft.com/mscorp/safety/content/technologies/senderid/wizard/" target="_blank">este sitio de microsoft</a> donde revisa los registros A, MX y SPF de tu servidor. Si encuentra algún SPF te lo muestra, sino, te muestra los registros MX para que puedas crear (con su <em>wizard</em>) los registros que necesitas.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.sebastianbarria.com/web/usar-registros-spf-en-tu-servidor-para-evitar-ser-catalogado-como-spam/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Consejos prácticos de Google para usuarios de WordPress</title>
		<link>http://www.sebastianbarria.com/web/consejos-practicos-de-google-para-usuarios-de-wordpress/</link>
		<comments>http://www.sebastianbarria.com/web/consejos-practicos-de-google-para-usuarios-de-wordpress/#comments</comments>
		<pubDate>Mon, 24 May 2010 14:10:00 +0000</pubDate>
		<dc:creator>Sebastian Barria</dc:creator>
				<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://www.sebastianbarria.com/?p=103</guid>
		<description><![CDATA[En las siguientes diapositivas encontrarás una serie de consejos que propone Google para quienes utilizan WordPress para armar sus sitios, o para quienes (sin ser webmasters) tienen su propio blog en WordPress.
Para quienes no estén muy familiarizados con todos los conceptos, les describo algunos poco comunes:
<strong>Canonicalización</strong>: escoger la mejor URL para mostrar una página (o nuestro sitio web).
<strong>Googlebot</strong>: es el &#8220;robot&#8221; de Google, que lee nuestras páginas web para agregarlas a su base de datos.
<a href="http://ayudawordpress.com/consejos-de-google-para-webmasters-que-usan-wordpress/" target="_blank">Vía Ayuda WordPress&#8230;</a>]]></description>
			<content:encoded><![CDATA[<p>En las siguientes diapositivas encontrarás una serie de consejos que propone Google para quienes utilizan WordPress para armar sus sitios, o para quienes (sin ser webmasters) tienen su propio blog en WordPress.</p>
<p>Para quienes no estén muy familiarizados con todos los conceptos, les describo algunos poco comunes:</p>
<p><strong>Canonicalización</strong>: escoger la mejor URL para mostrar una página (o nuestro sitio web).<br />
<strong>Googlebot</strong>: es el &#8220;robot&#8221; de Google, que lee nuestras páginas web para agregarlas a su base de datos.</p>
<p><a href="http://ayudawordpress.com/consejos-de-google-para-webmasters-que-usan-wordpress/" target="_blank">Vía Ayuda WordPress</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.sebastianbarria.com/web/consejos-practicos-de-google-para-usuarios-de-wordpress/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Seguridad en los formularios hechos en Flash</title>
		<link>http://www.sebastianbarria.com/actionscript/seguridad-en-los-formularios-hechos-en-flash/</link>
		<comments>http://www.sebastianbarria.com/actionscript/seguridad-en-los-formularios-hechos-en-flash/#comments</comments>
		<pubDate>Sun, 07 Mar 2010 17:52:29 +0000</pubDate>
		<dc:creator>Sebastian Barria</dc:creator>
				<category><![CDATA[Actionscript]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Seguridad]]></category>

		<guid isPermaLink="false">http://www.sebastianbarria.com/?p=52</guid>
		<description><![CDATA[Paseándome en un foro, encontré algo que ni siquiera se me había ocurrido hacer: limitar los inputs de texto en flash, para que sólo acepten ciertos caracteres específicos definidos por mi.
Con este truco, podemos evitar que los usuarios intenten ingresar números en las casillas donde se les pregunta el nombre, o mejor aún, evitar que los hackers intenten ingresar algún código malicioso para que sea procesado por el archivo que recibirá los datos enviados.
La manera de hacerlo es muy simple. Se debe agregar la siguiente línea:
<pre>inputEmail.restrict = "A-Za-z0-9.@_";
&#8230;</pre>
El ejemplo anterior, limita a la casilla &#8220;inputEmail&#8221; (ese]]></description>
			<content:encoded><![CDATA[<p>Paseándome en un foro, encontré algo que ni siquiera se me había ocurrido hacer: limitar los inputs de texto en flash, para que sólo acepten ciertos caracteres específicos definidos por mi.</p>
<p>Con este truco, podemos evitar que los usuarios intenten ingresar números en las casillas donde se les pregunta el nombre, o mejor aún, evitar que los hackers intenten ingresar algún código malicioso para que sea procesado por el archivo que recibirá los datos enviados.</p>
<p>La manera de hacerlo es muy simple. Se debe agregar la siguiente línea:</p>
<pre>inputEmail.restrict = "A-Za-z0-9.@_";
</pre>
<p>El ejemplo anterior, limita a la casilla &#8220;inputEmail&#8221; (ese es el nombre de instancia que tiene la casilla de nuestro ejemplo) a que en ella sólo se puedan escribir los caracteres definidos (las letras de la &#8220;A&#8221; a la &#8220;Z&#8221;, y de la &#8220;a&#8221; a la &#8220;z&#8221;, los números del 0 al 9, el punto, la arroba y el guión bajo). Este ejemplo se usa para limitar los inputs donde necesitamos que el visitante ingrese su email.</p>
<p>Si la casilla &#8220;inputEmail&#8221;, está alojada en el _root, sólo bastaría con escribir esa línea en el AS del primer fotograma de nuestra película donde aparezca esta casilla.</p>
<p>Si la casilla de ingreso de texto se encuentra dentro de un movieclip, sólamente se debe hacer lo mismo, en el onLoad del movieclip.</p>
<pre>onClipEvent (load) {
    this.inputEmail.restrict = "A-Za-z0-9.@_";
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.sebastianbarria.com/actionscript/seguridad-en-los-formularios-hechos-en-flash/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Recibir variables con Javascript</title>
		<link>http://www.sebastianbarria.com/web/recibir-variables-con-javascript/</link>
		<comments>http://www.sebastianbarria.com/web/recibir-variables-con-javascript/#comments</comments>
		<pubDate>Sun, 07 Mar 2010 17:28:10 +0000</pubDate>
		<dc:creator>Sebastian Barria</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.sebastianbarria.com/?p=39</guid>
		<description><![CDATA[Por defecto, JavaScript no posee funciones automáticas para recibir variables mediante la URL. Por lo mismo, es necesario crear una función que las reciba, de manera tal que podamos trabajar con ellas.
<h3>La función</h3>
Para recibir variables mediante JavaScript, sería necesario utilizar una función como la siguiente, la cual debería ir al principio de la página (dentro de la etiqueta HEAD):
<pre>&#60;script type="text/javascript"&#62;
query=window.location.search.substring(1);
q=query.split("&#38;");
vars=[];
for(i=0;i&#60;q.length;i++){
    x=q[i].split("=");
    k=x[0];
    v=x[1];
    vars[k]=v;
}
&#60;/script&#62;
</pre>
De esta manera, todas las variables quedarían almacenadas en un <em>array asociativo</em>, del cual podríamos obtener todos los datos en cualquier minuto.
<h3>Un ejemplo&#8230;</h3>
Suponiendo que]]></description>
			<content:encoded><![CDATA[<p>Por defecto, JavaScript no posee funciones automáticas para recibir variables mediante la URL. Por lo mismo, es necesario crear una función que las reciba, de manera tal que podamos trabajar con ellas.</p>
<h3>La función</h3>
<p>Para recibir variables mediante JavaScript, sería necesario utilizar una función como la siguiente, la cual debería ir al principio de la página (dentro de la etiqueta HEAD):</p>
<pre>&lt;script type="text/javascript"&gt;
query=window.location.search.substring(1);
q=query.split("&amp;");
vars=[];
for(i=0;i&lt;q.length;i++){
    x=q[i].split("=");
    k=x[0];
    v=x[1];
    vars[k]=v;
}
&lt;/script&gt;
</pre>
<p>De esta manera, todas las variables quedarían almacenadas en un <em>array asociativo</em>, del cual podríamos obtener todos los datos en cualquier minuto.</p>
<h3>Un ejemplo</h3>
<p>Suponiendo que en la URL recibimos una estructura como la siguiente:</p>
<pre>http://www.sebastianbarria.com/?animal=perro&amp;nombre=bobby</pre>
<p>para poder llamar a una variable, solamente habría que llamarla así:</p>
<pre>vars['animal']
vars['nombre']</pre>
<h3>Seguridad</h3>
<p>Está claro que el tema de la seguridad es muy importante en una página web, por lo tanto siempre hay que tener cuidado cuando se utiliza JavaScript. Yo recomiendo que JavaScript se utilice <strong>únicamente</strong> cuando no se comprometa información importante, que debe ser resguardada y validada.</p>
<p>Por ejemplo, si el registro en un sitio depende de un Javascript que recibe algún dato importante, no se puede permitir recibir y volver a enviar el mismo dato sin validarlo, pues en el camino puede ser modificada la URL y toda la &#8220;seguridad&#8221; del sitio se vería comprometida. En ese caso, se debería utilizar lenguajes de programación más avanzados, que se ejecuten en el servidor, y no en el cliente, como PHP, ASP, Java, etc.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sebastianbarria.com/web/recibir-variables-con-javascript/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Cómo proteger las direcciones de correo del spam</title>
		<link>http://www.sebastianbarria.com/web/como-proteger-las-direcciones-de-correo-del-spam/</link>
		<comments>http://www.sebastianbarria.com/web/como-proteger-las-direcciones-de-correo-del-spam/#comments</comments>
		<pubDate>Sun, 07 Mar 2010 16:54:03 +0000</pubDate>
		<dc:creator>Sebastian Barria</dc:creator>
				<category><![CDATA[HTML]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.sebastianbarria.com/?p=33</guid>
		<description><![CDATA[Existen muchas maneras de proteger las direcciones de correo electrónico que aparecen en nuestros sitios para que no sean detectadas por los &#8220;robots caza emails&#8221;, y por supuesto, la mayoría de estas alternativas utiliza imágenes para protegerlas.
A continuación veremos algunas alternativas que se utilizan según las necesidades de cada tipo de sitio, para proteger las direcciones de correo, ya sea las propias, o las de nuestros visitantes.:
<h3>Imágenes generadas manualmente&#8230;</h3>
Una de las soluciones básicas al pensar en crear una imágen de una dirección de correo es la de generar manualmente en algún editor de imágenes la dirección de]]></description>
			<content:encoded><![CDATA[<p>Existen muchas maneras de proteger las direcciones de correo electrónico que aparecen en nuestros sitios para que no sean detectadas por los &#8220;robots caza emails&#8221;, y por supuesto, la mayoría de estas alternativas utiliza imágenes para protegerlas.</p>
<p>A continuación veremos algunas alternativas que se utilizan según las necesidades de cada tipo de sitio, para proteger las direcciones de correo, ya sea las propias, o las de nuestros visitantes.:</p>
<h3>Imágenes generadas manualmente</h3>
<p>Una de las soluciones básicas al pensar en crear una imágen de una dirección de correo es la de generar manualmente en algún editor de imágenes la dirección de correo. Esto sería, por ejemplo, escribiéndola en Photoshop, y exportándola como .gif o .jpg para utilizarla en el sitio en reemplazo del texto.</p>
<p>De esta manera, ningún software podría detectar la dirección de correo si mira el código fuente de la página (a menos, por supuesto, que a algún &#8220;inteligente&#8221; se le ocurra ponerle como nombre a la foto la misma dirección de correo).</p>
<p>En este caso (y en todos los generados con imágenes), es necesario preocuparse bien de la tipografía, color, tamaño y color de fondo que se desea.</p>
<h3>Utilizar un generador de imágenes</h3>
<p>Existen muchas alternativas de sitios web o software que permiten crear automáticamente estas imágenes:</p>
<ul>
<li><a rel="external" href="http://www.spam-proof-email-generator.com/">http://www.spam-proof-email-generator.com/</a></li>
<li><a rel="external" href="http://services.nexodyne.com/email/index_custom.php">http://services.nexodyne.com/email/index_custom.php</a></li>
</ul>
<p>El proceso es prácticamente el mismo que el del paso anterior, solamente que esta vez no hay que utilizar ningún software específico. Se ingresa a la página, se escribe la dirección de correo y después se configuran las variables necesarias. Se genera y se guarda.</p>
<h3>Autogenerar las imágenes</h3>
<p>Acá se pone &#8220;avanzada&#8221; la cosa. El hecho de autogenerar las imágenes implica utilizar lenguajes de programación como PHP o ASP, para llamar a funciones que toman una palabra y generan una imágen. En el fondo, el mismo proceso (nuevamente) que los casos anteriores, pero &#8220;hecho en casa&#8221;, sin necesidad de recurrir a otros sitios.</p>
<p>Los benecios de esto es que se puede utilizar de manera automática. Por ejemplo si tienes un blog y quieres mostrar las direcciones de correo de todos los que comentan (no es muy recomendado en todo caso, pero ahora da lo mismo porque es un ejemplo), puedes utilizar una función de php que genere la imágen, utilizando un código similar a este <em>nombreFuncion(&#8220;tucorreo@ejemplo.com&#8221;)</em>, tal como se explica, por ejemplo, en <a href="http://www.peoplecnc.com/como_ocultar_email_correo.html">http://www.peoplecnc.com/como_ocultar_email_correo.html</a>.</p>
<h3>Autogenerar las imágenes desde un sitio externo</h3>
<p>Y como no podía faltar, más de algún sitio web ofrece el servicio de enmascarar las direcciones de manera externa, como <a href="http://www.houseoftech.com/scripts.php">http://www.houseoftech.com/scripts.php</a>, dando la posibilidad de enviar los datos de manera encriptada (es lo más recomendado), y de utilizar distintas tipografías colores y tamaños.</p>
<h3>Reemplazar la arroba (@)</h3>
<p>El título lo dice: otra alternativa es la de reemplazar la arroba (@) por una imágen de la arroba, por lo tanto, la dirección <em>tucorreo@ejemplo.com</em>, quedaría como <em>tucorreo</em><em>&lt;img src=&#8221;arroba.jpg</em>&#8221; alt=&#8221;@&#8221;&gt;<em>ejemplo.com.</em></p>
<blockquote><p>Incluso es posible llamar a una foto que no existe, para que aparezca la &#8220;@&#8221; del &#8220;alt&#8221;. No es lo más seguro que hay, pero con esto ya se dificulta bastante que los robots detecten la dirección de correo.</p>
<p>Este método también permite hacerlo de manera automatizada (para todos los comentarios de un blog, por ejemplo), y se debería hacer reemplazando la arroba de la dirección de email por el código de la imágen.</p></blockquote>
<h3>Otra alternativa para reemplazar la arroba</h3>
<p>Lo que tenemos que hacer es escribir nuestro correo de la siguiente manera:</p>
<pre>micorreo&lt;span id="reemplazar"&gt;(arroba)&lt;/span&gt;misitio.com</pre>
<p>Si se fijan, la @ está representada por la palabra &#8220;(arroba)&#8221;, la cual está dentro de un <em>span</em> que tiene el <em>ID</em> &#8220;<em>reemplazar</em>&#8220;. De esta manera:</p>
<ul>
<li>Los robots que visiten la página (al ver sólo el código) verán toda esa línea, y por lo tanto, es muy difícil que lo consideren como una dirección de correo válida.</li>
<li>Los humanos (al no ver el código) verán <em>micorreo(arroba)misitio.com</em>, que para una persona común y corriente es completamente entendible.</li>
</ul>
<p>El truco ahora está en aplicar la siguiente función de javascript.</p>
<pre>var reemplazable=document.getElementById('reemplazar');
reemplazables[i].innerHTML="@";
</pre>
<p>La funcion toma el span que tiene el ID <em>reemplazar</em> y reemplaza su contenido (<em>innerHTML</em>) por una arroba. Y <em>voila</em>!, simple y eficiente. Ahora los visitantes (que tengan javascript habilitado porsupuesto) verán el email como cualquier email, e incluso lo podrán copiar/pegar.</p>
<p>¿Y si no tengo javascript habilitado?, se preguntarán muchos. A esta altura todos los navegadores modernos (e incluso IE6, jaja) tienen soporte para javascript, y es muy raro que una persona navegue sin javascript habilitado.</p>
<p>A los que probablemente si les afecte es a los que navegan desde un teléfono móvil, pero de todas formas, ellos y esos extrañísimos casos que navegan sin javascript habilitado, verán <em>micorreo(arroba)misitio.com</em>, lo cual no debería ser un problema.</p>
<h3>Enmascarar emails</h3>
<p>Otra alternativa es la de enmascarar las direcciones de correo, que corresponde a ocultar las direcciones con caracteres especiales (codificados).</p>
<p>Existen dos maneras de hacer esto: una es utilizando un ofuscador de email, como el de <a href="http://www.codehouse.com/webmaster_tools/email_obfuscator/">http://www.codehouse.com/webmaster_tools/email_obfuscator/</a>, que permite codificar una dirección de correo que se ingrese, lo cual es muy útil para poner la propia dirección de correo. La otra manera es haciéndolo de manera propia, llamando a una función de PHP, como se explica en <a href="http://digitalcolony.com/2007/05/masking-email-addresses-in-php.aspx">http://digitalcolony.com/2007/05/masking-email-addresses-in-php.aspx</a> (muy buen ejemplo).</p>
<h3>Y aún hay más</h3>
<p>Las anteriores son, a grandes rasgos, las mejores alternativas para proteger las direcciones de correo. Sin embargo, existen otras alternativas (NO TAN SEGURAS), como enmascarar las direcciones a través de javascript, utilizando un simple código como este:</p>
<pre>&lt;script language=javascript&gt;
	&lt;!--
	function enmascarar(user,host){
		document.write(user+"@"+host);
	}
	//--&gt;
&lt;/script&gt;
</pre>
<blockquote><p>Creo que es muy importante que todos tomemos conciencia de lo que implica publicar las direcciones de correo sin ningún tipo de protección. Por lo mismo, debemos intentar siempre utilizar métodos como los mencionados en este post para proteger a nuestras visitas y a quienes quieran cooperar comentando en nuestros sitios.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.sebastianbarria.com/web/como-proteger-las-direcciones-de-correo-del-spam/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Seguridad con PHP / MySQL</title>
		<link>http://www.sebastianbarria.com/web/seguridad-con-php-mysql/</link>
		<comments>http://www.sebastianbarria.com/web/seguridad-con-php-mysql/#comments</comments>
		<pubDate>Sat, 06 Mar 2010 18:50:30 +0000</pubDate>
		<dc:creator>Sebastian Barria</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.sebastianbarria.com/?p=22</guid>
		<description><![CDATA[Al montar un servidor o programar un sitio web basado en PHP y MySQL, hay que tener en consideración algunos conceptos de seguridad. En esta ocasión, hablaré de 3 problemas de seguridad básicos:
<ul>
<li>Los usuarios y sus privilegios (en MySQL)</li>
<li>La configuración de apache</li>
<li>El filtrado de formularios y URL&#8217;s</li>
</ul>
Este post está enfocado, principalmente, a quienes pretenden montar un servidor en su computador (localhost) pues, por lo menos en los servidores pagados, la seguridad con los privilegios de MySQL está implementada.
<h3>Los problemas de seguridad</h3>
<h4>Los usuarios y sus privilegios (en MySQL)&#8230;</h4>
El principal problema de montar un servidor]]></description>
			<content:encoded><![CDATA[<p>Al montar un servidor o programar un sitio web basado en PHP y MySQL, hay que tener en consideración algunos conceptos de seguridad. En esta ocasión, hablaré de 3 problemas de seguridad básicos:</p>
<ul>
<li>Los usuarios y sus privilegios (en MySQL)</li>
<li>La configuración de apache</li>
<li>El filtrado de formularios y URL&#8217;s</li>
</ul>
<blockquote><p>Este post está enfocado, principalmente, a quienes pretenden montar un servidor en su computador (localhost) pues, por lo menos en los servidores pagados, la seguridad con los privilegios de MySQL está implementada.</p></blockquote>
<h3>Los problemas de seguridad</h3>
<h4>Los usuarios y sus privilegios (en MySQL)</h4>
<p>El principal problema de montar un servidor en casa (localhost), es que los software que se utilizan para esto &#8211; <a rel="external" href="http://www.easyphp.org/">EasyPHP</a>, <a rel="external" href="http://www.appservnetwork.com/">Appserv</a>, etc &#8211; vienen con usuarios por defecto&#8230; el famoso <strong>&#8220;_root&#8221; sin contraseña</strong>. Esto implica que cualquier persona con un poco de conocimientos de hackeo, pueda botar la base de datos u obtener información de ella si es que el usuario por defecto no se cambia (ya que el hacker sabría que el nombre de usuario es &#8220;_root&#8221; y no tiene contraseña).</p>
<h4>La configuración de apache</h4>
<p>Además de eso, está el problema de configuración de apache, pues appserv, por ejemplo, establece todas las variables como globales por defecto (por ejemplo, si recibo una variable por el metodo &#8220;POST&#8221;, simplemente escribo &#8220;echo $nombre_de_la_variable&#8221; para mostrarla en pantalla). Si bien las variables globales son más cómodas, implican riesgos en seguridad y confusión, porque si se necesita recibir la variable &#8220;admin_pass&#8221; por el método POST y el &#8220;hacker&#8221; escribe una url como &#8220;<em>&#8230;index.php?admin_pass=miclave</em>&#8220;, se estaría recibiendo la variable por otro método y poniendo en riesgo la seguridad del sitio.</p>
<h4>El filtrado de formularios y URL&#8217;s</h4>
<p>Otro problema es la seguridad con PHP, pues si no se filtra la información recibida a través de formularios o de la URL, se esta dando pie para que gente mal intencionada ejecute scripts que pongan en riesgo la seguridad de nuestro sitio.</p>
<h3>Las soluciones</h3>
<p>Antes que nada, se debe definir el software a utilizar. Por mi parte, y por conceptos de seguridad, yo recomiendo <a rel="external" href="http://www.easyphp.org/">EasyPHP</a>, pues es mucho mas &#8220;paranoico&#8221; que Appserv, y viene mucho más limitado en conceptos de seguridad y mensajes de error; es decir, que viene &#8220;mejor configurado&#8221; (en conceptos de seguridad) por defecto, y no hay que preocuparse de cambiar muchas cosas.</p>
<p>Por esto, la siguiente solución la veremos específicamente para EasyPHP (aunque también se aplica para Appserv).</p>
<h4>Los usuarios y sus privilegios (en MySQL)</h4>
<p>Lo primero que se debería hacer, al montar un servidor en casa, es definir un usuario que tenga todos los privilegios necesarios para administrar nuestro sitio.</p>
<p>Para esto, hay que realizar las siguientes operaciones:</p>
<ol>
<li>Ir a PhpMyAdmin (la administración de MySQL) y crear un nuevo usuario (o modificar &#8220;_root&#8221;) con un username y un password que no sea tan obvio.</li>
<li>Abrir el archivo de configuración llamado &#8220;<em>config.inc.php</em>&#8221; (ubicado en &#8230;EasyPHP1-8\phpmyadmin\), las variables <em>$cfg['Servers'][$i]['user'] = &#8216;_root&#8217;; y $cfg['Servers'][$i]['password'] = &#8221;;</em>, y poner ahí el username y password definido para el administrador de MySQL en el paso anterior.</li>
<li>Eliminar el usuario &#8220;_root&#8221; (en el caso de haber creado otro usuario para la administración), pues si se deja, el sitio seguirá siendo inseguro.</li>
</ol>
<p>A partir de este punto, si se quiere, se puede crear otro usuario con menos privilegios (por ejemplo que no pueda crear o eliminar tablas), que sea con el que nos conectemos desde el sitio y, de esta manera, correr menos riesgos.</p>
<h4>La configuración de apache</h4>
<p>El tema de la configuración pasa, primero, por elegir el servidor adecuado. En el caso de <a rel="external" href="http://www.easyphp.org/">EasyPHP</a>, la configuración por defecto es bastante buena si hablamos de seguridad, pero hay que fijarse bien (a la hora de programar) en solucionar todos los errores y en los mensajes de error que devuelve, pues aveces dice &#8220;imposible conectar a la base de datos MiBase&#8221;, por lo que estaríamos entregando información privada el importante.</p>
<p>Hay otros conceptos que son más técnicos (y que no serán abordados en este post), como la cantidad de usuarios máximos conectados a la base de datos, y que hacer cuando se sobrepasan los límites; los tamaños de los archivos que se pueden subir; los privilegios de las carpetas, etc que se deben tener en cuenta a la hora de configurar el servidor.</p>
<h4>El filtrado de formularios y URL&#8217;s</h4>
<p>Personalmente, he ido creando mis propias funciones de seguridad para filtrar las entradas por cookies, formularios, y los métodos GET y POST.</p>
<p>Las funciones, las almaceno en un archivo validar.php y luego, simplemente, las inserto al principio de cada uno de mis archivos donde necesite validar variables (a través del comando include(&#8220;validar.php&#8221;);).</p>
<p>La manera de utilizarlas, es definiendo las variables de la manera:</p>
<pre>$mi_variable=varpost("nombre_de_la_variable_a_recibir" , "valor en caso de no encontrarse la variable" , largo en caracteres);</pre>
<p>Después de eso, solo queda utilizar $mi_variable en mi archivo php. Esto asegura que la variable quedará definida (y no aparecerán mensajes de error por variables no definidas). También asegura recibir la variable por el método especificado (y no por otro) y definirle un tamaño máximo (para no recibir, por ejemplo, mensajes de 12404502345023 caracteres).</p>
<p>Las funciones son las siguientes:</p>
<pre>function validar( $variable, $tam ){
 $va=htmlentities($variable,ENT_QUOTES,"UTF-8");
 mysql_escape_string($va);
 $va=substr ($va, 0, $tam);
 return $va;
}

function varget($valor, $vacio, $tam){
 if (empty($_GET[$valor])) { $res=$vacio; }
 else { $res=validar($_GET[$valor],$tam); }
 return $res;
}

function varpost($valor, $vacio, $tam){
 if (empty($_POST[$valor])) { $res=$vacio; }
 else { $res=validar($_POST[$valor],$tam); }
 return $res;
}

function varcookie($valor, $vacio, $tam){
 if (empty($_COOKIE[$valor])) { $res=$vacio; }
 else { $res=validar($_COOKIE[$valor],$tam); }
 return $res;
}

function varsess($valor, $vacio, $tam){
 if (empty($_SESSION[$valor])) { $res=$vacio; }
 else { $res=validar($_SESSION[$valor],$tam); }
 return $res;
}</pre>
<h3>Conclusión</h3>
<p>Estas son algunas de las medidas de seguridad básicas para no pasar por inculto a la hora de diseñar un sitio y de montar un servidor casero.</p>
<p>Espero que quien las lea las tome en cuenta, las aproveche; mejoren las funciones de seguridad y las adecuen para satisfacer las necesidades de su sitio.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sebastianbarria.com/web/seguridad-con-php-mysql/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

