pymssql和占位符

时间:2012-03-13 18:08:00

标签: python sql-server-2005

我可以将哪些占位符与pymssql一起使用。我从html查询字符串中获取我的值,因此它们都是字符串类型。关于sql注入是否安全?

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

在这种情况下使用什么机制来避免注射?

pymssql的文档没有太多...

也许有一个更好的python模块我可以用来与Sql Server 2005进行交互。

谢谢,

百里

2 个答案:

答案 0 :(得分:5)

关于SQL注入,并且不确切知道该实现是如何工作的,我会说这不安全。

要做到这一点的一些简单步骤:

  1. 将该查询更改为预准备语句(或确保实现内部执行此操作,但似乎并非如此)。

  2. 请务必使用'围绕你的查询参数。

  3. 验证参数的预期类型(如果请求参数应该是数字 确实是数字等)。

  4. 主要是......第一是关键。使用预准备语句是防止SQL注入的最重要且最简单的防线。

    有些ORM会为您解决其中的一些问题(请注意某些一词的充分用法),但我建议您确保了解这些问题以及如何工作在使用像ORM这样的抽象之前,在它们周围。

    迟早,你需要知道在那些美妙的时间节省下发生了什么。

答案 1 :(得分:4)

  

也许有一个更好的python模块我可以用来与Sql Server 2005进行交互。

好吧,我的建议是使用像SqlAlchemy这样的ORM来处理这个问题。

>>> 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()

如果您想要在有多条记录时引发异常,可以使用one(),如果您只想要第一条记录,则.first();如果您想要所有记录,则可以.all()

作为附带好处,如果您以后更改为其他DBMS,除了连接URL之外,代码将保持不变。