Как правильно проверить данные из $GET или $REQUEST с помощью функций WordPress?


Я работаю над плагином, который требует оперативного управления выводом контента. Это зависит исключительно от текущей переменной $_GET или переменной $_REQUEST.

В зависимости от значения переменной, она вызовет определенный метод класса для обработки запроса пользователя и отображения соответствующего содержимого.

Я полностью осведомлен о странице Проверки данных в Кодексе WordPress, однако я не уверен, какой подход лучше всего подходит для моего сценария, или любой сценарий очистки $_GET переменных или $_REQUEST переменных, если на то пошло.

Как я могу очистить с помощью функций WordPress переменную $_GET или переменную $_REQUEST для строки, которая будет сопоставлена для вызова определенного метода класса?

Может ли это быть использовано или не сработать, учитывая следующий код?:

public function display_admin_page(){
    if(is_admin() && isset($_GET['page'])){
        global $content;
        $page = sanitize_title($_GET['page']);
        $method_name = 'page_'.str_replace('-', '_', $page);
        if(method_exists('content', $method_name)){
            // Display requested page from content class
            $thePage = $content->$method_name();
        } else{
            $thePage = $content->error(404);    
        }
        echo $thePage;
    }
}
Author: Michael Ecklund, 2012-09-12

4 answers

WordPress не предоставляет никаких специальных функций проверки данных для СУПЕРГЛОБАЛОВ.

Я использую функцию PHP filter_input, а затем экранирую ее, как и любую ненадежную переменную.

$url = filter_input( INPUT_GET, 'some_query_string', FILTER_VALIDATE_URL );

echo '<a href="'. esc_url( $url ). '">Click Me</a>';

Вход фильтра PHP принимает:

 5
Author: Chris_O, 2020-06-15 08:21:38

К вашему конкретному примеру:

Вы соответствующим образом очистили данные $_GET (я думал, что буду использовать sanitize_key вместо sanitize_title - не могу сказать, что есть большая разница, но sanitize_title предназначен для использования в URL-адресах).

Функция method_exists вернет значение true для закрытых и защищенных методов, поэтому, если пользователь попытается вызвать закрытый или защищенный метод, он завершится неудачей без перехода к 404. (Если только метод display_admin_page не относится к тому же классу.)

Это подводит нас к основному потенциалу эксплойт: что абсолютно любой может заставить работать любой общедоступный метод в вашем классе. Если возможно, всегда лучше специально внести в белый список то, что может быть принято. Таким образом, вы могли бы подтвердить что-то вроде:

if ( !in_array( $_GET['page'], array( 'accepted_method', 'another_accepted_method' ) ) )
     $content->error(404);
 2
Author: SeventhSteel, 2012-09-12 19:22:47

Я бы рекомендовал использовать mysql_real_escape_string($_GET) для любого запроса GET. Это очень мощная функция PHP.

Затем вы можете использовать str_replace() для замены любых нежелательных символов.

 0
Author: Ciprian, 2012-09-12 16:26:06

Очистка $_GET в значительной степени зависит от контекста. Зависит от того, какое значение вы хотите и как вы хотите, чтобы оно было подтверждено.

На этот вопрос не существует однозначного ответа на все вопросы. Это очень специфично для контекста. Например, вы могли бы написать функцию, которая удаляла бы все теги и косые черты из входных данных, это очень безопасно, но что, если вы хотите сохранить тег p? В этом нет ничего плохого. Семейство wp_kses() представляет собой интересное исследование, но не является отличным решением, так как оно учитывает контекст, уровень пользователя и многое другое. Например, как пользователь-администратор вы можете сохранять JavaScript в заголовке публикации и содержимом публикации, но в качестве более низкой роли вы не можете.

Если это значение является известной величиной, вы также можете проверить, является ли in_array( $array_valid_strings ) и быть более уверенным в этом.

Тем не менее, существуют разные степени очистки, поэтому важно помнить о своей конечной цели. Я бы сверился с этим списком и нашел функцию или комбинацию функций, которые соответствуют вашим потребностям. Это специально для дезинфекции_ функции, которые следует использовать здесь, а не esc_. Дезинфекция и побег по-прежнему путаются...

В моем случае я собираюсь использовать sanitize_text_field(), потому что он очищает строку из пользовательского ввода или из базы данных.

  • Проверяет наличие недопустимого UTF-8,
  • Преобразует одиночные
  • Удаляет все теги
  • Удаляет разрывы строк, вкладки и лишние пробелы
  • Октеты полос

Удачи:).

P.S. В этом ответе приводятся три точки зрения разных разработчиков (Джош, Михал, Кевин).

 0
Author: Ahmad Awais, 2020-06-15 08:21:38