Wordpress - nonce neni "once"

1 PHP, Bezpečnost

Wordpress obsahuje vlastní implementaci mechanismu zvaný nonce, který využívá v administraci. Pluginy i témata jej také můžou využívat pro své potřeby. Nevýhoda je však ta, že integrovaná implementace postrádá tu důležitou vlastnost "once".

Wordpress - nonce neni "once"

Number used once, zkráceně nonce je mechanizmus, který se často využívá jako ochrana proti dvojitému provedení jedné akce a někdy také k ochraně proti CSRF.  Ve Wordpressu je možné systém nonce použít také pro kontrolu vlastních akcí. Má však své nevýhody.

Proč WP NONCE není "once"?

Na začátek je nutné ukázat, jak se WP nonce používá. Pro přidání nonce do URL se jednoduše zavolá funkce wp_nonce_url, které se kromě URL předá i název akce. V případě formuláře se používá funkce wp_nonce_field, která vygeneruje skrytá pole. Následně probíhá kontrola pomocí funkce wp_verify_nonce, která kontroluje správnost.

// Ukázka generování NONCE pro URL s vlastní akcí
wp_nonce_url(admin_url("/edit.php?post_type=concerts&post=123&page=show_players&send_email=1"), "send_email-1");

// Kontrola pomocí check_admin_referer je podobná jako wp_verify_nonce.
// Navíc kontroluje, jestli požadavek pochází původně z administrace.
check_admin_referer( 'send_email-1' ); // Použitelné pouze v administraci

Nonce je stejné po dobu 24 hodin pro jednu akci

Funkce wp_create_nonce, která je na pozadí volána používá jednoduchou metodu pro vygenerování náhodného nonce textu. Ten je po dobu až 24 hodin pro stejnou akci vždy totožný. Problém ale nastává, že při kontrole ať už funkcí wp_verify_nonce nebo check_admin_referer není tento text znehodnocen a bude stejný i nadále.

Použití pro základní ošetření proti CSRF je možná dostačující. Nicméně vlastnost used once, neboli jediné použití ovšem postrádá. Pro akci bude nový nonce text vygenerován až po uplynutí 24 hodin nebo po novém přihlášení uživatele.

Pravý "used once" systém

Díky návrhu není možné donutit WordPress po použití vygenerovat nový nonce. Proto je nutné se podívat po jiném řešení. Nastává možnost si vytvořit svůj vlastní nonce systém, což není úplně jednoduché.

Druhá možnost je použít již hotový nonce systém, těch ale moc není. Aktuálně se na GitHubu nachází WP Simple Nonce, který v době článku nebyl 4 roky aktualizován. Druhé řešení je WP Real Nonce.


Máte jiné řešení nonce pro Wordpress? Podělte se s ostatními v komentáři

K tomuto článku již není možné přidávat další komentáře

Komentáře

I am not sure where you are getting your info, but great topic.
I needs to spend some time learning more or understanding more.
Thanks for fantastic information I was looking for this info for my mission.