<?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>Jose María Flores Zazo (MAD 1977) &#187; SQL</title>
	<atom:link href="http://jmfloreszazo.com/tag/sql/feed/" rel="self" type="application/rss+xml" />
	<link>http://jmfloreszazo.com</link>
	<description>digital creative &#38; software developer - creativo digital &#38; desarrollador de software</description>
	<lastBuildDate>Tue, 07 Sep 2010 07:58:31 +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>Inyección de SQL</title>
		<link>http://jmfloreszazo.com/inyeccion-de-sql/</link>
		<comments>http://jmfloreszazo.com/inyeccion-de-sql/#comments</comments>
		<pubDate>Fri, 09 Oct 2009 10:00:54 +0000</pubDate>
		<dc:creator>Jose María Flores Zazo</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Artículos]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[JAVA]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[Tecnologías]]></category>
		<category><![CDATA[VB.Net]]></category>

		<guid isPermaLink="false">http://jmfloreszazo.com/?p=390</guid>
		<description><![CDATA[La vulnerabilidad más importante y que menos se tiene en cuenta a la hora de trabajar con bases de datos, es la inyección de sentencias SQL. Una inyección de SQL se da cuando se inserta una sentencia de SQL dentro de otra sentencia SQL, esta invasión, logra alterar el funcionamiento normal y permite la ejecución [...]<p><a href="http://jmfloreszazo.com/inyeccion-de-sql/">Inyección de SQL</a> es una entrada de <a href="http://jmfloreszazo.com">Jose Maria Flores Zazo</a></p>
]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter" src="http://jmfloreszazo.com/resources/img/categorias/desarrollol.jpg" alt="" width="588" /></p>
<p>La vulnerabilidad más importante y que menos se tiene en cuenta a la hora de trabajar con bases de datos, es la inyección de sentencias SQL.</p>
<p><strong>Una inyección de SQL se da cuando se inserta una sentencia de SQL dentro de otra sentencia SQL, esta invasión, logra alterar el funcionamiento normal y permite la ejecución de código malintencionado.</strong></p>
<p>Este problema no puede considerarse como un problema de seguridad informática, es un problema derivado del programador, es un error de programación. Generalmente la falta e conocimientos, ignorancia sobre problemáticas de SQL o un simple descuido, dejarán una aplicación abierta a la entrada de código malicioso. El error se debe a la inexistencia de validación de los datos que han entrado desde una aplicación.</p>
<p>A continuación con un sencillo ejemplo, veremos en qué consiste la Inyección de SQL.</p>
<p>Supongamos que tenemos un portal de empleados en nuestra intranet (aplicación web) con una casilla donde el empleado debe poner su correspondiente código.</p>
<p>El uso normal de cualquier usuario bienintencionado es poner su código y su clave, para entrar en su sesión para realizar el trabajo diario. El de un usuario mal intencionado, con conocimientos de informática y habiendo detectado que es posible ejecutar código inyectado, podrá ser bien distinto.</p>
<p>Internamente el programa informático realiza una consulta similar a esta:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> Empleados <span style="color: #993333; font-weight: bold;">WHERE</span> Codigo_Empleado <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#91;</span>Valor de la Casilla<span style="color: #66cc66;">&#93;</span></pre></td></tr></table></div>

<p>Cuando nuestro programa no está preparado para evitar código inyectado, el usuario malintencionado podría añadir en la casilla el siguiente valor:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #66cc66;">&#91;</span>Valor de la Casilla<span style="color: #66cc66;">&#93;</span>; <span style="color: #993333; font-weight: bold;">DROP</span> <span style="color: #993333; font-weight: bold;">TABLE</span> Empleados;</pre></td></tr></table></div>

<p>Donde [Valor de la Casilla] seguiría siendo algo que espera el programa original, pero no lo que viene a continuación del “;”. En este caso habríamos borrado todos los datos de inicio de sesión de usuarios y sería imposible que en esa empresa algún trabajador desarrollar su labor diaria.</p>
<p>Como evitarlo en <a title="Sitio oficial de PHP" href="http://es2.php.net/" target="_blank"><strong>PHP</strong></a>:</p>
<p>Dependiendo del motor de base de datos que estemos usando, deberemos ir a la documentación para implementar esta protección. En el caso de MySQL, debemos usar la unción <a title="Ampliar información de la función" href="http://es2.php.net/mysql_real_escape_string" target="_blank">mysql_real_escape_string</a>.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$query_result</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_query</span>
<span style="color: #009900;">&#40;</span>
  <span style="color: #0000ff;">&quot;SELECT * FROM EMPLEADOS WHERE CodigoEmpleado = <span style="color: #000099; font-weight: bold;">\&quot;</span>&quot;</span>
  <span style="color: #990000;">mysql_real_escape_string</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$codigo_empleado</span><span style="color: #009900;">&#41;</span>
  <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\&quot;</span>&quot;</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Como evitarlo en VISUAL STUDIO .NET (<a title="Sitio oficial de VB.NET" href="http://msdn.microsoft.com/es-es/vbasic/default.aspx" target="_blank"><strong>VB.NET</strong></a>):</p>
<p>En este lenguaje y derivados de la plataforma .NET, dependiendo del método de trabajo que usemos, podemos independizarnos del sistema gestor de bases de datos, es decir, es el lenguaje el encargado de validar las sentencias.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="vbnet" style="font-family:monospace;"><span style="color: #008080; font-style: italic;">'// Creamos una consulta</span>
<span style="color: #0600FF;">Dim</span> cmd <span style="color: #FF8000;">As</span> <span style="color: #FF8000;">New</span> SqlCommand<span style="color: #000000;">&#40;</span> _
  <span style="color: #808080;">&quot;SELECT * FROM EMPLEADOS &quot;</span> <span style="color: #008000;">&amp;</span>amp; _
  <span style="color: #808080;">&quot;WHERE CodigoEmpleado = @CodigoEmpleado&quot;</span>, cnn<span style="color: #000000;">&#41;</span>
<span style="color: #008080; font-style: italic;">'// Abrimos la conexión</span>
cnn.<span style="color: #0600FF;">Open</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
<span style="color: #008080; font-style: italic;">'// Añadimos el valor del parámetro de la consulta</span>
cmd.<span style="color: #0000FF;">Parameters</span>.<span style="color: #0000FF;">AddWithValue</span><span style="color: #000000;">&#40;</span><span style="color: #808080;">&quot;@CodigoEmpleado&quot;</span>, txtCodigoEmpleado.<span style="color: #0000FF;">Text</span><span style="color: #000000;">&#41;</span></pre></td></tr></table></div>

<p>Como evitarlo en:</p>
<ul>
<li><a title="How To: Protect From SQL Injection in ASP.NET" href="http://msdn.microsoft.com/en-us/library/ms998271.aspx" target="_blank">ASP.NET</a></li>
<li><a title="Preventing SQL Injection in Java" href="http://www.owasp.org/index.php/Preventing_SQL_Injection_in_Java" target="_blank">JAVA</a></li>
</ul>
<p><a href="http://jmfloreszazo.com/inyeccion-de-sql/">Inyección de SQL</a> es una entrada de <a href="http://jmfloreszazo.com">Jose Maria Flores Zazo</a></p>
]]></content:encoded>
			<wfw:commentRss>http://jmfloreszazo.com/inyeccion-de-sql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
