28.11.2012 Views

De la Seguridad del acceso a datos en aplicaciones ASP ... - Willy .Net

De la Seguridad del acceso a datos en aplicaciones ASP ... - Willy .Net

De la Seguridad del acceso a datos en aplicaciones ASP ... - Willy .Net

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Más información<br />

Para obt<strong>en</strong>er todos los detalles de implem<strong>en</strong>tación de esta opción, consulte "Cómo<br />

utilizar <strong>la</strong> aut<strong>en</strong>ticación mediante Formu<strong>la</strong>rios con SQL Server 2000" <strong>en</strong> <strong>la</strong> sección<br />

Refer<strong>en</strong>cia de esta guía.<br />

Ataques de inyección SQL<br />

Si utiliza <strong>la</strong> aut<strong>en</strong>ticación mediante Formu<strong>la</strong>rios <strong>en</strong> una base de <strong>datos</strong> SQL, debería<br />

tomar <strong>la</strong>s precauciones que se describ<strong>en</strong> <strong>en</strong> esta sección para evitar ataques de<br />

inyección SQL. La inyección SQL es el acto de pasar código SQL adicional (y<br />

dañino) a una aplicación, que suele agregarse al código SQL legítimo de <strong>la</strong><br />

aplicación. Todas <strong>la</strong>s bases de <strong>datos</strong> SQL pued<strong>en</strong> ser objeto de <strong>la</strong> inyección SQL <strong>en</strong><br />

mayor o m<strong>en</strong>or medida, pero este capítulo se c<strong>en</strong>tra <strong>en</strong> SQL Server.<br />

<strong>De</strong>bería prestar especial at<strong>en</strong>ción a <strong>la</strong> posibilidad de recibir ataques de inyección<br />

SQL cuando procese acciones de usuario que form<strong>en</strong> parte de un comando SQL. Si<br />

el esquema de aut<strong>en</strong>ticación se basa <strong>en</strong> <strong>la</strong> validación de usuarios <strong>en</strong> una base de<br />

<strong>datos</strong> SQL, por ejemplo, si utiliza <strong>la</strong> aut<strong>en</strong>ticación mediante Formu<strong>la</strong>rios <strong>en</strong> SQL<br />

Server, debe protegerse de los ataques de inyección SQL.<br />

Si crea cad<strong>en</strong>as SQL con <strong>en</strong>trada no filtrada, <strong>la</strong> aplicación puede ser objeto de una<br />

<strong>en</strong>trada <strong>del</strong> usuario malint<strong>en</strong>cionada (recuerde que nunca debe confiar <strong>en</strong> <strong>la</strong>s<br />

<strong>en</strong>tradas <strong>del</strong> usuario). El riesgo <strong>en</strong> este caso es que al insertar <strong>la</strong> <strong>en</strong>trada <strong>del</strong> usuario<br />

<strong>en</strong> una cad<strong>en</strong>a que se convierte <strong>en</strong> una instrucción ejecutable, un usuario<br />

malint<strong>en</strong>cionado puede agregar comandos SQL a <strong>la</strong>s instrucciones SQL pret<strong>en</strong>didas,<br />

mediante caracteres de escape.<br />

Los fragm<strong>en</strong>tos de código de <strong>la</strong>s sigui<strong>en</strong>tes secciones utilizan <strong>la</strong> base de <strong>datos</strong> Pubs<br />

que suministra SQL Server para mostrar ejemplos de inyección SQL.<br />

Problema<br />

La aplicación debe ser susceptible de recibir ataques de inyección SQL al incorporar<br />

<strong>en</strong>tradas <strong>del</strong> usuario u otros <strong>datos</strong> desconocidos <strong>en</strong> consultas de base de <strong>datos</strong>. Por<br />

ejemplo, los dos fragm<strong>en</strong>tos de código sigui<strong>en</strong>tes son susceptibles de recibir un<br />

ataque.<br />

Crea instrucciones SQL con acciones <strong>del</strong> usuario sin filtrar.<br />

SqlDataAdapter myCommand = new SqlDataAdapter(<br />

"SELECT au_lname, au_fname FROM authors WHERE au_id = '" +<br />

Login.Text + "'", myConnection);<br />

L<strong>la</strong>ma a un procedimi<strong>en</strong>to almac<strong>en</strong>ado g<strong>en</strong>erando una única cad<strong>en</strong>a que<br />

incorpore acciones <strong>del</strong> usuario sin filtrar.<br />

SqlDataAdapter myCommand = new SqlDataAdapter("LoginStoredProcedure '" +<br />

Login.Text + "'", myConnection);<br />

Anatomía de un ataque de inyección de cad<strong>en</strong>as SQL<br />

Cuando se aceptan los valores de <strong>en</strong>trada <strong>del</strong> usuario sin filtrar <strong>en</strong> <strong>la</strong> aplicación<br />

(como se muestra anteriorm<strong>en</strong>te), un usuario malint<strong>en</strong>cionado puede utilizar<br />

caracteres de escape para agregar sus propios comandos.<br />

Pi<strong>en</strong>se, por ejemplo, <strong>en</strong> una consulta SQL que espera que <strong>la</strong> <strong>en</strong>trada <strong>del</strong> usuario sea<br />

un número de <strong>la</strong> seguridad social como 172-32-xxxx y que ti<strong>en</strong>e el sigui<strong>en</strong>te aspecto:

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!