Несколько предложений здесь:
Не делать мета-программирования до такой степени. Сделайте отдельные маршруты в своем приложении для каждой процедуры, а затем введите эти «коды» самостоятельно. Это позволит вам выполнять такие действия, как проверка входных данных пользователей, чтобы убедиться, что они не передаются в мусорные данные, а также конкретные маршруты ограничения скорости, чтобы гарантировать, что БД не заполнено мусором.
Вы также можете создать белый список допустимых «кодов» и убедиться, что whitelist.instanceOf(procedure) != -1
, но это не позволит вам выполнять валидацию ввода для каждого маршрута.
Даже если вы вручную включили процедуру, все еще есть проблема. В вашем существующем коде вызов внешней службы помещает параметр 'req.params.username' перед процедуройName. Для большинства инфраструктур синтаксического анализа HTTP сначала используются параметры. Одной из первых атак, которые я попробовал бы после просмотра этого кода, было бы ввести '&procedureName=something_i_shouldnt_be_able_to_call'
в мое имя пользователя. Это приведет к тому, что атрибут procedureName, который вы включаете, должен быть проигнорирован, в то время как тот, который я представил, будет использоваться вместо этого. Вы можете предотвратить это, либо поместив параметры, основанные на пользовательском входе, и кодировку URI, введенную пользователем до интерполяции строк, либо включив в себя ваш запрос в виде объекта с именем «qs» passed into the options argument to request.
Независимо от того, создает ли это SQL уязвимость внедрения полностью зависит от того, как веб-служба анализирует аргументы и выполняет эту процедуру. Оптимальным случаем было бы то, что URI службы декодирует каждый параметр и затем передает их в качестве аргументов либо PDO, либо подготовленного оператора. Я предполагаю, что он использует PDO, учитывая то, как он называется.
Так что, в конечном итоге, я хотел бы предложить здесь URI кодировать каждый из ваших параметров, введенных пользователем, и использовать объект qs, переданный в параметры запроса, как указано выше, а не просто интерполировать строки.После того, как вы это сделали, вы можете предпринять все или все из этих шагов, чтобы помочь подтвердить:
- Попытаться сделать так, как вводить одинарные кавычки в свой пользовательский ввод вручную.
- Запустите инструмент, подобный sqlmap, на этом конкретном маршруте, чтобы протестировать SQL-инъекцию. Это даст вам достаточно надежное тестирование, не требуя глубоких знаний о методах SQL-инъекций.
- Запланируйте оценку безопасности приложения с опытным специалистом по безопасности node.js. (Я доступен на liftsecurity.io)
Повторюсь - Не доверяйте пользователям, чтобы дать вам код процедуры - сделать раздельные маршруты и вставить, что данные сами, URI закодировать весь пользовательский ввод перед дальнейшей обработкой, и использовать объекты запроса, например: {qs:{name:value}}
вместо интерполяции строк.
С этими защитами вы, вероятно, будете в порядке, поскольку, похоже, здесь используются хранимые процедуры. Однако, если вы не можете найти подтверждение этого в документации веб-службы, единственный способ убедиться в этом - это один из методов, которые я предложил выше.
Надеюсь, это поможет!
Лучшим способом было бы не динамически передавать имя выполняемой процедуры. По крайней мере, вы должны запутываться с некоторым шифрованием. –