WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

wp_nonce_field() WP 2.0.4

Получает или выводит скрытое одноразовое поле (nonce) для формы.

Одноразовое поле (nonce) нужно для проверки передаваемых данных формы, чтобы убедиться, что данные были отправлены с текущего сайта, а не от куда-то еще. Такое поле не дает полной защиты, но защищает в большинстве случаев. Использовать проверочное поле в формах обязательно!

Если нужно усилить защиту, то рекомендуется указать параметры $action (будет использован как ключ для создания уникального сочетания знаков) и $name. Если функцию вызывать без параметров, то будет использоваться стандартный ключ и название поля, но если «хакеры» узнают базовый nonce код, то его не сложно будет использовать для атаки. Поэтому для важных форм рекомендуется указывать параметры $action и $name.

Проверять значение поля, созданного этой функцией, нужно с помощью wp_verify_nonce().

Про одноразовые числа читайте в отдельной статье.

Является основой для: settings_fields()
Работает на основе: wp_create_nonce()
✈ 1 раз = 0.00011с = быстро | 50000 раз = 1.57с = быстро

Хуков нет.

Возвращает

Выводит на экран html код проверочного поля формы.

Использование

wp_nonce_field( $action, $name, $referer, $echo );
$action(строка)
Уникальный идентификатор для создаваемого поля. Имя именно этого проверочного поля.
По умолчанию: -1
$name(строка)
Параметр аттрибута name у HTML тега input. Значение поля можно будет получить из переменной $_POST[ $name ].
По умолчанию: "_wpnonce"
$referer(логический)
Вместе с nonce полем добавляется еще одно скрытое поле referer (адрес страницы, с которой отправляются данные формы). Такое поле можно выводить отдельно функцией wp_referer_field().
По умолчанию: true
$echo(логический)
false - вернет данные в переменную, для дальнейшей обработки.
По умолчанию: true

Примеры

#1. Защита данных формы

Обычный пример защиты данных формы: используем такой код в коде формы:

<?php wp_nonce_field(); ?>

выведет:

<input type="hidden" id="_wpnonce" name="_wpnonce" value="5284708911" />
<input type="hidden" name="_wp_http_referer" value="/permalink" />

#1.2. Усиление защиты

Для лучшей защиты, можно указать аргументы $action и $name:

<form method="post">
   <!-- some inputs here ... -->
   <?php wp_nonce_field('name_of_my_action','name_of_nonce_field'); ?>
</form>

После того, как данные формы были отправлены, при обработке данных нужно проверить nonce код с помощью wp_verify_nonce():

<?php
if ( empty($_POST) || ! wp_verify_nonce( $_POST['name_of_nonce_field'], 'name_of_my_action') ){
   print 'Извините, проверочные данные не соответствуют.';
   exit;
}
else {
   // обрабатываем данные
}

#3. Проверка передаваемых данных формы в админке

Если данные формы принимаются внутри админ-панели, их можно проверять функций: check_admin_referer(). При неудаче, check_admin_referer() автоматически выведет сообщение и прервет работу php (die). Т.е. не надо указывать, что делать, если данные не прошли проверку:

function my_handler_function(){

	// Убедимся что запрос не просрочен
	// При ошибке, выведет сообщение и прервет работу PHP.
	check_admin_referer( 'name_of_my_action', 'name_of_nonce_field' );

	// работаем
}

Список изменений

С версии 2.0.4 Введена.

Код wp nonce field: wp-includes/functions.php WP 5.2.2

<?php
function wp_nonce_field( $action = -1, $name = '_wpnonce', $referer = true, $echo = true ) {
	$name        = esc_attr( $name );
	$nonce_field = '<input type="hidden" id="' . $name . '" name="' . $name . '" value="' . wp_create_nonce( $action ) . '" />';

	if ( $referer ) {
		$nonce_field .= wp_referer_field( false );
	}

	if ( $echo ) {
		echo $nonce_field;
	}

	return $nonce_field;
}

Cвязанные функции

Из метки: nonce (защита)

Еще из метки: Безопасность

Еще из раздела: Защита

2 коммента
  • Pavel cайт: plance.in.ua

    Здравствуй, Тимур!

    Подскажи пожалуйста, есть ли у тебя на сайте информация касательно валидации данных форм. Т.е. есть ли в WP готовые функции для проверки корректности введенных данных, такие как email, длина строк, проверка ее на пустоту, и т.п. С возможностью вывести соответствующее сообщение. Т.е. тем, чем обладают все современные фреймворки.

    p.s. спасибо большое за твой труд! лучший сайт по wordpress на русском!

    Ответить3.7 года назад #
Здравствуйте, !     Войти . Зарегистрироваться