2015-03-14 3 views
0

У меня есть неудачная ситуация, когда мне нужно создать строку SQL, объединив строки - классический сценарий SQL-инъекций. I не может использование подготовленные заявления.Предотвращение SQL-инъекции Redshift

Если я сбегу от символа ', то я в безопасности? Или есть другие атаки?

Я использую MyBatis и это ${} обозначение (vs #{}, которое генерирует подготовленные заявления). У меня нет выбора с этим - это должно быть ${}. Я не могу использовать подготовленные заявления.

EDIT:

Чтобы добавить немного больше ясности; это ASW Redshift UNLOAD command. Первым параметром для UNLOAD является строка SQL.

+0

Сохранит ли он вас от '; DROP TABLE - '? –

+1

Эвакуация '' 'недостаточна. Есть и другие атаки. Вы связываете обе руки и ноги, а затем спрашиваете лучший способ выиграть бой. – mdahlman

+0

Может ли любой случайный пользователь запускать 'unload' против вашей базы данных на AWS?Документально подтверждается утверждение 'select' как первого arg. Будет ли он также принимать заявления DDL или 'delete'? Будет ли он принимать несколько операторов SQL? –

ответ

1

(Учитывая, что вы не можете сделать это правильный путь из-за ограничений в Redshift):

В PostgreSQL с standard_conforming_strings набор для onвсе вам нужно сделать, это двойные кавычки, что делает ' в ''. Вот и все.

Обратные косые черты несущественны, если только standard_conforming_strings не используется или вы используете строку E''. Если любая из этих вещей истинна, тогда вам нужно выполнить обратную косую черту.

Поскольку Redshift основан на вилке старой версии PostgreSQL, я точно не знаю, как это относится к ней. Чтение документации по ее лексической структуре и синтаксису было бы разумным, чтобы убедиться, что он совместим с тем, как работает PostgreSQL.

1

PreparedStatement (Wikipedia) на самом деле путь. Одним махом вы устраняете большую кучу работы и риск, связанный с хакерами SQL Injection.

Если вы абсолютно не можете/не будете использовать PreparedStatement, вам необходимо прочитать о различных стратегиях. Вам нужно будет написать кучу проверок, чтобы изучить и изменить ваши входы и SQL. Нет silver bullet. (Ну, на самом деле, PreparedStatementне ваша серебряная пуля. Но не другого серебряной пули.)

Google для предметов, как "дезинфицировать SQL ввода". Вы найдете такие ресурсы, как:

+0

Это AWS Redshift UNLOAD, который настаивает на том, что первым параметром была строка SQL. – Kong

+1

Похоже, что мой выбор - быть открытым для SQL-инъекций; или не использовать UNLOAD. – Kong

+0

Нет, я предлагаю 3 варианта: (1) быть широко открытыми для SQL-инъекций, ничего не делая, (2) смягчить свой риск, не устраняя всех рисков, изучая статьи, такие как перечисленные выше, для реализации нескольких проверок санитарии и (3) использования PreparedStatement, чтобы вы могли спокойно спать. –