✅ WEB і WordPress новини, теми, плагіни. Тут ми ділимося порадами і кращими рішеннями для сайтів.

Безпечне надсилання форм WordPress

17

Багато років тому я написав допис, у якому поділився загальнодоступною функцією визначення, чи має користувач дозволи на збереження інформації в базі даних WordPress. Ви можете побачити оригінальну суть у всій її застарілій красі (разом із суцільними коментарями) тут (йому навіть п’ять років – вау).

Як і у всьому, що пов’язано з програмуванням, час минає, все вдосконалюється, і все [сподіваємось] стає краще, ніж було раніше.

Хоча я все ще використовую та рекомендую варіант функції user_can_save (або userCanSave ), я також вважаю, що важливо пройти процес відокремлення процесу перевірки запиту.

Отже, тепер мова йде не лише про визначення, чи має користувач дозволи, але й про перевірку інформації про безпеку, що надходить від клієнта – через повідомлення на сервер або запит, зроблений через Ajax – і робити це за допомогою хороших методів програмування, які узгоджуються як з WordPress, так і з PHP.

Щоб було зрозуміло, це більше стосується безпечного надсилання форми WordPress зі сторінки параметрів або сторінки налаштувань, ніж, скажімо, форми, отриманої з шаблону. Це інший пост іншим разом.

Але все ж багато з нас працюють над створенням додатків на WordPress, і для цього потрібно наступне.

Безпечне надсилання форм WordPress

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

Однак я збираюся пройти через процес прийняття функції, яка відповідає за перевірку вхідної інформації, і робити це з використанням сучасного підходу з використанням об’єктно-орієнтованих методів і як API WordPress, так і функцій PHP.

1 Починаючи з загального рівня

З базового рівня припустімо, що існує базовий клас, з якого є інші підкласи, які використовують цю функцію. Це означає, що нам потрібно використовувати модифікатор видимості protected.

Ми також знаємо, що матимемо справу з одноразовим значенням WordPress і пов’язаною дією. Це означає, що сигнатура функції виглядатиме приблизно так :

<?php
protected function verifyRequest($nonce, $action);

2 Очистіть дані, перевірте Nonce

Щодо всього, що опубліковано на сервері, ми знаємо, що нам потрібно буде перевірити, чи встановлено дані, і якщо так, нам потрібно буде очистити інформацію.

Це означає, що нам знадобляться такі функції:

І ми також знаємо, що нам потрібно буде перевірити nonce, тому нам також знадобиться wp_verify_nonce.

3 Робочий перший прохід

Робочий перший прохід цієї функції може виглядати приблизно так:

<?php
protected function verifyRequest($nonce, $action)
{
    return isset($_GET[$nonce]) &&
           wp_verify_nonce(strip_tags(stripslashes($_GET[$nonce])), $action);
}

Але що, якщо хтось ділиться даними, які надіслали запит POST (а не GET )? Тоді ми могли б змінити функцію, щоб вона виглядала приблизно так:

<?php
protected function verifyRequest($nonce, $action)
{
    return (isset($_GET[$nonce]) &&
            wp_verify_nonce(strip_tags(stripslashes($_GET[$nonce])), $action)) || (isset($_POST[$nonce]) &&
            wp_verify_nonce(strip_tags(stripslashes($_POST[$nonce])), $action)
        );
}

І цього було б достатньо. Але якщо ми справді хочемо, щоб дана функція була максимально чистою, тоді ми можемо розбити це ще далі.

4 Функція для кожної мети

Враховуючи наведений вище код, ми знаємо, що нам потрібно обробляти як запити GET, так і запити POST. PHP пропонує функцію filter_input, яка є корисною, легшою для читання (ну, це суб’єктивно), але також проходить кілька перевірок якості коду.

Крім того, ми можемо використати просту фабричну функцію, щоб розділити логіку на такі функції:

Безпечне надсилання форм WordPress

По-перше, нам потрібно написати дві окремі функції – одну для запиту POST:

<?php
private function verifyPostRequest($nonce, $action)
{
    return
        isset($_POST[$nonce]) &&
        wp_verify_nonce(strip_tags(stripslashes(filter_input(INPUT_POST, $nonce))), $action);
}

І один для запиту GET:

<?php
private function verifyGetRequest($nonce, $action)
{
    return
        isset($_GET[$nonce]) &&
        wp_verify_nonce(strip_tags(stripslashes(filter_input(INPUT_GET, $nonce))), $action);
}

Тоді ми можемо зв’язати це разом у вихідній функції так:

<?php
protected function verifyRequest($nonce, $action)
{
    switch (strtolower($_SERVER['REQUEST_METHOD'])) {
        case 'post':
            return $this->verifyPostRequest($nonce, $action);
            break;
        case 'get':
            return $this->verifyGetRequest($nonce, $action);
            break;
        default:
            return false;
            break;
    }
}

Чітке керування вхідними запитами

Можливо, це виглядає як складний спосіб обробки простого рішення, враховуючи початковий набір коду, який надавався спільно.

Це, звичайно, можливо, особливо якщо у вас обмежений час або ви не дуже дбаєте про розбиття речей на найменші можливі атомарні (або навіть перевірені) компоненти.

Але якщо ви хочете написати об’єктно-орієнтований код із найвищим ступенем точності, можливо, цей процес допоможе саме в цьому.

Джерело запису: tommcfarlin.com

Цей веб -сайт використовує файли cookie, щоб покращити ваш досвід. Ми припустимо, що з цим все гаразд, але ви можете відмовитися, якщо захочете. Прийняти Читати далі