离线访问Django的SQL Purifier

时间:2011-12-29 03:35:08

标签: python sql database django sql-injection

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清理程序处理基于参数的查询,但如果我将其用于脱机应用程序,我怎么能够访问这些方法并在第一个中避免这种情况地点?有人这样做吗?

2 个答案:

答案 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