Manual:Edit token/ja

編集トークン (edit token、別名 csrf トークン) は、ページを変更するアクションを実行するときにクライアントとMediaWikiサーバーの間で交わされるランダムな文字列です. 外部サイトに訪問している間に騙されてwiki上の変更をリクエストしていないか(つまり、cross-site request forgery)を確認することよりも、ユーザーがwiki上で本当に変更しようとしているかを確認するために使用されます. It is used to check that the user really intended to make the change, rather than being tricked into requesting the change on the wiki while visiting an external site (i.e. cross-site request forgery).

なぜ必要なのか
編集トークンは変更を実行するときに追加のセキュリティ基準として使用されます. ユーザーアイデンティティがクッキーのみで確認される場合、外部サイトは訪問者にwikiの変更を実行させる次のようなリンクを利用できます. If the user identity were checked using cookies only, an external site could use a link like the following one to have visitors perform changes to the wiki. https://en.wikipedia.org/w/index.php?title=Image:Abcd.jpg&action=delete&oldimage=324242234 そのようなリンクを許可すると管理者が知らずに画像の削除をリクエストすることにつながりかねません. 管理者がまだログインしている場合、サーバーはクッキーを確認してリクエストを許可します. If the administrator is still logged in, the server would check the cookies and grant the request.

このため、変更を実行するアクションはHTTPパラメータ、編集トークンとして渡されるデータの追加ピースが要求されます. 編集トークンはユーザーが一つの変更を要求することが出来るものからウェブページに埋め込まれます; これは編集フォーム(「$1」を押すことでページを変更できる場所)を含みますが、画像説明ページ(管理者が画像の古いバージョンの削除をリクエストできる場所)、投稿者の履歴(管理者がロールバック出来る場所)なども含みます. An edit token is embedded into web pages from which the user can request a change; this includes the edit form (where one can change a page by pressing "") but also the image description pages (where an administrator can request deletion of an old version of an image), contributor histories (where administrators can rollback), etc.

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

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

編集トークンはユーザーが変更をリクエスト出来る場所からウェブページに埋め込みされます. ページが生成される時、編集トークンはPHPセッションの 要素が存在する場合、その要素から取得されます; さもなけばランダムな文字列が生成されその要素に保存されます. When such a page is to be generated, the edit token is retrieved from the  element of the PHP session, if such an element exists; otherwise, a random string is generated and stored in that element.

ウェブページに実際に埋め込まれるものは 要素自身ではありません. むしろ、この要素はsaltに連結されます. saltは特定のアクションとページに依存する文字列です; 結果の文字列はMD5のハッシュです; これはウェブページに埋め込まれるものです. ユーザーが実際にアクションをリクエストするとき、この文字列はHTTPパラメータ経由でサーバーに送られます. サーバーはこのパラメータの対応を確認することが出来ます: PHPセッションからそれを生成するために使用される手続きを繰り返し結果がパラメータと等しいかを検査します. Rather, this element is concatenated to the salt, which is a string that depends on the particular action and page; the resulting string is then MD5-hashed; this is what is embedded in the web page. When the user actually requests the action, this string is sent back to the server via an HTTP parameter. The server can then check the correctness of this parameter: it repeats the procedure used to generate it from the PHP session and checks if the result is equal to the parameter.

有効性
サーバから返る編集トークンは複数回にわたり異なる編集処理に用いることができます. トークンには特定の有効期間があります. 期限切れのトークンでAPIを呼び出すと、トークン無効エラーを返します. この事例では、サーバから有効な新しい編集トークンを入手してから、もう一度、処理を実行してください. 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ソースファイルで取り扱われます. とりわけ次のようなメソッドがあります.
 * getEditToken(salt) : returns the MD5 hash of the concatenation of the  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に対する有効な編集トークンであるか検査します. これは生成の処理を繰り返して最初の引数と結果を比較することで行われます. 具体的には、この関数は を呼び出し最初の引数と結果を比較します.

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

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


 * 既定の空のsaltを使わない処理:


 * rollback : saltとは編集を差し戻す予定のユーザー名に連結された (名前空間の接頭辞を含む) 記事名です;
 * 特定の画像の古い版を削除 : saltとは


 * delete the old version of an image : the salt is the

パラメータです(すべてのバージョンを削除するときこのパラメータは空の文字列で、デフォルトのsaltでもあります);
 * Special:UserRights : saltは変更されるユーザーのプロパティのユーザー名です;
 * Special:Watchlist/clear : saltは'clearwatchlist'の文字列です


 * Special:UserRights : the salt is the username of the user whose properties are to be changed;
 * Special:Watchlist/clear : the salt is the string 'clearwatchlist'

編集トークン接尾辞
Edit tokens end with  to prevent broken proxies from editing: proxies that cannot correctly handle the backslash or plus sign typically also mess up the wiki markup code.

クライアント側のハッシュを取得
1.18以降はAJAXを介して編集トークンを取得する必要がなくなりました. として提供されます. ただしご利用のモジュールのResourceLoader依存として、mediawiki.userを定義しておく必要がある点に注意してください. $code2ヘルパー方式の採用が推奨され、Webページの読みこみ後にトークンが期限切れになった場合に自動的に再試行を行います. Note that you need to have defined mediawiki.user as a ResourceLoader dependency for your module. It is recommended that you use the  helper method, which automatically takes care of retries if the token has expired since the web page was loaded.