Передача введенных пользователем данных в Queryset.filter () - это безопасно? - PullRequest
0 голосов
/ 19 апреля 2019

У меня есть страница, которая берет параметры GET из своего URL и передает их непосредственно в REST API.Таким образом, URL-адрес страницы выглядит следующим образом:

foo.com/pizzas/?toppings=mushrooms&toppings=sausage

Когда страница загружается, она принимает параметры GET и передает их в API REST, например:

foo.com/totally/unrelated/url/?toppings=mushrooms&toppings=sausage

На бэкэнде яхочу извлечь их и отфильтровать на их основе.Это в основном то, что у меня есть сейчас:

# inside a django rest framework ModelViewSet
#   it's not really relevant other than that self.request exists
def get_queryset(self):
    queryset = self.model.objects.all()
    for param in self.request.query_params:
        # param = "toppings"
        if not self.is_real_model_field(param):  # assume this works
            continue
        param_value_list = self.request.query_params.getlist(param)
        # param_value_list = ['mushrooms', 'sausage']
        queryset = queryset.filter(
            f"{param}__in": param_value_list
        )
    return queryset

Я сказал, что факт, что это Django Rest Framework, не имеет значения, но я не уверен на 100% в этом.В приведенном выше примере request.query_params добавляется Django Rest Framework, но на основе документации DRF здесь Я считаю, что это просто псевдоним встроенного в Django request.GET.

ИтакЭто безопасно делать в Джанго?Злоумышленник может напрямую манипулировать URL.Я предполагаю, что QuerySet.filter(field__in: values) django автоматически выполнит некоторую очистку для вас, и / или ограниченный набор символов URL-адреса поможет предотвратить появление чего-либо неприятного, но я не смог найти никаких ресурсов, обсуждающих проблему.

1 Ответ

1 голос
/ 19 апреля 2019

Посмотрите на пакет django_filters .Он делает то, что вы хотите, и вам не нужно изобретать велосипед.

Используя этот пакет, вы можете перечислить все фильтруемые поля.Этот пакет также добавляет проверку значения параметра запроса.

...