【问题标题】:pymssql and placeholderspymssql 和占位符
【发布时间】:2012-03-13 18:08:00
【问题描述】:

我可以在 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 交互。

谢谢,

巴里

【问题讨论】:

  • 我缺少括号,但我不需要 %s 周围的引号。
  • 啊,是的,链接的问题中也没有引号。应该多加注意。很抱歉不必要地打扰了您。
  • 但是!如果您运行 SQL Profiler 并查看传递给服务器的实际查询,它可能会帮助您确定您的查询是否安全。如果它看起来像sp_executesql 'your query', '@var definitions', arg values,那么您的方法很可能是 SQL 注入安全的。

标签: python sql-server-2005


【解决方案1】:

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

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

  1. 将该查询更改为准备好的语句(或确保内部实现这样做,但看起来不像)。

  2. 确保在查询参数周围使用 '。

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

大多数情况下...第一是关键。使用准备好的语句是抵御 SQL 注入的最重要也是最简单的防线。

一些 ORM 会为您解决其中的一些问题(请注意 some 这个词的大量使用),但我建议您在使用之前确保您了解这些问题以及如何解决这些问题像 ORM 这样的抽象。

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

【讨论】:

  • 参见stackoverflow.com/a/3410820/1335793 “不要被 %s 部分所迷惑:这不是字符串格式,而是参数替换”。这种参数替换不是 pymssql 独有的,它是 DB API 标准的一部分,并且假定是安全的。
【解决方案2】:

也许有一个更好的 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 除外。

【讨论】:

    猜你喜欢
    • 2012-12-30
    • 2013-09-28
    • 2011-11-17
    • 2014-06-06
    • 2013-04-23
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    相关资源
    最近更新 更多