#security #prepared-statement #arcgis-js-api #parameterized
Вопрос:
Я пытаюсь создать where
предложение для запроса слоя ArcGIS в ArcGIS JavaScript API. Все примеры, которые я могу найти (в том числе в where
документации), побуждают вас делать такие вещи:
query.where = "NAME = '" stateName "'";
Я нахожу это удивительным, потому что, похоже, нам рекомендуется писать код, подверженный ошибкам SQL-инъекций. Это особенно важно для меня, потому что мое «Имя штата» полностью не зависит от меня. Это необработанный пользовательский ввод.
Похоже, библиотека поддерживает параметризацию запросов с помощью parameterValues
свойства, однако я не могу найти примеров того, как его использовать или как отформатировать мой запрос так, чтобы он использовал значения параметров. Даже документация не содержит никаких примеров.
Итак, как мы создаем правильно параметризованные запросы?
Примечание: Я понимаю, что, вероятно, задача администратора сервера состоит в том, чтобы предотвратить вред от плохих запросов, однако половина причины, по которой я спрашиваю об этом, также заключается в том, чтобы избежать ошибок и неправильно проанализированных запросов.
Комментарии:
1. Этот же вопрос был задан в Reddit reddit.com/r/gis/comments/al4979/… , и, похоже, был сделан вывод о том, что существуют другие способы защиты ваших запросов, и что параметризованные запросы-это «приятно иметь», но не обязательно. Основываясь на информации в этом потоке, они, похоже, думают, что это невозможно. Это было два года назад, так что, может быть, они что-то добавили с тех пор?
2. Существует функция проверки SQL — запросов developers.arcgis.com/rest/services-reference/enterprise/… но они упоминают, что это доступно только для сервисов объектов, размещенных в ArcGIS online, и только на серверах 10.3 и выше.
Ответ №1:
Согласно ESRI, это parameterValues
свойство предназначено только для использования слоев запросов. Это не для данного контекста.
Таким образом, ответ таков: нет, вы не можете использовать правильную параметризацию SQL, когда вы просто выполняете запрос на слое.
Лучший способ, который я нашел, чтобы сделать ваши запросы хотя бы немного более пуленепробиваемыми, — это использовать такой код:
function sanitizeParameter(value) {
// We need to escape single quotes to avoid messing up SQL syntax.
// So all ' characters need to become ''
return value.split("'").join("''")
}
query.where = "NAME = '" sanitizeParameter(stateName) "'";