2012-03-13 12 views
5

Qué marcadores de posición puedo usar con pymssql. Obtengo mis valores de la cadena de consulta html para que todos sean de tipo cadena. ¿Es esto seguro con respecto a la inyección sql?pymssql y marcadores de posición

query = dictify_querystring(Response.QueryString) 
employeedata = conn.execute_row("SELECT * FROM employees WHERE company_id=%s and name = %s", (query["id"], query["name"])) 

¿Qué mecanismo se utiliza en este caso para evitar las inyecciones?

No hay mucho en el camino de la documentación para pymssql ...

Tal vez hay un módulo de Python mejor que podría utilizar para interactuar con SQL Server 2005.

Gracias,

Barry

+0

Me faltaban los paréntesis, pero no necesito cotizaciones alrededor de% s. – Baz

+0

Ah, sí, tampoco hubo citas en la pregunta vinculada. Debería haber prestado más atención. Perdón por haberte molestado innecesariamente. –

+0

¡Pero!Puede ayudarle a averiguar si su consulta es segura si ejecutó SQL Profiler y echó un vistazo a la consulta real que se pasó al servidor. Si parece 'sp_executesql 'su consulta', '@var definiciones', valores de arg', entonces lo más probable es que su método sea seguro para inyección SQL. –

Respuesta

4

En cuanto a la inyección SQL, y al no saber exactamente cómo funciona esa implementación, diría que eso no es seguro.

Algunos pasos sencillos para que sea así:

  1. cambio que consulta en una declaración preparada (o asegúrese de que la aplicación hace internamente de modo, pero no parece como él).

  2. Asegúrese de utilizar 'alrededor de los argumentos de su consulta.

  3. Valide el tipo esperado de sus argumentos (si los parámetros de solicitud que deben ser numéricos son de hecho numéricos, etc.).

Mayormente ... el número uno es la clave. El uso de declaraciones preparadas es la línea de defensa más importante y probablemente más fácil contra la inyección de SQL.

de algunos ORM hacerse cargo de algunas de estas cuestiones para usted (nota del amplio uso de la palabra algunos), pero yo aconsejaría asegurarse de que conoce estos problemas y cómo trabajar alrededor de ellos antes de usar una abstracción como una ORM

Tarde o temprano, necesita saber qué está sucediendo bajo esas maravillosas capas de ahorro de tiempo.

3

tal vez hay un módulo de Python mejor que podría utilizar para interactuar con SQL Server 2005.

Bueno, mi consejo está utilizando un ORM como sqlalchemy manejar esto.

>>> from sqlalchemy.ext.sqlsoup import SqlSoup 
>>> db = SqlSoup('mssql:///DATABASE?PWD=yourpassword&UID=some_user&dsn=your_dsn') 
>>> employeedata = db.employees.filter(db.employees.company_id==query["id"])\ 
           .filter(db.employees.name==query["name"]).one() 

Puede utilizar one() si desea lanzar una excepción si hay más de un registro, .first() si desea que sólo el primer registro o .all() si desea que todos los registros.

Como beneficio adicional, si luego cambia a otro DBMS, el código seguirá siendo el mismo excepto para la URL de conexión.

Cuestiones relacionadas