Manual:Edit token/ja

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

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

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

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

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

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

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

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

Validity
The edit token returned by the server can be reused multiple times for different edit operations. The token is only valid for a specific period of time. API call with a stale token will return a badtoken error. In this case it is necessary to get a new edit token from the server before retrying the operation.

ソースコード
編集トークンは主にUser.phpソースファイルで取り扱われます. とりわけ次のようなメソッドがあります.
 * editToken(salt) : 要素の連結のMD5ハッシュを返します  element of the PHP session with the salt; if such an element does not exist in the PHP session, a random one is generated; See editToken function in SVN.
 * generateToken(salt) : ランダムな文字列を生成します(saltパラメータによります)
 * matchEditToken(token, salt) : 最初の引数tokenが、後者の引数saltに対する有効な編集トークンであるか検査します. これは生成の処理を繰り返して最初の引数と結果を比較することで行われます. 具体的には、この関数は を呼び出し最初の引数と結果を比較します.

Salt
The default salt is the empty string; most actions use this default value. As a result, an edit token string received from a server to perform an initial action on a page can also be used to perform additional actions on other pages. However, since an edit token is stored in the PHP session, it can be used only as long as the session is kept in the server and the client has the corresponding session token cookie (e.g., the enwiki_session cookie).

An edit-token-hash generated using a salt can be used for performing additional actions only if the salt used by both server and client is the same. Therefore it follows that if the salt is only embedded in the page where the initial action is performed, then that same edit-token-hash cannot be used to enable actions on additional pages.


 * Actions not using the default empty salt are:


 * rollback : the salt is the title of the article (including the namespace prefix) concatenated with the name of the user whose edits are to be reverted;
 * delete the old version of an image : the salt is the  パラメータです(すべてのバージョンを削除するときこのパラメータは空の文字列で、デフォルトのsaltでもあります);
 * Special:UserRights : saltは変更されるユーザーのプロパティのユーザー名です;
 * Special:Watchlist/clear : saltは'clearwatchlist'の文字列です 'clearwatchlist'

編集トークン接尾辞
Since revision 18112, a trailing backslash has been added to edit tokens, and edit tokens made of a single backslash introduced for anonymous users. This change has been done to prevent broken proxies from editing: proxies that cannot correctly handle the backslash typically also mess up the wiki markup code. This suffix has been changed to  in r23287 to also catch broken proxies which mangle the '+' character.

Retrieving via Ajax
In 1.18 and higher, you do not need to retrieve the edit token using AJAX. It's available as. Note that you need to have defined mediawiki.user as a ResourceLoader dependency for your module.

Below is sample code for retrieving an edit token via an Ajax request: