<?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/category/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>0</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>Generando CSS mediante PHP</title>
		<link>http://mjcarrascosa.com/generando-css-mediante-php/</link>
		<comments>http://mjcarrascosa.com/generando-css-mediante-php/#comments</comments>
		<pubDate>Thu, 25 Mar 2010 13:23:50 +0000</pubDate>
		<dc:creator>Manuel Jesús Carrascosa de la Blanca</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://mjcarrascosa.com/?p=515</guid>
		<description><![CDATA[Si algo se hecha de menos en CSS es el no poder hacer uso de variables o de cierta lógica. Hay que tener en cuenta que CSS es un lengauje meramente estilístico, sirve para describir los estilos y la presentación de los elementos de la página. Si alguna vez necesitamos incluir lógica en los CSS, [...]]]></description>
			<content:encoded><![CDATA[<p>Si algo se hecha de menos en CSS es el no poder hacer uso de variables o de cierta lógica. Hay que tener en cuenta que CSS es un lengauje meramente estilístico, sirve para describir los estilos y la presentación de los elementos de la página.</p>
<p>Si alguna vez necesitamos incluir lógica en los CSS, por ejemplo para cambiar la paleta de colores en función de la estación del año, podemos usar PHP para esto. Lo que vamos a tener ahora es un archivo PHP en lugar del CSS, por ejemplo style.php. En este archivo lo primero que tendremos será:</p>
<pre class="brush:php">header("Content-type: text/css; charset: UTF-8");</pre>
<p>De esta forma le decimos al navegador que el contenido será del tipo CSS. Veamos un ejemplo donde el color de fondo y el color del texto se seleccionará de forma aleatoria. Primero el código de nuestra página:</p>
<pre class="brush:html">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"  dir="ltr" lang="es-ES"&gt;
&lt;head&gt;
&lt;link rel="stylesheet" type="text/css" href="style.php"/&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div id="bloque"&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Aliquam at facilisis odio. Integer sollicitudin facilisis tortor, id
ullamcorper dolor dignissim vel. Curabitur tristique pellentesque iaculis.
Vivamus molestie condimentum hendrerit. In hac habitasse platea dictumst.&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Y ahora el del script PHP que genera la CSS:</p>
<pre class="brush:php">&lt;?php

header("Content-type: text/css; charset: UTF-8");

$colores = array(
  array('bg' =&gt; '#000', 'fg' =&gt; '#fff'),
  array('bg' =&gt; '#00f', 'fg' =&gt; '#fff'),
  array('bg' =&gt; '#fff', 'fg' =&gt; '#f00')
);

$color = $colores[rand(0,2)];
?&gt;

#bloque {
color: &lt;?php echo $color['fg'];?&gt;;
background-color: &lt;?php echo $color['bg'];?&gt;;
}</pre>
<p>Se puede ver como se elige una u otra paleta de forma aleatoria en <a title="Generar CSS con PHP" href="http://mjcarrascosa.com/demos/generarcss/">este enlace</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://mjcarrascosa.com/generando-css-mediante-php/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

