2012-03-13 148 views
5

我可以在pymssql中使用哪些占位符。我从html查询字符串中获取我的值,以便它们都是字符串类型。这是安全的关于SQL注入?pymssql和占位符

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

感谢接口,

Barry

+0

我错过了括号,但是我不需要引用%s。 – Baz 2012-03-15 18:33:35

+0

啊是的,链接的问题中也没有引号。应该更加关注。对不起,你不必要地打扰你了。 – 2012-03-15 18:37:25

+0

但是!如果运行SQL Profiler并查看传递给服务器的实际查询,它可能会帮助您确定查询是否安全。如果它看起来像'sp_executesql''你的查询','@var definitions',arg values',那么很可能你的方法是SQL注入安全的。 – 2012-03-15 18:42:50

回答

4

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

一些简单的步骤来使其:

  1. 更改该查询到一份声明(或确保实施内部这样做,但似乎并不像它)。

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

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

大多数......第一个是关键。使用预准备语句是防止SQL注入最重要也是最容易的一道防线。

一些ORM的照顾部分这些问题对你(注意充足的用字一些),但我会建议确保你知道这些问题,以及如何使用抽象像之前解决它们ORM。

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

3

也许有更好的Python模块,我可以使用与SQL Server 2005

好接口,我的建议是使用ORM SQLAlchemy的一样来处理这一点。

>>> 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。