wpdb-> insert: нужно ли готовиться к инъекции SQL?


14

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

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

Ответы:


21

Нет, вы не должны готовить или избегать данных, это сделано для вас wpdbклассом.

Из ссылки на класс wpdb :

данные :

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

Однако, если вы пишете собственный SQL, а не используете insertметод, тогда да, вам следует отказаться от использования prepare.


8
Чтобы добавить примечание: insertи updateто, и другое не нужно. Но это должно быть использовано с query.
Кайзер

1

Ниже приведено предупреждение для класса 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 в качестве ввода, вы должны избегать ненадежных данных.
мр

Я думаю, теперь я понимаю. Итак, чтобы уточнить ... для моего здравомыслия ... то, что вы использовали в качестве примера, это "метод вставки и" метод удаления ", в отличие от примеров, которые я использовал для использования" метода запроса "... (% wpdb -> запрос). Удалить свой ответ? Или оставить это?
Феликсий

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.