Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
Bases de datos<br />
A la hora de trabajar con selects u otros tipos de sentencias SQL es<br />
importante tener en cuenta que no deberían usarse los mé<strong>todos</strong> de<br />
cadena habituales <strong>para</strong> construir las sentencias, dado que esto nos haría<br />
vulnerables a ataques de inyección SQL, sino que en su lugar debe<br />
usarse la característica de sustitución de parámetros de DB API.<br />
Supongamos que estamos desarrollando una aplicación web con<br />
<strong>Python</strong> <strong>para</strong> un banco y que se pudiera consultar una lista de sucursales<br />
del banco en una ciudad determinada con una URL de la forma<br />
http://www.mibanco.com/sucursales?ciudad=Madrid<br />
Podríamos tener una consulta como esta:<br />
cursor.execute(“””select * from sucursales<br />
where ciudad=’” + ciudad + “’”””)<br />
A primera vista podría parecer que no existe ningún problema: no<br />
hacemos más que obtener las sucursales que se encuentren en la ciudad<br />
indicada por la variable ciudad. Pero, ¿qué ocurriría si un usuario malintencionado<br />
accediera a una URL como “http://www.mibanco.com/s<br />
ucursales?ciudad=Madrid’;SELECT * FROM contrasenyas”?<br />
Como no se realiza ninguna validación sobre los valores que puede<br />
contener la variable ciudad, sería sencillo que alguien pudiera hacerse<br />
con el control total de la aplicación.<br />
Lo correcto sería, como decíamos, utilizar la característica de sustitución<br />
de parámetros de DB API. El valor de <strong>para</strong>mstyle <strong>para</strong> el módulo<br />
sqlite3 era qmark. Esto significa que debemos escribir un signo de<br />
interrogación en el lugar en el que queramos insertar el valor, y basta<br />
pasar un segundo parámetro a execute en forma de secuencia o mapping<br />
con los valores a utilizar <strong>para</strong> que el módulo cree la sentencia por<br />
nosotros.<br />
cursor.execute(“””select * from sucursales<br />
where ciudad=?”””, (ciudad,))<br />
Por último, al final del programa se debe cerrar el cursor y la conexion:<br />
123