У меня есть форма на моем сайте WordPress (4.9.1), которая включает в себя поле nonce (с wp_nonce_field ()) и отправляет сообщения в admin-post.php.
Я использую это очень просто …
<?php wp_nonce_field( $action, 'referer' ); ?>
…Это создает что-то вроде этого:
<input type="hidden" id="referer" name="referer" value="d6dd8e58dd" />
<input type="hidden" name="_wp_http_referer" value="/slug/?laorder=99371&laid=92bbfca59e41a4938ce8c0751cfcd0c4a68e75c14bd94b981505cc037079280&lauser=myemail%domain.com" />
Проблема в проверке:
if (! isset( $_POST['referer'] ) || ! wp_verify_nonce( $_POST['referer'], $action ) )
происходит сбой при некоторых (неизвестных) обстоятельствах: кажется, что он работает всегда при публикации в режиме инкогнито, и происходит сбой случайным образом для некоторых пользователей с разными браузерами (chrome, firefox или safari).
Все пользователи являются гостями.
Кто-нибудь знает, почему это случайный поведение происходит?
Как вы сказали, все пользователи являются гостями, и ни один из них не вошел в систему, но вы не должны использовать nonce для не авторизованных пользователей. Вы не должны использовать одноразовые номера в сценариях полного или частичного кэширования страниц. В отличие от впечатлений, получаемых много раз, простое добавление одноразовых номеров без особой причины не улучшает безопасность сайтов и может вызвать реальные проблемы для не авторизованных пользователей.
потому что WordPress проверит вашу информацию о cookie-файлах аутентификации, и, если вам будет разрешено удалить это сообщение, вы приступите к его удалению. Что злоумышленник может сделать с этим, так это заставить ваш браузер перейти на этот URL без вашего ведома. Например, путем создания ссылки на сторонней странице. Например, имея:
<img src="http://example.com/wp-admin/post.php?post=123&action=trash" />
В этом. Это заставит ваш браузер отправлять запрос в WordPress, браузер автоматически присоединит ваш файл cookie для аутентификации, и WordPress сочтет этот запрос допустимым.
Других решений пока нет …