Django,如果使用原始SQL,我应采取哪些步骤来避免SQL注入攻击?

时间:2014-07-15 08:42:36

标签: sql django sql-injection

我已经读过ORM应该尽量减少SQL注入攻击的可能性。但是在Django中,有时ORM有些限制,我需要使用原始SQL。我应该采取哪些措施来避免SQL注入攻击?

目前,我知道要在查询字符串中检查分号,但其他情况并不多。如果我使用参数化查询,这会解决问题吗?是否有任何库将字符串传递给,我会检查它吗?

2 个答案:

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

你必须绑定你的参数!您可以在此处找到完整的示例和解决方案指南:

http://www.djangobook.com/en/2.0/chapter20.html