wpdb->insert: нужно ли защищаться от SQL-инъекций?

15 авг. 2011 г., 14:57:46
Просмотры: 24.1K
Голосов: 21

Нужно ли использовать wpdb prepare перед wpdb->insert?

Если я вставляю значения в таблицу WordPress используя wpdb->insert, нужно ли мне "очищать" данные перед вставкой или этот метод (wpdb->insert) делает это за меня?

0
Все ответы на вопрос 3
1
24

Нет, вам не нужно подготавливать или экранировать данные, это делается автоматически классом wpdb.

Из справочника по классу wpdb:

data:

(массив) Данные для вставки (в формате столбец => значение). Ни названия столбцов, ни значения в $data не должны быть экранированы для SQL.

Однако, если бы вы писали собственный SQL-запрос вместо использования метода insert, то да, вам следовало бы использовать экранирование через prepare.

15 авг. 2011 г. 15:23:11
Комментарии

Для добавления примечания: Ни insert, ни update в этом не нуждаются. Однако это следует использовать с query.

kaiser kaiser
15 авг. 2011 г. 15:27:33
3

Следующее предупреждение относится к классу wpdb.

https://codex.wordpress.org/Class_Reference/wpdb

Предупреждение

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

Я понимаю это так - класс wpdb не подготавливает и не экранирует данные автоматически.

Я почти уверен, что если вы не можете на 100% доверять источнику данных в вашем коде, то я рекомендую использовать метод prepare().

Не думайте, что использование prepare() исправит ситуацию без его правильного применения. Я довольно новичок в этом, поэтому, пожалуйста, оставляйте исправления в ответах, если я не прав.

$wpdb->prepare( "SELECT * FROM table WHERE ID = %d AND name = %s", $id, $name );

В приведенном выше выражении есть два дополнительных параметра. Один для ID, другой для имени. Насколько я понимаю, каждый из них соответствует по порядку элементам в вашем запросе. Также %s = строка, %d = целое число и %f = число с плавающей точкой.

Кроме того, из моих чтений, если вы не укажете дополнительные параметры, prepare() фактически ничего не сделает. Будет выведено предупреждение, но если вы его отключите, возможно, вы не узнаете об этом.

Вот пример из самой документации класса, где они добавляют prepare() в INSERT:

https://codex.wordpress.org/Class_Reference/wpdb#Protect_Queries_Against_SQL_Injection_Attacks

$wpdb->query( $wpdb->prepare( " INSERT INTO $wpdb->postmeta ( post_id, meta_key, meta_value ) VALUES ( %d, %s, %s ) ", array( 10, $metakey, $metavalue ) ) );

Моя озабоченность в том, что популярный ответ неверен согласно той же странице, на которую никто не ссылается. Я предполагаю, что следует использовать prepare(), но не другие стандартные методы экранирования PHP, потому что я тоже считал этот ответ правильным... пока не копнул глубже.

В любом случае... возможно, с момента первоначального ответа что-то изменилось.

28 авг. 2018 г. 09:36:56
Комментарии

хмм, это больше похоже на вопрос, чем на ответ

Mark Kaplun Mark Kaplun
28 авг. 2018 г. 10:28:21

Принятый ответ верный. Когда вы используете функции типа $wpdb->insert(), $wpdb->update()или$wpdb->delete(), данные должны быть RAW. В ситуации, когда вы используете, например,$wpdb->query()` и передаёте SQL-запрос как входные данные, вы должны экранировать ненадёжные данные.

nmr nmr
28 авг. 2018 г. 13:22:14

нмр, кажется, теперь я понял. Чтобы уточнить... для моего спокойствия... то, что вы использовали в качестве примера — это 'метод insert' и 'метод delete' в отличие от моих примеров с использованием 'метода query' (%wpdb->query). Мне удалить свой ответ? Или оставить?

Felixius Felixius
29 авг. 2018 г. 11:39:27
0

Нет, вам не нужно защищаться от SQL-инъекций при использовании функций wpdb insert или wpdb delete.Защита от SQL-инъекций не требуется при использовании wpdb insert или wpdb delete

Смотрите следующие ссылки:

https://codex.wordpress.org/Data_Validation#Database

https://codex.wordpress.org/Class_Reference/wpdb#Protect_Queries_Against_SQL_Injection_Attacks

3 дек. 2018 г. 14:24:48