Manual:編集トークン

From MediaWiki.org
Jump to navigation Jump to search
This page is a translated version of the page Manual:Edit token and the translation is 94% complete.
Other languages:
Deutsch • ‎English • ‎español • ‎français • ‎italiano • ‎polski • ‎中文 • ‎日本語

編集トークン (edit token、別名 csrf トークン) は、ページを変更するアクションを実行するときにクライアントとMediaWikiサーバーの間で交わされるランダムな文字列です。外部サイトに訪問している間に騙されてwiki上の変更をリクエストしていないか(つまり、cross-site request forgery)を確認することよりも、ユーザーがwiki上で本当に変更しようとしているかを確認するために使用されます。

注意: このページの情報は開発者によって検証される必要があります。

なぜ必要なのか

編集トークンは変更を実行するときに追加のセキュリティ基準として使用されます。ユーザーアイデンティティがクッキーのみで確認される場合、外部サイトは訪問者にwikiの変更を実行させる次のようなリンクを利用できます。 https://en.wikipedia.org/w/index.php?title=Image:Abcd.jpg&action=delete&oldimage=324242234 そのようなリンクを許可すると管理者が知らずに画像の削除をリクエストすることにつながりかねません。管理者がまだログインしている場合、サーバーはクッキーを確認してリクエストを許可します。

このため、変更を実行するアクションはHTTPパラメータ、編集トークンとして渡されるデータの追加ピースが要求されます。編集トークンはユーザーが一つの変更を要求することが出来るものからウェブページに埋め込まれます; これは編集フォーム(「変更を公開」を押すことでページを変更できる場所)を含みますが、画像説明ページ(管理者が画像の古いバージョンの削除をリクエストできる場所)、投稿者の履歴(管理者がロールバック出来る場所)なども含みます。

ユーザーが実際に行われる変更をリクエストするとき(ボタンを押すもしくはリンクに従う)、編集トークンはサーバーに送られます。外部サイトはユーザーの編集トークンへのアクセス権限がないので、このことによってユーザーが外部サイトではなくサイトから直接の変更をサーバーにリクエストしたことを証明します。

どのように動作するのか

編集トークンはPHPセッションに保存されるランダムな文字列です。PHPセッションは連想配列でサーバーに保存されクッキーによってセッションを越えて維持されます(例えば英語のWikipediaではenwiki_session)。編集トークンはとりわけPHPセッションのwsEditToken要素に含まれます。

編集トークンはユーザーが変更をリクエスト出来る場所からウェブページに埋め込みされます。ページが生成される時、編集トークンはPHPセッションのwsEditToken要素が存在する場合、その要素から取得されます; さもなけばランダムな文字列が生成されその要素に保存されます。

ウェブページに実際に埋め込まれるものはwsEditToken要素自身ではありません。むしろ、この要素はsaltに連結されます。saltは特定のアクションとページに依存する文字列です; 結果の文字列はMD5のハッシュです; これはウェブページに埋め込まれるものです。ユーザーが実際にアクションをリクエストするとき、この文字列はHTTPパラメータ経由でサーバーに送られます。サーバーはこのパラメータの対応を確認することが出来ます: PHPセッションからそれを生成するために使用される手続きを繰り返し結果がパラメータと等しいかを検査します。

有効性

サーバから返る編集トークンは複数回にわたり異なる編集処理に用いることができます。 トークンには特定の有効期間があります。 期限切れのトークンでAPIを呼び出すと、トークン無効エラーを返します。 この事例では、サーバから有効な新しい編集トークンを入手してから、もう一度、処理を実行してください。

ソースコード

編集トークンは主にUser.phpソースファイルで取り扱われます。とりわけ次のようなメソッドがあります。

getEditToken(salt) 
returns the MD5 hash of the concatenation of the wpEditToken element of the PHP session with the salt. If such an element does not exist in the PHP session, a random one is generated. リポジトリ内の getEditToken 関数を参照してください。
matchEditToken(token, salt) 
最初の引数tokenが、後者の引数saltに対する有効な編集トークンであるか検査します。これは生成の処理を繰り返して最初の引数と結果を比較することで行われます。具体的には、この関数はeditToken(salt)を呼び出し最初の引数と結果を比較します。

Salt

デフォルトのsaltは空の文字列です; 多くのアクションはこの既定値を使います。結果として、サーバからページに最初のアクションを行うために受け取る編集トークン文字列を用いると、その他のページで別の処理を実行できます。しかしながら、編集トークンの保存先はPHPセッションであるため、これを利用する条件とは、サーバがセッションを保持していること、クライアントが対応するセッショントークンクッキー (例えば、enwiki_sessionクッキー) を保存している場合に限定されます。

saltを用いて生成した編集トークン用ハッシュは、同一のsaltをサーバとクライアントの両方で利用した場合のみ、その他の処理を行うことができます。そこでその特定のsaltの埋めこみ先が、最初の処理を行ったページに限定された場合、前述の編集トークンハッシュを利用しても別のページで処理を行うことは不可能です。

既定の空のsaltを使わない処理:
rollback 
saltとは編集を差し戻す予定のユーザー名に連結された (名前空間の接頭辞を含む) 記事名です;
特定の画像の古い版を削除 
saltとは oldimage パラメータです(すべてのバージョンを削除するときこのパラメータは空の文字列で、デフォルトのsaltでもあります);
Special:UserRights 
saltは変更されるユーザーのプロパティのユーザー名です;
Special:Watchlist/clear 
saltは'clearwatchlist'の文字列です 'clearwatchlist'

編集トークン接尾辞

リビジョン 18112 以降、編集トークンの末尾にバックスラッシュを追加し、合わせて、匿名利用者用にバックスラッシュ1個を用いる編集トークンを導入しました。この変更は壊れたプロキシに対する編集の防止策として実施されました。一般的にバッシュスラッシュを正しく扱うことが出来ないプロキシは、wikiのマークアップコードを混乱させてしまいます。この接頭辞はr23287時点で+\に変更され、文字「+」を混乱させるプロキシの検出にも使われています。

クライアント側のハッシュを取得

1.18以降はAJAXを介して編集トークンを取得する必要がなくなりましたmw.user.tokens.get( 'csrfToken' )として提供されます。ただしご利用のモジュールのResourceLoader依存として、mediawiki.userを定義しておく必要がある点に注意してください。mw.api.postWithToken()ヘルパー方式の採用が推奨され、Webページの読みこみ後にトークンが期限切れになった場合に自動的に再試行を行います。

関連項目