Единственный способ сделать это безопасным - это белый список определенного списка предварительно проверенных запросов 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 «запросить что-либо» должно быть огромным красным флагом. Это, вероятно, признак того, что проект не определен другими способами.