<?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>mjcarrascosa.com &#187; PHP</title>
	<atom:link href="http://mjcarrascosa.com/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://mjcarrascosa.com</link>
	<description>Desarrollo web y otras hierbas</description>
	<lastBuildDate>Fri, 08 Jul 2011 07:41:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Filtrando datos con filter_input</title>
		<link>http://mjcarrascosa.com/filtrando-datos-con-filter_input/</link>
		<comments>http://mjcarrascosa.com/filtrando-datos-con-filter_input/#comments</comments>
		<pubDate>Mon, 16 May 2011 23:21:39 +0000</pubDate>
		<dc:creator>Manuel Jesús Carrascosa de la Blanca</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Filtros]]></category>
		<category><![CDATA[XSS]]></category>

		<guid isPermaLink="false">http://mjcarrascosa.com/?p=723</guid>
		<description><![CDATA[Algo que hay que tener en cuenta a la hora de desarrollar cualquier tipo de software, tanto web como de otro tipo, es que los datos que introduce el usuario no tienen porque ser los correctos, y en algunos casos pueden llegar a ser incluso maliciosos. Veamos un pequeño ejemplo: Supongamos que tenemos el siguiente [...]]]></description>
			<content:encoded><![CDATA[<p>Algo que hay que tener en cuenta a la hora de desarrollar cualquier tipo de software, tanto web como de otro tipo, es que los datos que introduce el usuario no tienen porque ser los correctos, y en algunos casos pueden llegar a ser incluso maliciosos. Veamos un pequeño ejemplo:</p>
<p>Supongamos que tenemos el siguiente formulario:</p>
<p>formulario.php</p>
<pre class="brush:php">&lt;html&gt;
&lt;head&gt;
  &lt;title&gt;Formulario&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;form method="post" action="mensaje.php"&gt;
   &lt;label for="mensaje"&gt;Mensaje:&lt;/label&gt;
   &lt;input type="text" name="mensaje" id="mensaje"/&gt;
   &lt;input type="submit" value="Enviar mensaje"/&gt;
  &lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Al pulsar el botón de enviar este nos lleva al siguiente script:</p>
<p>mensaje.php</p>
<pre class="brush:php">&lt;?php
  $mensaje = $_POST['mensaje'];
?&gt;
&lt;html&gt;
&lt;head&gt;
  &lt;title&gt;Ver mensaje&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;p&gt;El mensaje es:&lt;/p&gt;
&lt;p&gt;&lt;?php echo $mensaje;?&gt;&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Si no tenemos cuidado puede ocurrir que un atacante malintencionado insertara como mensaje algo como:</p>
<pre class="brush:html">&lt;script src="script-dañino.js"&gt;&lt;/script&gt;</pre>
<p>Con lo que el código de ese script-dañino.js se ejecutaría, lo que podría hacer que cambiara el contenido de la página, que instalará algún tipo de malware, etc.</p>
<p>Podemos evitar esto con una función, que está presente desde PHP 5.2.0, que nos permite filtrar los datos que recibe el servidor por parte del navegador, la función <em>filter_input</em>. Veamos como quedaría el archivo mensaje.php una vez corregido:</p>
<p>mensaje.php</p>
<pre class="brush:php">&lt;?php
  $mensaje = filter_input(INPUT_POST, 'mensaje', FILTER_SANITIZE_SPECIAL_CHARS);
?&gt;
&lt;html&gt;
&lt;head&gt;
  &lt;title&gt;Ver mensaje&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;p&gt;El mensaje es:&lt;/p&gt;
&lt;p&gt;&lt;?php echo $mensaje;?&gt;&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Y de esta sencilla forma hemos conseguido filtrar la variable mensaje. Este método no nos serviría si esperamos que la entrada venga en formato HTML, por ejemplo, pero si nos puede venir bien para otros tipos de datos.</p>
<p>Para ver una descripción completa de esta función es recomendable <a title="Documentación de filter_input" href="http://es2.php.net/manual/es/function.filter-input.php">ver su documentación</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://mjcarrascosa.com/filtrando-datos-con-filter_input/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Midiendo el tiempo que tarda en ejecutarse una porción de código en PHP</title>
		<link>http://mjcarrascosa.com/midiendo-el-tiempo-que-tarda-en-ejecutarse-una-porcion-de-codigo-en-php/</link>
		<comments>http://mjcarrascosa.com/midiendo-el-tiempo-que-tarda-en-ejecutarse-una-porcion-de-codigo-en-php/#comments</comments>
		<pubDate>Thu, 05 May 2011 10:26:33 +0000</pubDate>
		<dc:creator>Manuel Jesús Carrascosa de la Blanca</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[microtime]]></category>

		<guid isPermaLink="false">http://mjcarrascosa.com/?p=698</guid>
		<description><![CDATA[Algunas veces nos puede resultar útil saber cuanto tiempo tarda en ejecutarse una porción de código en PHP, por ejemplo para realizar pruebas de rendimiento. Para ello podemos usar la función de PHP microtime, que nos devuelve la fecha con microsegundos, de la siguiente manera: $time_start = microtime(true); /* Porción de código que queremos ejecutar [...]]]></description>
			<content:encoded><![CDATA[<p>Algunas veces nos puede resultar útil saber cuanto tiempo tarda en ejecutarse una porción de código en PHP, por ejemplo para realizar pruebas de rendimiento. Para ello podemos usar la función de PHP microtime, que nos devuelve la fecha con microsegundos, de la siguiente manera:</p>
<pre class="brush:php">$time_start = microtime(true);

/* Porción de código que queremos ejecutar */

$time_end = microtime(true);
$time_total = $time_end - $time_start;

echo "El código se ha ejecutado en $time_total segundos";
</pre>
<p>A partir de PHP 5.0.0 la función microtime admite un parámetro booleano, que puede ser verdadero o falso, para indicar que el resultado se devuelva como un  número real, en lugar de como una cadena, que era como se retornaba en versiones anteriores.</p>
<p>Si estamos usando una versión anterior a la 5.0.0 podemos hacerlo de la siguiente forma:</p>
<pre class="brush:php">function microtime_float()
{
    list($usec, $sec) = explode(" ", microtime());
    return ((float)$usec + (float)$sec);
}
$time_start = microtime_float();

/* Porción de código que queremos ejecutar */

$time_end = microtime_float();
$time_total = $time_end - $time_start;

echo "El código se ha ejecutado en $time_total segundos";</pre>
]]></content:encoded>
			<wfw:commentRss>http://mjcarrascosa.com/midiendo-el-tiempo-que-tarda-en-ejecutarse-una-porcion-de-codigo-en-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Parsear XML en PHP con SimpleXML</title>
		<link>http://mjcarrascosa.com/parsear-xml-en-php-con-simplexml/</link>
		<comments>http://mjcarrascosa.com/parsear-xml-en-php-con-simplexml/#comments</comments>
		<pubDate>Mon, 25 Apr 2011 10:00:55 +0000</pubDate>
		<dc:creator>Manuel Jesús Carrascosa de la Blanca</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://mjcarrascosa.com/?p=696</guid>
		<description><![CDATA[SimpleXML nos permite parsear un XML de una forma sencilla y usable. Para ello nos provee de una serie de funciones y de una clase para la manipulación de XML. Aquí solo vamos a ver la función simplexml_load_file, para ver un ejemplo, pero podemos ver el resto en la documentación de SimpleXML. Supongamos que tenemos [...]]]></description>
			<content:encoded><![CDATA[<p>SimpleXML nos permite parsear un XML de una forma sencilla y usable. Para ello nos provee de una serie de funciones y de una clase para la manipulación de XML. Aquí solo vamos a ver la función <a title="Documentación de la función simplexml_load_file" href="http://www.php.net/manual/es/function.simplexml-load-file.php">simplexml_load_file</a>, para ver un ejemplo, pero podemos ver el resto en la <a title="Documentación de SimpleXML" href="http://www.php.net/manual/es/book.simplexml.php">documentación de SimpleXML</a>.</p>
<p>Supongamos que tenemos el siguiente archivo XML:</p>
<pre class="brush:xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;libros&gt;
  &lt;libro id="0"&gt;
    &lt;titulo&gt;Ubik&lt;/titulo&gt;
    &lt;autor&gt;Philip K. Dick&lt;/autor&gt;
&lt;/libro&gt;
  &lt;libro id="1"&gt;
    &lt;titulo&gt;La fundación&lt;/titulo&gt;
    &lt;autor&gt;Isaac Asimov&lt;/autor&gt;
  &lt;/libro&gt;
  &lt;libro id="2"&gt;
    &lt;titulo&gt;El señor de los anillos&lt;/titulo&gt;
    &lt;autor&gt;J.R.R. Tolkien&lt;/autor&gt;
  &lt;/libro&gt;
&lt;/libros&gt;</pre>
<p>Con el siguiente código cargaríamos el archivo y mostraríamos un listado de los libros con el formato &#8220;id:titulo:autor&#8221;:</p>
<pre class="brush:php">&lt;?php

$libros = simplexml_load_file('libros.xml');

foreach($libros-&gt;libro as $libro)
{
 echo $libro['id'].':'.$libro-&gt;titulo.':'.$libro-&gt;autor."\n";
}</pre>
<p>Como podemos ver cargamos el archivo<em> libros.xml</em> en un objeto al que hemos llamado $libros. Este objeto modelará el XML mediante arrays que contienen los elementos del xml. Las propiedades de cada elemento están implementadas como un array asociativo.</p>
<p>Como hemos podido ver en esta breve introducción es muy sencillo parsear un xml con SimpleML. Recomiendo revisar la documentación de este módulo para conocer todas las posibilidades que nos ofrece.</p>
]]></content:encoded>
			<wfw:commentRss>http://mjcarrascosa.com/parsear-xml-en-php-con-simplexml/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Consejos de seguridad en el desarrollo de aplicaciones web</title>
		<link>http://mjcarrascosa.com/consejos-de-seguridad-en-el-desarrollo-de-aplicaciones-web/</link>
		<comments>http://mjcarrascosa.com/consejos-de-seguridad-en-el-desarrollo-de-aplicaciones-web/#comments</comments>
		<pubDate>Tue, 20 Apr 2010 21:17:21 +0000</pubDate>
		<dc:creator>Manuel Jesús Carrascosa de la Blanca</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[consejos]]></category>
		<category><![CDATA[seguridad]]></category>

		<guid isPermaLink="false">http://mjcarrascosa.com/?p=530</guid>
		<description><![CDATA[La seguridad es un aspecto muy importante al que hay que prestar atención cuando se desarrolla. Es importante tenerla en cuenta desde el mismo comienzo del desarrollo, no dejando la seguridad como algo secundario a realizar en momentos posteriores. Es por esto que vamos a dejar algunos consejos de como mejorar la seguridad durante el [...]]]></description>
			<content:encoded><![CDATA[<p>La seguridad es un aspecto muy importante al que hay que prestar atención cuando se desarrolla. Es importante tenerla en cuenta desde el mismo comienzo del desarrollo, no dejando la seguridad como algo secundario a realizar en momentos posteriores. Es por esto que vamos a dejar algunos consejos de como mejorar la seguridad durante el desarrollo de nuestras aplicaciones.</p>
<h3>No confies en los usuarios</h3>
<p>Esta es una de las reglas más importantes. Considera todas los datos que tus usuarios envíen como maliciosos.</p>
<pre class="brush:php">$id = intval($_GET['id']);
mysql_query("SELECT username, email, password FROM users WHERE id = $id");</pre>
<p>Con una sola linea podemos evitarnos una inyección SQL, por ejemplo.</p>
<h3>Validación de datos en el servidor</h3>
<p>Es importante realizar la validación de los datos en el servidor. Aunque realicemos también validación en cliente, mediante JavaScript por ejemplo, no hay que olvidarse que es relativamente fácil saltarse esta. Validando los datos en el servidor desde el principio nos evitamos bastantes problemas.</p>
<h3>Presta atención a los archivos subidos</h3>
<p>Si permites que tus usuarios suban archivos al servidor comprueba estos adecuadamente. Si son imágenes comprueba su tamaño, su tipo MIME, etc, con la función <a title="Documentación de getimagesize" href="http://php.net/manual/es/function.getimagesize.php">getimagesize</a>. En caso de que sean otro tipo de archivos puedes usar <a title="Documentación de fileinfo" href="http://www.php.net/manual/es/book.fileinfo.php">fileinfo</a> (disponible desde la versión 5.3.0) para obtener información de los archivos. Por ejemplo:</p>
<h3>Asegura tus formularios contra los bots</h3>
<p>Usa algún tipo de captcha para asegurar tus formularios contra bots de spammers. Hay distintas técnicas, puedes implementar uno propio, hacer uso de algún servicio externo o usar una librería de terceros.</p>
<h3>Permisos mínimos para el usuario de la base de datos</h3>
<p>Da los mínimos permisos al usuario de la base de datos. Si la aplicación solo va a realizar consultas SELECT, INSERT y UPDATE que el usuario de la base de datos solo pueda realizar SELECT, INSERT y UPDATE. No es nada complicado y te puede evitar algún que otro quebradero de cabeza.</p>
<p>Estos consejos son una &#8220;traducción&#8221; muy libre de estos otros:</p>
<p><a title="Web developmet security tips" href="http://www.osmialowski.me/blog/web-development-security-tips/">http://www.osmialowski.me/blog/web-development-security-tips/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://mjcarrascosa.com/consejos-de-seguridad-en-el-desarrollo-de-aplicaciones-web/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Cheat sheets para todos los gustos</title>
		<link>http://mjcarrascosa.com/cheat-sheets-para-todos-los-gustos/</link>
		<comments>http://mjcarrascosa.com/cheat-sheets-para-todos-los-gustos/#comments</comments>
		<pubDate>Tue, 13 Apr 2010 09:51:50 +0000</pubDate>
		<dc:creator>Manuel Jesús Carrascosa de la Blanca</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[bases de datos]]></category>
		<category><![CDATA[Cheat sheets]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://mjcarrascosa.com/?p=525</guid>
		<description><![CDATA[Navegando por estos mundos de Internet he encontrado una colección de cheat sheets muy interesante. Podemos verlas todas en el siguiente enlace: Cheat Sheets. Me han parecido muy interesantes las siguientes: PHP PNG PDF Expresiones regulares PNG PDF CSS PNG PDF MySQL PNG PDF Por supuesto hay muchas más que pueden ser de mucha utilidad [...]]]></description>
			<content:encoded><![CDATA[<p>Navegando por estos mundos de Internet he encontrado una colección de <em>cheat sheets</em> muy interesante. Podemos verlas todas en el siguiente enlace: <a title="Cheat Sheets" href="http://www.addedbytes.com/cheat-sheets/">Cheat Sheets</a>.</p>
<p>Me han parecido muy interesantes las siguientes:</p>
<ul>
<li><a title="Cheat Sheet PHP" href="http://www.addedbytes.com/cheat-sheets/php-cheat-sheet/">PHP</a>
<ul>
<li><a title="Cheat Sheet PHP PNG" href="http://www.addedbytes.com/download/php-cheat-sheet-v2/png/">PNG</a></li>
<li><a title="Cheat Sheet PHP PDF" href="http://www.addedbytes.com/download/php-cheat-sheet-v2/pdf/">PDF</a></li>
</ul>
</li>
<li><a title="Cheat Sheet ER" href="http://www.addedbytes.com/cheat-sheets/regular-expressions-cheat-sheet/">Expresiones regulares</a>
<ul>
<li><a title="Cheat Sheet ER PDF" href="http://www.addedbytes.com/download/regular-expressions-cheat-sheet-v2/png/">PNG</a></li>
<li><a title="Cheat Sheet ER PDF" href="http://www.addedbytes.com/download/regular-expressions-cheat-sheet-v2/pdf/">PDF</a></li>
</ul>
</li>
<li><a title="Cheat Sheet CSS" href="http://www.addedbytes.com/cheat-sheets/css-cheat-sheet/">CSS</a>
<ul>
<li><a title="Cheat Sheet CSS PNG" href="http://www.addedbytes.com/download/css-cheat-sheet-v2/png/">PNG</a></li>
<li><a title="Cheat Sheet PDF" href="http://www.addedbytes.com/download/css-cheat-sheet-v2/pdf/">PDF</a></li>
</ul>
</li>
<li><a title="Cheat Sheet MySQL" href="http://www.addedbytes.com/cheat-sheets/mysql-cheat-sheet/">MySQL</a>
<ul>
<li><a title="Cheat Sheet MySQL PNG" href="http://www.addedbytes.com/download/mysql-cheat-sheet-v1/png/">PNG</a></li>
<li><a title="Cheat Sheet MySQL PDF" href="http://www.addedbytes.com/download/mysql-cheat-sheet-v1/pdf/">PDF</a></li>
</ul>
</li>
</ul>
<p>Por supuesto hay muchas más que pueden ser de mucha utilidad mientras se desarrolla.</p>
]]></content:encoded>
			<wfw:commentRss>http://mjcarrascosa.com/cheat-sheets-para-todos-los-gustos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

