<?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>The Placeholder &#187; programación</title>
	<atom:link href="http://shankao.com/tag/programacion/feed/" rel="self" type="application/rss+xml" />
	<link>http://shankao.com</link>
	<description></description>
	<lastBuildDate>Sat, 04 Sep 2010 19:49:03 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Una consecuencia de los lenguajes no tipados</title>
		<link>http://shankao.com/2009/04/30/una-consecuencia-de-los-lenguajes-no-tipados/</link>
		<comments>http://shankao.com/2009/04/30/una-consecuencia-de-los-lenguajes-no-tipados/#comments</comments>
		<pubDate>Thu, 30 Apr 2009 11:57:16 +0000</pubDate>
		<dc:creator>shankao</dc:creator>
				<category><![CDATA[Hack]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[shankao.com]]></category>

		<guid isPermaLink="false">http://shankao.com/?p=344</guid>
		<description><![CDATA[Esto va dedicado a todos aquellos que siempre vuelven a preguntarme en qué pelotas trabajo. Aquí tenéis un ejemplo, espero que por fin quede claro: El problema de los lenguajes no tipados es que te puedes encontrar con errores tan sutiles como este. Validando un precio (básicamente un número), el programa hacía lo siguiente: &#8220;123&#8243; [...]]]></description>
			<content:encoded><![CDATA[<p>Esto va dedicado a todos aquellos que siempre vuelven a preguntarme en qué pelotas trabajo. Aquí tenéis un ejemplo, espero que por fin quede claro:</p>
<p>El problema de los lenguajes no tipados es que te puedes encontrar con errores tan sutiles como este. Validando un precio (básicamente un número), el programa hacía lo siguiente:</p>
<blockquote>
<div>&#8220;123&#8243; =&gt; Correcto<br />
&#8220;-123&#8243; =&gt; ERROR!<br />
&#8220;0&#8243; =&gt; Correcto pero no se usa<br />
&#8220;&#8221; =&gt; Correcto pero no se usa<br />
&#8220;123asd&#8221; =&gt; ERROR!<br />
<strong>&#8220;asd&#8221; =&gt; Correcto pero no se usa                 &lt;&lt;&lt;&lt;&lt;&lt;===== WTF!?!?!?!</strong></div>
</blockquote>
<p>Debería haberme escupido un error en el último caso!<br />
Trazando el código me encuentro que se comprueba y pone a cero tal que así:</p>
<blockquote>
<div>if (isset ($this-&gt;price) &amp;&amp; $this-&gt;price == 0) $this-&gt;price = NULL;</div>
</blockquote>
<p>Por qué entra en el if cuando &#8220;asd&#8221; es claramente diferente a 0?<br />
Porque en PHP, al estar comparando una cadena con un entero, se intenta hacer una conversión emplícita a entero de la cadena y al no poder, queda el if tal que asina:</p>
<blockquote>
<div>if (isset ($this-&gt;price) &amp;&amp; NULL == 0) $this-&gt;price = NULL;</div>
</blockquote>
<p><strong>Y ese NULL==0 se evalúa a verdadero por las reglas de comparación de PHP</strong>.<br />
Vamos que he estado dándole vueltas un rato a esto, para que ahora la solución se base en añadir un carácter convirtiendo la comparación de igualdad en una comparación de identidad:</p>
<blockquote>
<div>-        if (isset ($this-&gt;price) &amp;&amp; ($this-&gt;price == 0 || $this-&gt;type != &#8216;s&#8217;))  $this-&gt;price = NULL;<br />
+        if (isset ($this-&gt;price) &amp;&amp; ($this-&gt;price === 0 || $this-&gt;type != &#8216;s&#8217;))  $this-&gt;price = NULL;</div>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://shankao.com/2009/04/30/una-consecuencia-de-los-lenguajes-no-tipados/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Los 25 errores de programación más peligrosos</title>
		<link>http://shankao.com/2009/01/13/los-25-errores-de-programacion-mas-peligrosos/</link>
		<comments>http://shankao.com/2009/01/13/los-25-errores-de-programacion-mas-peligrosos/#comments</comments>
		<pubDate>Tue, 13 Jan 2009 16:19:07 +0000</pubDate>
		<dc:creator>shankao</dc:creator>
				<category><![CDATA[Hack]]></category>
		<category><![CDATA[bugs]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[shankao.com]]></category>
		<category><![CDATA[xkcd]]></category>

		<guid isPermaLink="false">http://shankao.com/?p=349</guid>
		<description><![CDATA[Según el estudio publicado por el insituto SANS con el apoyo de numerosas organizaciones, estos son los 25 errores más comunes que hacen de la informática un polvorín: Interacción insegura entre componentes: Validación de parámetros de entrada inapropiada Codificación o escapado de parámetros de salida inapropiados No preservar la estructura de las peticiones SQL (Inyección [...]]]></description>
			<content:encoded><![CDATA[<p>Según el estudio publicado por el insituto SANS con el apoyo de <a href="http://www.sans.org/top25errors//#s1">numerosas organizaciones</a>, estos son <a href="http://www.sans.org/top25errors//">los 25 errores más comunes</a> que hacen de la informática un polvorín:</p>
<p><span style="font-size: larger;">Interacción insegura entre componentes:</span></p>
<ul>
<li>Validación de parámetros de entrada inapropiada</li>
<li>Codificación o escapado de parámetros de salida inapropiados</li>
<li>No preservar la estructura de las peticiones SQL (Inyección de SQL)</li>
<li>No preservar la estructura de la web (Cross-Site Scripting)</li>
<li>No preservar la estructura de los comandos del sistema operativo (Inyección de comandos del SO)</li>
<li>Transmisión en claro de información sensible</li>
<li>Suplantación de identidad al hacer peticiones de información (<a href="http://es.wikipedia.org/wiki/Cross_Site_Request_Forgery">Cross-site request forgery</a>)</li>
<li>Condiciones de carrera</li>
<li>Filtrado de mensajes de error</li>
</ul>
<p><span style="font-size: larger;"><br />
Gestión de recursos arriesgada:</span></p>
<ul>
<li>No limitar las operaciones que ocurren dentro de los límites de un buffer de memoria (Buffer Over/Underflow)</li>
<li>Control externo sobre datos críticos de estado</li>
<li>Control externo sobre nombre de archivo o ruta</li>
<li>Ruta de búsqueda no confiable</li>
<li>No controlar la generación de código (Inyección de código)</li>
<li>Download de código sin chequeos de integridad</li>
<li>Cierre o liberación de recursos de manera inapropiada</li>
<li>Inicialización inapropiada</li>
<li>Calculos incorrectos</li>
</ul>
<p><span style="font-size: larger;">Malas defensas:</span></p>
<ul>
<li>Control de acceso inapropiado (autentificación)</li>
<li>Uso de un algoritmo de criptografía roto o arriesgado</li>
<li>Passwords imbuídos en el código (Hard-coded passwords)</li>
<li>Asignación de permisos insegura a un recurso crítico</li>
<li>Uso de valores aleatorios predecibles</li>
<li>Ejecución de código con privilegios innecesarios</li>
<li>Forzar contoles de seguridad del servidor en el lado del cliente</li>
</ul>
<p>Personalmente, me he encontrado con casi todos ellos en algún momento y aunque algunos pueden resultar sencillos de identificar y resolver, otros pueden llegar a dar verdaderos dolores de cabeza.</p>
<p>El de los <em>valores aleatorios</em> me ha recordado uno de los comics de <a href="http://xkcd.com/">xkcd</a>:</p>
<div style="text-align: center;"><a href="http://xkcd.com/221/"><img src="http://imgs.xkcd.com/comics/random_number.png" alt="" /></a></p>
</div>
<div style="text-align: left;"></div>
]]></content:encoded>
			<wfw:commentRss>http://shankao.com/2009/01/13/los-25-errores-de-programacion-mas-peligrosos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
