我可以将哪些占位符与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进行交互。
谢谢,
百里
答案 0 :(得分:5)
关于SQL注入,并且不确切知道该实现是如何工作的,我会说这不安全。
要做到这一点的一些简单步骤:
将该查询更改为预准备语句(或确保实现内部执行此操作,但似乎并非如此)。
请务必使用'围绕你的查询参数。
验证参数的预期类型(如果请求参数应该是数字 确实是数字等)。
主要是......第一是关键。使用预准备语句是防止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之外,代码将保持不变。