Manual:Edit token/ja

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

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

なぜ必要なのか

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

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

When the user actually requests the change to be done (by pressing a button or following a link), the edit token is sent back to the server. This proves to the server that the user has requested the change directly from the site and not from an external site, as external sites do not have access to the edit token of the user. どのように動作するのか

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

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

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

ソースコード
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ハッシュを返します  saltを伴うPHPセッションの; PHPセッションにそのような要素が存在しない場合、ランダムなものが生成されます. See editToken function in SVN.
 * generateToken(salt) : ランダムな文字列を生成します(saltパラメータによります)
 * matchEditToken(token, salt) : 最初の引数tokenが、後者の引数saltに対する有効な編集トークンであるか検査します. これは生成の処理を繰り返して最初の引数と結果を比較することで行われます. 具体的には、この関数は を呼び出し最初の引数と結果を比較します.

Salt
デフォルトのsaltは空の文字列です; 多くのアクションはこのデフォルトの値を使います. 結果として、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.しかしながら、編集トークンはPHPセッションに保存されるので、セッションがクライアントに保存されていてセッションが対応するセッショントークンクッキーを持っている限りのみ利用できます(例えば、enwiki_sessionクッキー).

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 : saltはリバートされるユーザー名の編集に連結された記事のタイトル(名前空間の接頭辞を含む)です;
 * delete the old version of an image : saltは  パラメータです(すべてのバージョンを削除するときこのパラメータは空の文字列で、デフォルトのsaltでもあります);
 * Special:UserRights : saltは変更されるユーザーのプロパティのユーザー名です;
 * Special:Watchlist/clear : saltは'clearwatchlist'の文字列です 'clearwatchlist'

The edit token suffix
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: