2016-01-30 4 views
0

Я недавно узнал, что не использовал методы .set() PreparedStatements - довольно серьезный недостаток безопасности.Насколько безопасны PreparedStatements?

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

Если кто-то может атаковать MySQL-запрос, чтобы изменить данные, как именно методы PresetStatement .set() предотвращают атаку?

Например, если запрос

INSERT INTO table_name(?, ?); 

(Предполагая, что оба вопросительных знаков будут строки)

не мог кто-то просто изменить table_name к другой таблице?

Другой пример; Если запрос

UPDATE table_name SET column_name=?; 

не мог человек изменить column_name сделать запрос изменить Поменяй столбец?

Последний пример, о котором я мог думать; Если запрос

SELECT column_name FROM table_name WHERE column2_name = ?; 

Будет ли возможность злоумышленника изменить имя_столбец, table_name и т.д. Или вводить другие действия в запрос?

Как вы, наверное, можете сказать, я мало знаю о безопасности и MySQL, поэтому извините меня, если это очень очевидные вопросы. Спасибо!

ответ

1

Значение в подготовленных заявлений является то, что вы разделите ваши переменные данные непосредственно из строки запроса. Это обеспечивает два основных преимущества:

  1. в случае повторного запроса, который отличается только в данных, посланных, сам запрос не должен быть повторно проанализированы; вместо этого нужно отправлять только новые данные.

  2. Вы защищены от атак SQL-инъекций, которые могут привести к неверно экранированным данным, включенным непосредственно в строку запроса, поскольку ваши данные отдельно от самой строки запроса и отправляются безопасным образом.

Подготовленные заявления делать не (и не предназначены для) защитить вас от человека-в-середине атак между клиентом и базой данных, которые могут изменить запрос (или данные), вы намеревались отправить , Для этого вам необходимо использовать транспорт SSL, и в противном случае убедитесь, что злоумышленники не могут вставлять себя в вашу связь с вашей базой данных.

+0

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

+1

Успешная инъекция SQL-инъекций будет означать, что ваши данные являются частью самой строки запроса, а уязвимость заключается в том, что запрос делает то, что вы не намеревались, помимо только некорректных данных, поступающих в db. Если данные отделены от запроса, то любой вредоносный ввод является лишь частью данных. MITM может потенциально повлиять на то, что ваше приложение проходит через злоумышленника, если злоумышленник может читать и изменять данные. (Но обратите внимание, что MITM только для чтения может быть опасным.) – jbafford

1

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

Посмотрите здесь: How can prepared statements protect from SQL injection attacks?

+0

Хорошо, это проясняет это немного больше, спасибо. –

Смежные вопросы