Избегайте опасного кода при разрешении пользователю создания фильтра MySQL - PullRequest
2 голосов
/ 16 ноября 2010

В настоящее время я могу отобразить все годы выпуска для всех фильмов в базе данных. Пользователь может выбрать год и посмотреть все фильмы, выпущенные в этом году. Или я могу показать все жанры фильма. Пользователь может выбрать жанр и просмотреть все фильмы, которые соответствуют этим критериям. Я построил форму, в которой пользователь может динамически выбирать свои критерии. Так, например, «Дата выпуска» «после» «2000» вернет отфильтрованный список.

Я написал НЕЗАКОННЫЙ код jquery / django для передачи фильтров в базу данных. Благодаря комбинации выпадающих и пользовательских полей ввода (точно так же, как в iTunes), я использую jquery для создания фильтра.

В качестве примера, скажем, пользователь выбирает в первом раскрывающемся списке: «Год». Для второго выпадающего: "есть". Последнее - это поле ввода, в котором пользователь вводит «2005». Этот критерий помещается в массив:

dictionary: 
[ 
   {"includes": [["year__iexact", "2005"]], 
    "excludes": []}, 
    "all" 
] 

«включает» / «исключает» отделяет такие критерии, как «есть», «стоит до» от таких вещей, как «нет» «all» означает, что фильтр должен «соответствовать всем», а не «соответствовать любому»

Это преобразуется в JSON:

[{"includes":[["year__iexact","2005"]],"excludes":[]},"all"]  

и опубликовано в Django.

Представление в django затем помещает данные в фильтр:

incdict[ filter[0].encode('utf-8') ] = filter[1].encode('utf-8') 

Это становится:

incdict[ 'year__iexact' ] = 2005 

Это подается в запрос (как указано здесь :

query_set = Film.objects.filter(**incdict) 

Хорошо, я надеюсь, это было ясно. Теперь я спрашиваю, как защититься от недобросовестного пользователя, который пытается обойти / использовать входные данные. Нужно ли бежать от специальных символов? Проверка данных? Каков наилучший способ защиты системы?

Ответы [ 3 ]

3 голосов
/ 16 ноября 2010

Даже если вы разрешите полностью произвольно преобразовывать данные в filter() и exclude(), невозможно создать опасный запрос из них; тип запроса определяется вызываемыми методами, а не передаваемыми данными.

3 голосов
/ 16 ноября 2010

Я бы проверил ввод, и вам придется сделать это на стороне сервера.

Возможно, если вы разделите свои условия на "__" (например, указав ["year", "iexact"]), вы можете сравнить эти значения с белым списком. Таким образом, вы можете быть уверены, что будут выполняться только ваши предварительно определенные из разрешенных запросов.

0 голосов
/ 16 ноября 2010

Несмотря на то, что пользователи не могут выполнять какие-либо явные злые запросы (удаление или получение секретных данных), вам, возможно, придется беспокоиться о том, что кто-то часто наносит удар по вашей базе данных сложными запросами (например, множественные объединения и некоторые регулярные выражения или другие выборки для неиндексированных столбцы) и ответы на них могут занять много времени.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...