cursor.execute("SELECT word_id from words where word_name = '%s'" %
(word))
if cursor.fetchone() == None:
return False
return True
我原以为在'
格式参数关闭时包含显式%s
可能会阻止此操作,但
"'best'; DELETE * FROM words;"
将是一个非常讨厌的字符串来搜索!我知道Django
始终建议通过防篡改SQL清理程序处理基于参数的查询,但如果我将其用于脱机应用程序,我怎么能够访问这些方法并在第一个中避免这种情况地点?有人这样做吗?
答案 0 :(得分:4)
如果您不是从django应用程序执行此操作,那么您不需要依赖django的API来保护您免受SQL注入攻击。您正在使用的db API将提供自己的方法,以便将参数安全地输入到SQL查询中。例如,如果您使用的是SQLite,则可以参考http://docs.python.org/library/sqlite3.html中的文档来了解如何安全地构造参数化SQL语句:
# Never do this -- insecure!
symbol = 'IBM'
c.execute("... where symbol = '%s'" % symbol)
# Do this instead
t = (symbol,)
c.execute('select * from stocks where symbol=?', t)
答案 1 :(得分:1)
您是否无法使用raw()
经理执行查询?这仍然会使用Django的SQL清理功能,但允许您针对您的模型运行原始SQL查询。
在这种情况下,我假设模型名为'Word',所以
Word.objects.raw("SELECT word_id from words where word_name = %s", [word])
应该工作得很好。请注意,您使用word作为参数而不是直接字符串,这可以保护您。 raw()
的文档位于here