python - 如果使用 native ORM,如何避免 Django Rest API 中的 S

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

最佳答案

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

确实,例如,假设您制作了一个表单,使用户能够选择要返回的字段,那么您可以将其实现为:

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中的其他数据将被忽略,因此将防止使用任意字段进行过滤。

关于python - 如果使用 native ORM,如何避免 Django Rest API 中的 SQL 注入(inject)攻击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69956620/

相关文章:

memory-management - Datadog % 内存使用率和 RSS 内存

javascript - 使用 Vite 构建的 React.js 不包含 service-work

c++ - 如何使用 Boost 在缓冲区中进行二进制序列化

ruby-on-rails - `gem install sqlite3` 告诉我 `brew in

c# - 为什么 AWS Lambda 环境中的 EPPlus Excel 库会抛出 "The ty

clang-tidy - 如何在 `clang-apply-replacements` 生成的变更集

node.js - TypeORM:自定义多对多关系

r - 使用 spsurvey 在多边形内绘制 GRTS 点

python - 如何将cookie从flask设置为reactjs

flutter - Vscode 不将 chrome 显示为设备