Как использовать nonce при отправке формы с фронтенда?

27 авг. 2012 г., 21:05:10
Просмотры: 32.3K
Голосов: 10

Благодаря различным постам здесь мне удалось создать форму отправки на фронтенде. После примерно 24 часов настройки я наконец-то заставил все работать, включая перенаправление на страницу "успешно" после отправки, но я не знаю, что делать с nonce.

Вот страница с формой: http://pastebin.com/YWyXL3jY

А вот страница успешной отправки: http://pastebin.com/3Usu0Pt6

Это оба пользовательских шаблона страниц (я знаю, что форматирование сейчас немного разбросано, так как разные части взяты из разных источников, и я не думаю, что буду использовать функцию загрузки файлов, поскольку предпочитаю использовать плагин для лучшей безопасности).

Нужно ли обрабатывать nonce до того, как пользователь будет перенаправлен на страницу успеха? У меня совсем нет опыта работы с nonce, и я программирую на PHP методом "копировать-вставить", так что, пожалуйста, будьте снисходительны!

Огромное спасибо за любой совет, который вы можете дать :)

1
Комментарии

Можно ли поднимать свои вопросы? Я попробовал добавить verify_nonce непосредственно под if( 'POST' == $_SERVER['REQUEST_METHOD'] && !empty( $_POST['action'] )) { — но это, кажется, ничего не дало

Jo_pinkish Jo_pinkish
29 авг. 2012 г. 14:06:50
Все ответы на вопрос 4
0
11

Используйте следующий код непосредственно перед закрывающим тегом на фронтенде вашего сайта.

wp_nonce_field('name_of_your_action', 'name_of_your_nonce_field');

Данный код сгенерирует два скрытых поля внутри вашей формы. Теперь вы можете проверить nonce на бэкенде при обработке формы. Используйте следующий код для проверки созданного nonce.

  if(wp_verify_nonce($_REQUEST['name_of_your_nonce_field'], 'name_of_your_action')){

            // Nonce совпадает и действителен. Теперь можно выполнять нужные действия.

     } else {

           // Неверный nonce. Здесь можно вывести сообщение об ошибке.
}

Важное замечание: обратите внимание, что "name_of_your_action" является первым аргументом функции 'wp_nonce_field()' и вторым аргументом функции 'wp_verify_nonce()'. :) Поэтому не используйте его в качестве первого аргумента в обеих функциях. Многие делают эту ошибку, поэтому я хотел об этом упомянуть.

22 дек. 2016 г. 16:03:33
0
10

Для добавления nonce к форме вы можете использовать следующую функцию:

wp_nonce_field($action, $name, $referer, $echo)

  • $action = (необязательный) это строка, представляющая название действия
  • $name = (необязательный) это строка, представляющая имя nonce. Если оставить это поле пустым, WordPress по умолчанию использует "_wpnonce"

Пример:

Фронтенд:

<form action="" method="post">
<?php wp_nonce_field('my_delete_action'); ?>
<input type="hidden" name="id" value="<?php echo $id; ?>" />
<input type="text" name="rec_name" value="<?php echo $name; ?>" />
<input type="submit" value="Delete" />
</form>

Бэкенд:

$retrieved_nonce = $_REQUEST['_wpnonce'];
if (!wp_verify_nonce($retrieved_nonce, 'delete_my_action')) die('Failed security check');

Источник: https://www.tipsandtricks-hq.com/introduction-to-wordpress-nonces-5357

1 мар. 2018 г. 04:12:53
1
-1

Используйте это для создания и проверки nonce.

wp_nonce_field('test_action', 'submit_post');

Это сгенерирует поле nonce, которое вы можете проверить с помощью следующего кода.

if(wp_verify_nonce($_REQUEST['test_action'], 'submit_post')){
           /// выполните ваши действия
}else{
         /// выбросьте ошибку
}
17 июн. 2013 г. 13:33:56
Комментарии

Это не будет работать, как отмечает @Kamal Ahmed, "name_of_your_action" является первым аргументом функции 'wp_nonce_field()' и вторым аргументом функции 'wp_verify_nonce()'"

Bysander Bysander
17 мая 2018 г. 18:42:24
0
-2

Начиная с этой страницы: http://codex.wordpress.org/WordPress_Nonces

Затем, изучив использование wp_verify_nonce и пример использования wp_nonce_field, вы должны проверить результат верификации и решить, что делать (обычно это завершение работы, но в вашем случае, вероятно, вывод сообщения об ошибке через echo). Вы можете использовать проверку как условие "проверки отправки формы" в строке 8:

if ( empty($_POST) || wp_verify_nonce($_POST['name_of_nonce_field'],'name_of_my_action') === false ) {
    /* ошибка */
} else {
    /* успех, обработка, редирект */
}

Если ответ положительный, вы выполняете следующее действие — например, отображаете сообщение об успехе или, в вашем случае, перенаправляете страницу. Убедитесь, что редирект выполняется до вывода любого контента.

Также стоит учесть: http://kovshenin.com/2012/nonces-on-the-front-end-is-a-bad-idea/ — хотя в данном случае, поскольку вы создаете контент, автор упоминает, что использование nonce здесь "правильно".

17 июн. 2013 г. 06:21:58