<?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>reycarlos.com &#187; sql</title>
	<atom:link href="http://www.reycarlos.com/tag/sql/feed" rel="self" type="application/rss+xml" />
	<link>http://www.reycarlos.com</link>
	<description>Blog Personal del Rey Carlitoz con Z</description>
	<lastBuildDate>Sun, 17 Apr 2011 21:57:58 +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>Tengan cuidado programadores a la hora de hacer un sistema con BD mySQL</title>
		<link>http://www.reycarlos.com/tengan-cuidado-programadores-a-la-hora-de-hacer-un-sistema-con-bd-mysql</link>
		<comments>http://www.reycarlos.com/tengan-cuidado-programadores-a-la-hora-de-hacer-un-sistema-con-bd-mysql#comments</comments>
		<pubDate>Sun, 12 Apr 2009 21:21:40 +0000</pubDate>
		<dc:creator>carlos</dc:creator>
				<category><![CDATA[Informatica Internet]]></category>
		<category><![CDATA[base datos]]></category>
		<category><![CDATA[error]]></category>
		<category><![CDATA[injection]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://www.reycarlos.com/?p=226</guid>
		<description><![CDATA[<!-- GООООООО -->  Inyección SQL es una vulnerabilidad informática en el nivel de la validación de las entradas a la base de datos de una aplicación. El origen es el filtrado incorrecto de las variables utilizadas en las partes del programa con código SQL. Es, de hecho, un error de una clase más general de vulnerabilidades que puede ocurrir en cualquier lenguaje de [...]]]></description>
			<content:encoded><![CDATA[<p> </p>
<p><strong>Inyección SQL</strong> es una <a class="new" title="Vulnerabilidad informática (aún no redactado)" href="http://es.wikipedia.org/w/index.php?title=Vulnerabilidad_inform%C3%A1tica&amp;action=edit&amp;redlink=1">vulnerabilidad informática</a> en el nivel de la validación de las entradas a la <a title="Base de datos" href="http://es.wikipedia.org/wiki/Base_de_datos">base de datos</a> de una aplicación. El origen es el filtrado incorrecto de las variables utilizadas en las partes del programa con código SQL. Es, de hecho, un error de una clase más general de vulnerabilidades que puede ocurrir en cualquier <a title="Lenguaje de programación" href="http://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3n">lenguaje de programación</a> o de <a class="mw-redirect" title="Lenguaje interpretado" href="http://es.wikipedia.org/wiki/Lenguaje_interpretado">script</a> que esté incrustado dentro de otro.<a href="http://www.reycarlos.com/wp-content/uploads/2009/04/28l6x38.jpg"><img class="alignright size-medium wp-image-227" title="28l6x38" src="http://www.reycarlos.com/wp-content/uploads/2009/04/28l6x38-199x300.jpg" alt="" width="199" height="300" /></a></p>
<p>Una inyección SQL sucede cuando se inserta o &#8220;inyecta&#8221; un código <a title="SQL" href="http://es.wikipedia.org/wiki/SQL">SQL</a> &#8221;invasor&#8221; dentro de otro código <a title="SQL" href="http://es.wikipedia.org/wiki/SQL">SQL</a> para alterar su funcionamiento normal, y hacer que se ejecute maliciosamente el código &#8220;invasor&#8221; en la<a title="Base de datos" href="http://es.wikipedia.org/wiki/Base_de_datos">base de datos</a>.</p>
<p>La inyección SQL es un problema de <a title="Seguridad informática" href="http://es.wikipedia.org/wiki/Seguridad_inform%C3%A1tica">seguridad informática</a> que debe ser tomado en cuenta por el <a title="Programador" href="http://es.wikipedia.org/wiki/Programador">programador</a> para prevenirlo. Un <a class="mw-redirect" title="Programa informático" href="http://es.wikipedia.org/wiki/Programa_inform%C3%A1tico">programa</a> hecho con descuido, displicencia, o con ignorancia sobre el problema, podrá ser vulnerable y la seguridad del sistema puede quedar ciertamente comprometida. Esto puede suceder tanto en programas ejecutándose en <a title="Computadora" href="http://es.wikipedia.org/wiki/Computadora">computadores</a> de escritorio, como en <a title="Página web" href="http://es.wikipedia.org/wiki/P%C3%A1gina_web">páginas Web</a>, ya que éstas pueden funcionar mediante programas ejecutándose en el <a class="mw-redirect" title="Servidor informático" href="http://es.wikipedia.org/wiki/Servidor_inform%C3%A1tico">servidor</a> que las aloja.</p>
<p>La vulnerabilidad puede ocurrir cuando un <a class="mw-redirect" title="Programa informático" href="http://es.wikipedia.org/wiki/Programa_inform%C3%A1tico">programa</a> &#8221;arma&#8221; descuidadamente una <a title="SQL" href="http://es.wikipedia.org/wiki/SQL#Ejemplos_de_consultas_SQL">sentencia SQL</a>, con parámetros dados por el usuario, para luego hacer una consulta a una <a title="Base de datos" href="http://es.wikipedia.org/wiki/Base_de_datos">base de datos</a>. Dentro de los parámetros dados por el usuario podría venir el código <a title="SQL" href="http://es.wikipedia.org/wiki/SQL">SQL</a> inyectado.</p>
<p>Al ejecutarse esa consulta por la <a title="Base de datos" href="http://es.wikipedia.org/wiki/Base_de_datos">base de datos</a>, el código <a title="SQL" href="http://es.wikipedia.org/wiki/SQL">SQL</a> inyectado también se ejecutará y podría hacer un sinnúmero de cosas, como insertar registros, modificar o eliminar datos, autorizar accesos e, incluso, ejecutar código malicioso en el computador.</p>
<p>Asumiendo que el siguiente código está en una <a title="Aplicación web" href="http://es.wikipedia.org/wiki/Aplicaci%C3%B3n_web">aplicación web</a> y que existe un parámetro &#8220;nombreUsuario&#8221; que contiene el nombre de usuario que nosotros le demos, la inyección SQL es posible:</p>
<pre>consulta := "<span style="color: #008000;">SELECT * FROM usuarios WHERE nombre = '</span>" + <span style="color: #0000ff;">nombreUsuario</span> + "<span style="color: #008000;">';</span>"</pre>
<p>Si el usuario escribe su nombre, digamos &#8220;Alicia&#8221;, nada anormal sucedería, la aplicación generaría una sentencia SQL similar a la siguiente, que es perfectamente correcta, en donde se seleccionaría al usuario &#8220;Alicia&#8221;:</p>
<pre><span style="color: #008000;">SELECT * FROM usuarios WHERE nombre = '<span style="color: #0000ff;">Alicia</span>';</span></pre>
<p>Pero si un usuario malintencionado escribe como nombre de usuario:<br />
&#8220;<code><span style="color: #0000ff;">Alicia</span><span style="color: #ff0000;">'; DROP TABLE usuarios; SELECT * FROM datos WHERE '-' = '-</span></code>&#8220;, se generaría la siguiente consulta SQL, (el color verde es lo que pretende el programador, el azul es el dato, y el rojo, el código SQL inyectado):</p>
<pre><span style="color: #008000;">SELECT * FROM usuarios WHERE nombre = '</span><span style="color: #0000ff;">Alicia</span><span style="color: #ff0000;">';
DROP TABLE usuarios;
SELECT * FROM datos WHERE '-' = '-</span><span style="color: #008000;">';</span></pre>
<p>La base de datos ejecutaría la consulta en orden, seleccionaría el usuario &#8216;Alicia&#8217;, borraría la tabla &#8216;usuarios&#8217; y seleccionaría datos que quizá no están disponibles para los usuarios web comunes. En resumen, cualquier dato de la base de datos está disponible para ser leído o modificado por un usuario malintencionado.</p>
<p>Nótese por qué se llama &#8220;<strong>Inyección</strong>&#8221; SQL. Si observamos el código malicioso, de color rojo, vemos que está en el medio del código bueno, el verde. El código rojo ha sido &#8220;<strong>inyectado</strong>&#8221; dentro del verde.</p>
<p><a id="Ejemplos" name="Ejemplos"></a></p>
<h2><span class="mw-headline">Ejemplos</span> <span class="editsection">[<a title="Editar sección: Ejemplos" href="http://es.wikipedia.org/w/index.php?title=Inyecci%C3%B3n_SQL&amp;action=edit&amp;section=1">editar</a>]</span></h2>
<p>La inyección SQL es fácil de evitar en la mayoría de los <a title="Lenguaje de programación" href="http://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3n">lenguajes de programación</a> que desarrollan aplicaciones web. En <a title="Perl" href="http://es.wikipedia.org/wiki/Perl">Perl</a> DBI, el método <tt>DBI::quote</tt> filtra los caracteres especiales (asumiendo que la variable<tt>$sql</tt> contiene una referencia a un objeto DBI)</p>
<pre>$query = $sql-&gt;prepare
  (
        "SELECT * FROM usuarios WHERE nombre = "
    .
        $sql-&gt;quote($nombre_usuario)
   );</pre>
<p>O también se puede usar la característica <em>placeholder</em> (con comillado automático) como sigue:</p>
<pre>$query = $sql-&gt;prepare("SELECT * FROM usuario WHERE nombre = ?");
$query-&gt;execute($nombre_usuario);</pre>
<p>En <a title="PHP" href="http://es.wikipedia.org/wiki/PHP">PHP</a>, hay diferentes funciones que nos pueden servir de ayuda para usar con distintos <a title="Sistema de gestión de base de datos" href="http://es.wikipedia.org/wiki/Sistema_de_gesti%C3%B3n_de_base_de_datos">sistemas de gestión de bases de datos</a>. Para <a title="MySQL" href="http://es.wikipedia.org/wiki/MySQL">MySQL</a>, la función a usar es <tt>mysql_real_escape_string</tt>:</p>
<pre>$query_result = mysql_query
  (
        "SELECT * FROM usuarios WHERE nombre = \""
    .
        mysql_real_escape_string($nombre_usuario)
    .
        "\""
   );</pre>
<p>En <a title="Lenguaje de programación Java" href="http://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3n_Java">Java</a>, tenemos que usar la clase <tt>PreparedStatement</tt> :</p>
<p>En vez de</p>
<pre>Connection con = (acquire Connection)
Statement stmt = con.createStatement();
ResultSet rset = stmt.executeQuery("SELECT * FROM usuarios WHERE nombre = '" + nombreUsuario + "';");</pre>
<p>hay que usar lo siguiente:</p>
<pre>Connection con = (acquire Connection)
PreparedStatement pstmt = con.prepareStatement("SELECT * FROM usuarios WHERE nombre = ?");
pstmt.setString(1, nombreUsuario);
ResultSet rset = pstmt.executeQuery();</pre>
<p>En <a title="C Sharp" href="http://es.wikipedia.org/wiki/C_Sharp">C#</a>, de la plataforma <a class="mw-redirect" title=".NET" href="http://es.wikipedia.org/wiki/.NET">.NET</a> (o su alternativa libre <a title="Proyecto Mono" href="http://es.wikipedia.org/wiki/Proyecto_Mono">Mono</a>), tenemos <a title="ADO.NET" href="http://es.wikipedia.org/wiki/ADO.NET">ADO.NET</a> <tt>SqlCommand</tt> (para <a title="Microsoft" href="http://es.wikipedia.org/wiki/Microsoft">Microsoft</a> <a class="mw-redirect" title="SQL Server" href="http://es.wikipedia.org/wiki/SQL_Server">SQL Server</a>) or <tt>OracleCommand</tt> (para servidores de bases de datos Oracle). El ejemplo de abajo muestra cómo prevenir los ataques de inyección de código usando el objeto SqlCommand. El código para ADO.NET se programa de forma similar, pero puede variar levemente según la implementación específica de cada proveedor.</p>
<p>En vez de</p>
<pre>using( SqlConnection con = (acquire connection) ) {
    con. Open();
    using( SqlCommand cmd = new SqlCommand("SELECT * FROM usuarios WHERE nombre = '" + nombreUsuario + "'", con) ) {
       using( SqlDataReader rdr = cmd.ExecuteReader() ){
           ...
       }
    }
}</pre>
<p>hay que usar lo siguiente:</p>
<pre>using( SqlConnection con = (acquire connection) ) {
    con. Open();
    using( SqlCommand cmd = new SqlCommand("SELECT * FROM usuarios WHERE nombre = @nombreUsuario", con) ) { 

       cmd.Parameters.AddWithValue("@nombreUsuario", nombreUsuario); 

       using( SqlDataReader rdr = cmd.ExecuteReader() ){
           ...
       }
    }
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.reycarlos.com/tengan-cuidado-programadores-a-la-hora-de-hacer-un-sistema-con-bd-mysql/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

