如果使用本机 ORM,如何避免 SQL Django Rest API 中的注入攻击?

How do you avoid SQL Injection attacks in your Django Rest APIs if using native ORM?

他们说通过使用 Django ORM,您已经可以抵御大多数 SQL 注入攻击。但是,我想知道是否应该或可以使用任何其他措施来处理用户输入?有没有类似漂白剂的图书馆?

使用 Django ORM 的主要危险在于,您可能会为用户提供一个强大的工具来 select、过滤和聚合任意字段。

事实上,例如,假设您制作了一个表单,使用户能够 select 将字段 return,那么您可以将其实现为:

data = MyModel.objects.values(*request.GET<strong>.getlist('fields')</strong>)

如果 MyModel 有一个 ForeignKey 给名为 owner 的用户模型,那么用户可以伪造一个以 owner__password 作为字段的请求,从而检索 ( 散列) 密码。虽然 Django 为其默认 User 模型存储了一个散列密码,但这仍然意味着散列数据已公开,并且可能更容易检索密码。

但即使没有用户模型,也可能导致用户可以在使用敏感数据链接的地方伪造请求,从而获取大量敏感数据。任意过滤、注释、聚合等也会发生同样的情况。

因此您应该做的是保留一个可接受值的列表,并检查请求是否仅包含这些值,例如:

acceptable = {'title', 'description', 'created_at'}
data = [field for field in request.GET.getlist('fields') <b>if field in acceptable</b>]
data = MyModel.objects.values(*data)

例如,如果您使用 django-filter [readthedocs.io] 这样的包,您会列出 可以 过滤的字段以及可以对这些字段执行哪些查找。 request.GET 中的其他数据将被忽略,从而防止使用任意字段进行过滤。