Да, это безопасно от атак с использованием SQL-инъекций.
Обратите внимание, что клиентский код не"экранирует" параметры в запросе такого рода. Он делает что-то намного проще и безопаснее:
Клиент не объединяет INSERT INTO users (name) VALUES(?)
и параметр ;DROP TABLE USERS;
в INSERT INTO users (name) VALUES(;DROP TABLE USERS;
.
Также клиент не выполняет вышеуказанное с помощью escape-символовсделать это "безопасным". Клиент не создает что-то вроде INSERT INTO users (name) VALUES("\;DROP TABLE USERS\;")
Что он делает, это отправляет запрос в MySQL, который отдельно содержит:
- строка запроса
INSERT INTO users (name) VALUES(?)
- MySQL знает, что это строка запроса, и знает, что ?
- это место, где подключены параметры. - параметр
;DROP TABLE USERS;
- MySQL знает, что это параметр запроса
Следовательно, сервер знает, что этот параметр не является кодом SQL, и что аккуратно избегает всей неприятной проблемы с экранированием символов.
Если вы не используете Prepare
, выпропускают некоторый потенциал для оптимизации на сервере. Сервер компилирует каждый оператор во внутреннее представление, и это требует времени. Делая это явно и повторно используя подготовленный оператор, вы явно сохраняете повторение этого шага компиляции.
Однако MySQL делает кешированные скомпилированные операторы, чтобы избежать повторной компиляции одной и той же строки - так что вы, вероятно, не будетеувидеть большие проблемы с производительностью.