Запретить внедрение SQL, когда SQL предоставляется из запроса - PullRequest
0 голосов
/ 03 октября 2019

Компания, в которой я работаю, использует REST API для доступа к базе данных. Таким образом, вы просто предоставляете строку оператора SQL, а REST API возвращает Datatable. Теперь я не уверен, как предотвратить внедрение SQL, поскольку не могу сгенерировать команду SQL с использованием параметров (как обычно), поскольку мне нужно предоставить строку оператора SQL для REST API.

1 Ответ

3 голосов
/ 03 октября 2019

Единственный способ сделать это безопасным - это белый список определенного списка предварительно проверенных запросов SQL. API REST сравнил бы ввод с белым списком. Если SQL-запрос является одним из известных запросов в белом списке, он может выполняться. В противном случае API возвращает статус ошибки (я бы использовал 400 BAD REQUEST).

Но я полагаю, что цель API - запустить любой SQL-оператор, вводимый клиентом дословно. Это буквально уязвимость SQL-инъекций. Нет никакого способа сделать это не SQL-инъекцией.

Кроме того, API действительно идет вразрез с соглашениями веб-службы RESTful.

  • URI запроса не идентифицирует ресурс.
  • Я предполагаю, что каждый запрос является POST с запросом SQL в качестве полезной нагрузки. Вы, вероятно, не используете методы http, такие как PUT, PATCH или DELETE.
  • Ответное сообщение, являющееся только датируемым, не является самоописательным;он не содержит метаданных, которые клиент может использовать для управления ресурсом.
  • SQL, будучи генеративной грамматикой, допускает неограниченное разнообразие запросов. Это не соответствует принципу HATEOAS, согласно которому REST-сервер должен иметь возможность описывать действительные действия по запросу. Клиент должен неявно знать схему вашей базы данных.

У вас нет REST API. У вас есть веб-сервис без определенного интерфейса.

Наличие API «запросить что-либо» должно быть огромным красным флагом. Это, вероятно, признак того, что проект не определен другими способами.

...