Příručka:Úprava tokenů
Edit token (token úprav) (také známý jako token csrf) je náhodný řetězec, který se předává mezi klientem a serverem MediaWiki při provádění akcí, které mění stránky. Používá se ke kontrole, že uživatel skutečně zamýšlel provést změnu, spíše než aby byl oklamán, aby požádal o změnu na wiki při návštěvě externího webu (tj. padělání požadavku mezi weby).
Proč je to nutné
Tokeny úprav se používají jako dodatečné bezpečnostní opatření při provádění změn. Pokud by byla identita uživatele kontrolována pouze pomocí souborů cookie, externí stránka by mohla použít odkaz jako je následující, aby návštěvníci provedli změny na wiki.
https://en.wikipedia.org/w/index.php?title=Image:Abcd.jpg&action=delete&oldimage=324242234
Sledování takového odkazu by vedlo správce k nevědomému požadavku na smazání obrázku. Pokud je správce stále přihlášen, server zkontroluje soubory cookie a vyhoví požadavku.
Z tohoto důvodu vyžadují akce, které provádějí změny, další část dat, která je předána jako parametr HTTP, token úprav. Token pro úpravy je vložen do webových stránek, ze kterých může uživatel požádat o změnu. To zahrnuje formulář pro úpravy (kde lze změnit stránku stisknutím "Zveřejnit změny"), ale také stránky s popisem obrázku (kde může správce požádat o smazání staré verze obrázku), historie přispěvatelů (kde se mohou správci vrátit) atd. .
Pokud uživatel skutečně požaduje provedení změny (stisknutím tlačítka nebo pomocí odkazu), je token pro úpravy odeslán zpět na server. To dokazuje serveru, že uživatel požádal o změnu přímo z webu a ne z externího webu, protože externí weby nemají přístup k tokenům úprav uživatele.
Jak to funguje
Token úprav je náhodný řetězec uložený v relaci PHP, což je asociativní pole, které je uloženo na serveru a udržováno napříč relacemi díky souboru cookie (např. enwiki_session
na anglické Wikipedii).
Editační token je obsažen zejména v wsEditToken
elementu PHP session.
Tokeny úprav jsou vloženy do webových stránek, odkud může uživatel požádat o změnu.
Když má být taková stránka vygenerována, je token pro úpravy načten z prvku wsEditToken
relace PHP, pokud takový prvek existuje. Jinak se vygeneruje náhodný řetězec a uloží se do tohoto prvku.
To, co je ve skutečnosti vloženo do webové stránky, není samotný prvek wsEditToken
.
Tento prvek je spíše zřetězen k salt, což je řetězec, který závisí na konkrétní akci a stránce. Výsledný řetězec je pak MD5-hash. To je to, co je součástí webové stránky.
Když uživatel skutečně požaduje akci, je tento řetězec odeslán zpět na server prostřednictvím parametru HTTP.
Server pak může zkontrolovat správnost tohoto parametru: Zopakuje postup použitý k jeho vygenerování z PHP relace a zkontroluje, zda se výsledek shoduje s parametrem.
Platnost
Token úprav vrácený serverem lze opakovaně použít pro různé operace úprav. Token je platný pouze po určitou dobu. Volání API se zastaralým tokenem vrátí chybu badtoken. V tomto případě je nutné před opakováním operace získat nový token pro úpravy ze serveru.
Zdrojový kód
Editační tokeny jsou řešeny především ve zdrojovém souboru User.php a to zejména následujícími metodami.
- getEditToken(salt)
- vrátí MD5 hash zřetězení prvku
wpEditToken
relace PHP se salt. Pokud takový prvek v relaci PHP neexistuje, vygeneruje se náhodný prvek. Viz getEditToken funkce v úložišti. - matchEditToken(token, salt)
- zkontroluje, zda je jeho první argument platným tokenem úprav s ohledem na salt. To se provádí opakováním procedury generování a následným porovnáním výsledku s prvním argumentem. Konkrétně tato funkce volá
editToken(salt)
a poté porovnává výsledek s prvním argumentem;
Salt
Výchozí salt je prázdný řetězec. Většina akcí používá tuto výchozí hodnotu. V důsledku toho lze řetězec tokenu úprav přijatý ze serveru k provedení počáteční akce na stránce použít také k provedení dalších akcí na jiných stránkách. Protože je však token pro úpravy uložen v relaci PHP, lze jej používat pouze tehdy, pokud je relace udržována na serveru a klient má odpovídající cookie tokenu relace (např. soubor cookie enwiki_session).
Hash editačního tokenu vygenerovaný pomocí salt lze použít k provádění dalších akcí pouze v případě, že salt používaný serverem i klientem je stejný. Z toho tedy vyplývá, že pokud je salt vložen pouze do stránky, kde se provádí počáteční akce, pak stejný hash editačního tokenu nelze použít k povolení akcí na dalších stránkách.
- Akce, které nepoužívají výchozí prázdný salt, jsou:
- rollback
- salt je název článku (včetně předpony jmenného prostoru) spojený se jménem uživatele, jehož úpravy mají být vráceny;
- odstranění staré verze obrázku
- salt je parametr
oldimage
(při odstraňování všech verzí je tento parametr prázdný řetězec, který je také výchozí hodnotou salt); - Special:UserRights
- salt je uživatelské jméno uživatele, jehož vlastnosti mají být změněny;
- Special:Watchlist/clear
- salt je řetězec 'clearwatchlist'
Přípona tokenu úprav
Upravovací tokeny končí na +\
, aby se zabránilo úpravám poškozených proxy: Proxy, které neumí správně zpracovat zpětné lomítko nebo znaménko plus, obvykle také pokazí značkovací kód wiki.
Načítání na straně klienta
Ve verzi 1.18 a vyšší nepotřebujete získávat token úprav pomocí AJAXu. Je k dispozici jako mw.user.tokens.get( 'csrfToken' )
.
Všimněte si, že musíte mít definovaný mediawiki.user jako závislost ResourceLoader pro váš modul.
Doporučuje se použít pomocnou metodu mw.api.postWithToken()
, která se automaticky postará o opakování, pokud od načtení webové stránky vypršela platnost tokenu.