Нужно ли использовать wpdb prepare перед wpdb-> insert?
Если я вставляю значения в таблицу wordpress с помощью wpdb-> insert, нужно ли мне «чистить» мои данные перед их вставкой или этот метод (wpdb-> insert) делает это для меня?
Нужно ли использовать wpdb prepare перед wpdb-> insert?
Если я вставляю значения в таблицу wordpress с помощью wpdb-> insert, нужно ли мне «чистить» мои данные перед их вставкой или этот метод (wpdb-> insert) делает это для меня?
Ответы:
Нет, вы не должны готовить или избегать данных, это сделано для вас wpdb
классом.
Из ссылки на класс wpdb :
данные :
(массив) Данные для вставки (в столбцах => пары значений). И столбцы $ data, и значения $ data должны быть «необработанными» (ни один из них не должен быть экранирован SQL).
Однако, если вы пишете собственный SQL, а не используете insert
метод, тогда да, вам следует отказаться от использования prepare
.
Ниже приведено предупреждение для класса wpdb.
https://codex.wordpress.org/Class_Reference/wpdb
Предупреждение
Некоторые функции этого класса принимают оператор SQL в качестве входных данных. SQL должен экранировать все ненадежные значения, которые вы включаете в запрос SQL, чтобы предотвратить атаки SQL-инъекций. Посмотрите документацию, чтобы узнать, будет ли функция, которую вы планируете использовать, использовать для вас SQL или ожидает, что она будет предварительно экранирована.
Поэтому я читаю это как - класс wpdb не автоматически подготавливает или экранирует данные для вас.
Я вполне уверен, что если вы не можете доверять источнику данных в вашем коде на 100%, тогда я предлагаю использовать класс prepare (?).
Не думайте, что использование подготовительного класса исправит это без правильного использования подготовительного класса. Я новичок в этом вопросе, поэтому, если я не прав, опубликуйте любые исправления в качестве ответа.
$ wpdb-> prepare ("SELECT * FROM table WHERE ID =% d AND name =% s", $ id, $ name);
В приведенном выше заявлении есть 2 дополнительных атрибута. Один для удостоверения личности и один для имени. Насколько я прочитал, каждый соответствует по количеству элементов в вашем запросе. Также% s = строка,% d = целое число и% f = число с плавающей запятой.
Кроме того, из моего прочтения, если вы не добавите дополнительные атрибуты, то подготовка на самом деле ничего не даст. Там будет предупреждение, но если вы выключите это, возможно, вы не будете знать.
Вот пример из самой ссылки на класс, где они добавляют подготовленный класс в 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)", массив (10, $ metakey, $ metavalue) ));
Меня беспокоит то, что ответ с неправильным голосом неверен в соответствии с той же страницей, на которую ссылается «никто» Я предполагаю, что вы используете prepare (), но не другие стандартные php методы escape, потому что я также принял этот ответ как правильный ... пока я не копал глубже.
Во всяком случае ... возможно, все изменилось с момента первоначального ответа.
$wpdb->insert()
$ wpdb-> update () `или $wpdb->delete()
данные должны быть RAW. В ситуации, когда вы используете, например, $wpdb->query()
и передаете оператор SQL в качестве ввода, вы должны избегать ненадежных данных.
Нет, вам не нужно предотвращать 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
insert
иupdate
то, и другое не нужно. Но это должно быть использовано сquery
.