SQL_INJECTION_JDBC Findbugs при загрузке из файла - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть анонимная процедура, которую я получаю с StatementLoader и передаю ее в CallableStatement. Однако FindBugs идентифицирует это как уязвимое для инъекции SQL (SQL_INJECTION_JDBC). Если я создаю статический метод, который возвращает процедуру в виде строки, это нормально.

Есть ли способ использовать загрузчик операторов без появления ошибки внедрения sql?

Пример:

StatementLoader stmt = StatementLoader.getLoader(MyClass.class, connection);    
try (final CallableStatement callable = connection.prepareCall(stmt.load("mySqlCode"))) {...

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Я бы хотел уточнить точно , что я имел в виду под "параметрами", поскольку в последнем комментарии ОП использовалось слово "санировано".

SQL разрешает использование «параметров» в выражении SQL, обозначенных вопросительными знаками, которые не литеральные строки, например:

SELECT * FROM CUSTOMER WHERE CUSTOMER_ID = ?

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

Оператор SQL анализируется («подготавливается») только один раз, и ядро ​​СУБД знает, что значения параметров должны предоставляться каждый раз при выполнении оператора. Механизм запросов будет принимать и использовать эти значения параметров напрямую; это не будет переоценивать SQL. (что, кстати, заметно эффективнее!)

Предоставленные вами двоичные значения используются как есть. Вам даже не нужно конвертировать их в символьную форму. В частности, вы не"санируйте" их ! Если вы предоставите значение, например FOO%20BAR, для некоторого столбца символьного типа в операторе INSERT, вы обнаружите, что литеральное значение 9 -характера будет вставлено в вашу базу данных: F-O-O-%-2-0-B-A-R. «Это те 9 символов, которые ты мне дал, вот что я сделал».

(Системы баз данных и интерфейсы к ним различаются по обработке типов данных, таких как «дата».)

0 голосов
/ 07 ноября 2018

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

...