23.11.2012 Views

Python para todos

Python para todos

Python para todos

SHOW MORE
SHOW LESS

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

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

Saved successfully!

Ooh no, something went wrong!