Как PreparedStatement избегает или предотвращает Внедрение SQL?

Что ж, лучше всего для меня это Mobaxterm http://mobaxterm.mobatek.net/features.html Этот дистрибутив Cygwin вообще не имеет инсталляции, так как является одним единственным двоичным файлом.

111
задан Mark Rotteveel 6 January 2018 в 09:55
поделиться

4 ответа

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

Но если вы не используете пользовательский ввод как параметр для подготовленных но вместо этого создайте свою команду SQL, соединяя строки вместе, вы по-прежнему уязвимы для инъекций SQL даже при использовании подготовленных операторов.

67
ответ дан 24 November 2019 в 02:56
поделиться

Рассмотрим два способа сделать то же самое:

PreparedStatement stmt = conn.createStatement("INSERT INTO students VALUES('" + user + "')");
stmt.execute();

Или

PreparedStatement stmt = conn.prepareStatement("INSERT INTO student VALUES(?)");
stmt.setString(1, user);
stmt.execute();

Если "пользователь" пришел из пользовательского ввода, а пользовательский ввод был

Robert'); DROP TABLE students; --

Тогда в первом случае вы: буду обливаться. Во втором случае вы будете в безопасности, и Little Bobby Tables будут зарегистрированы для вашей школы.

185
ответ дан 24 November 2019 в 02:56
поделиться

SQL, используемый в PreparedStatement, предварительно скомпилирован в драйвере. С этого момента параметры отправляются драйверу как буквальные значения, а не как исполняемые части SQL; таким образом, нельзя ввести SQL с помощью параметра.

26
ответ дан 24 November 2019 в 02:56
поделиться

Я предполагаю , это будет строка. Но входные параметры будут отправлены в базу данных, и перед созданием фактического оператора SQL будут применены соответствующие приведения / преобразования.

Чтобы дать вам пример, он может попытаться проверить, работает ли CAST / преобразование.
Если он работает, он может создать на его основе окончательный оператор.

   SELECT * From MyTable WHERE param = CAST('10; DROP TABLE Other' AS varchar(30))

Попробуйте пример с оператором SQL, принимающим числовой параметр.
Теперь попробуйте передать строковую переменную (с числовым содержимым, которое можно использовать в качестве числового параметра). Вызывает ли это какую-либо ошибку?

Теперь попробуйте передать строковую переменную (с содержанием, которое не приемлемо в качестве числового параметра). Смотрите, что происходит?

3
ответ дан 24 November 2019 в 02:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: