我已经读过ORM应该尽量减少SQL注入攻击的可能性。但是在Django中,有时ORM有些限制,我需要使用原始SQL。我应该采取哪些措施来避免SQL注入攻击?
目前,我知道要在查询字符串中检查分号,但其他情况并不多。如果我使用参数化查询,这会解决问题吗?是否有任何库将字符串传递给,我会检查它吗?
答案 0 :(得分:5)
documentation states以下内容:
如果需要执行参数化查询,可以使用参数
raw()
的参数:
>>> lname = 'Doe'
>>> Person.objects.raw('SELECT * FROM myapp_person WHERE last_name = %s', [lname])
params
是参数列表或字典。你会用%s
列表的查询字符串中的占位符,或%(key)s
占位符 对于字典(其中键被字典键替换,其中) 当然),无论你的数据库引擎如何。这样的占位符将是 用params参数中的参数替换。
这也是使用Python的DB-API传递参数的标准方法,它将正确地清理您的查询。
无论你做什么,都不要进行字符串插值。
答案 1 :(得分:1)
你必须绑定你的参数!您可以在此处找到完整的示例和解决方案指南: