直接使用用户输入查询Django ORM是否安全?

3

你好,我正在手动实现一个API筛选器,用户可以筛选数据库。其中一个查询可能如下所示:

book/?writer=Anonymous,其中作家是通过HTML表单(而非Django表单)的GET请求传递的。

查找方法为:

def list(self, request, *args, **kwargs):
    if request.GET.dict():
        keys = request.GET.dict()

        if 'writer' in keys:
            queryset = Book.objects.filter(writer__name__contains=keys['writer'])
            # serialize queryset if queryset non empty else return HTTP404
            # process and return serializer data 

我的问题是,直接使用用户输入查询ORM是否安全?

如果不安全,需要在查询之前做什么?

我正在使用最小的Django Rest Framework安装版本,没有过滤器支持(出于某些奇怪的原因)。

谢谢。


你计划允许 book/?User=Admin 吗? - Sayse
https://docs.djangoproject.com/en/1.9/topics/security/#sql-injection-protection - Shang Wang
@Sayse 不,filter() 参数仅限于 ['writer', 'language', 'category', 'price'] 等,而不是用户。我的担忧是未经过滤的代码是不安全的。 - user5539517
提供REST API 可能是一个更好的想法,而且更安全,你的用户也会发现它不那么令人困惑。 - Sayse
这不是一个Rest API吗?它是为单页应用程序设计的。我相信这是一个Rest API!你为什么这么说? - user5539517
1
一个REST API可以是/book/writer/Anonymous。虽然我不一定同意Sayse的观点,但我认为查询参数对于这样的搜索查询是可以接受的。但是回答你的问题,是的,这是安全的。 - Daniel Roseman
1个回答

4

文档中提到

"Django的查询集通过使用查询参数化进行构造,从而受到SQL注入的保护。查询的SQL代码与查询的参数分别定义。由于参数可能是由用户提供并且因此不安全,因此它们会被底层数据库驱动程序转义。"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接