wpdb-> insert: мені потрібно готуватися до ін'єкції SQL?


14

Чи потрібно використовувати підготовку до wpdb перед wpdb-> вставкою?

Якщо я вставляю значення в таблицю wordpress за допомогою wpdb-> insert, чи потрібно «очищати» свої дані перед тим, як вставляти їх, чи робить цей метод (wpdb-> insert) це для мене?

Відповіді:


21

Ні, ви не повинні готувати або уникати даних, це робиться для вас wpdbкласом.

З посилання на клас wpdb :

дані :

(масив) Дані для вставки (у стовпці => пари значень). І стовпці даних $, і значення даних $ повинні бути "необробленими" (не слід уникати SQL).

Якщо ви писали власний SQL, а не використовували insertметод, то так, вам слід уникнути використання prepare.


8
Щоб додати примітку: і те, insertі updateце не потрібно. Але його слід використовувати з query.
кайзер

1

Далі наведено попередження для класу wpdb.

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

Попередження

Деякі функції цього класу приймають операцію SQL як вхідний. Ви повинні уникати SQL усіх ненадійних значень, які ви включаєте в запит SQL, щоб запобігти атакам ін'єкції SQL. Перегляньте документацію, щоб побачити, чи функція, яку ви плануєте використовувати, виключає для вас SQL чи очікує, що вона буде попередньо уникнута.

Тому я читаю це як - клас wpdb не готує автоматично та не дозволяє вам отримати дані.

Я майже впевнений, що якщо ви не можете довіряти стовідсотковому джерелу даних у своєму коді, я пропоную скористатися класом підготовки (?).

Не думайте, що використання класу підготовки виправить це без належного використання класу підготовки. Я досить новий в цьому, тому будь ласка, опублікуйте будь-які виправлення як відповідь, якщо я не прав.

$ wpdb-> підготовка ("SELECT * FROM table WHERE ID =% d AND name =% s", $ id, $ name);

У наведеному вище твердженні є 2 додаткові атрибути. Один для ідентифікатора та одного для імені. Наскільки я прочитав, кожен відповідає відповідно до кількості елементів у вашому запиті. Також% s = рядок,% d = ціле число і% f = float.

Крім того, з мого читання, якщо ви не помістите зайві атрибути, то підготовка насправді нічого не зробить. Буде попередження, але якщо ви вимкнете це, можливо, ви не будете знати.

Ось приклад із посилання на клас, де вони додають клас підготовки в INSERT нижче.

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

$ wpdb-> запит ($ wpdb-> підготовка ("ВСТАВИТЬСЯ В $ wpdb-> постмета (post_id, meta_key, meta_value) VALUES (% d,% s,% s)", масив (10, $ metakey, $ метазначення) ));

Мене хвилює те, що відповідь, що обґрунтовується, є невірною відповідно до тієї ж сторінки, на яку "ніхто" посилається. Я припускаю, що ви використовуєте готовий (), але не інші стандартні методи php для втечі, тому що я сприйняв цю відповідь як правильну ... поки я не заглибився.

У будь-якому випадку ... можливо, змінилися речі з часу початкової відповіді.


хммм, це звучить скоріше як питання, ніж відповідь
Марк Каплун

Прийнята відповідь правильна. При використанні таких функцій, як $wpdb->insert()$ wpdb-> update () `або $wpdb->delete()дані повинні бути RAW. У ситуації, коли ви використовуєте, наприклад, $wpdb->query()і передаєте оператор SQL як вхід, вам слід уникати ненадійних даних.
нмр

нмр, я думаю, зараз розумію. Отже, для уточнення ... на мій розум ... те, що ви використовували як приклад, - це "метод вставки та" метод видалення ", на відміну від прикладів, які я використовував при використанні" методу запиту "... (% wpdb -> запит). Чи потрібно видалити свою відповідь? Або залишити його?
Феліксій

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.