CMSimple_XH
CSRF 攻撃からの保護

Wikipedia によると

CSRF (Cross-site request forgery:クロスサイトリクエストフォージェリ)は、Webサイトに、信頼するユーザーから不正なコマンド(悪意のある攻撃を行う形式)が送信される攻撃方法です

CMSimple_XHに関しては、狙われるユーザーは管理者であり、管理者がウェブサイトにログインしている間に偽造されたHTMLリクエストをトリックすることができます。 このようにして、攻撃者は、管理者が許可していることをすべて行うことができます。例えば、設定の変更やテンプレートの変更などが可能です。 CSRF攻撃のリスクはCMSimple_XHのWebサイトでは低いかもしれませんが、その重大度は非常に高いので、予防措置を講じることは妥当です。

CMSimple_XHのCSRF保護は、それぞれのフォームに配置され、ユーザーのセッションデータに格納されているランダムに作成された128ビット値(別名トークン)に基づいています。 フォーム提出時に、トークンが比較され、等しくない場合、フォーム提出は拒否されます。 トークンはセッションごとに更新されるため、フォームを偽造したい攻撃者は、現在予想されているトークンを<emphasis>推測</ emphasis>しなければなりません。

今のところ、CSRF保護機能はグローバルオブジェクト$ _XH_csrfProtection として利用可能になります。 これは将来のバージョンではかなり変更される可能性があります。

使い方

CSRF攻撃から保護されなければならないすべてのフォームは、隠された入力要素によって拡張されなければなりません。
隠された入力要素は、 XH::CSRFProtection::tokenInput() を呼び出すことによって挿入できます。
例)送信側

<form action="..." method="post">
....
<?php echo $_XH_csrfProtection->tokenInput();?>
</form>

フォームの受け側には、 XH::CSRFProtection::check() 呼び出すことによってトークンをチェックする必要があります。
トークンが一致しない場合、スクリプトの実行はすぐに適切なメッセージで終了します。 この場合、メッセージは攻撃者には見えないが、誰かが自分のWebサイトに対してCSRF攻撃を試みたと簡単に結論づけることができる管理者が、このエラーを明確に示すことは合理的です。
受け側の例:

if (isset($_POST['my_form'])) {
    $_XH_csrfProtection->check();
    // processing form submission
}

基本的には全てに必要です。 新しいCSRFトークンの作成や、セッションに最新のトークンを格納する作業は、CMSimple_XHによって処理されます。
単一のドキュメント(別名CMSimple_XHページ)に対してCSRF保護の複数のフォームが発行されたとしても、すべてが正常に動作するはずです。

管理フォームには、CMSimple_XHのコアと plugin_admin_common() によってすでに用意されています。
他の形態では、上記の方法でCSRF保護を追加する必要があります。

強力な保護

CSRF攻撃を受けても各セッションの共通のトークンが合理的な保護を提供しますが、上記は、各要求の新しいトークンなので更に安全です。
しかし、後者には、Ajax、別のウィンドウ、複数のブラウザタブに関するいくつかの制限があります。これは、送信可能なフォームに古いトークンがまだ存在しているにもかかわらずトークンが更新される可能性があるからです。 したがって、トークンをセッションごとに1回更新するためのより簡単で柔軟なアプローチを採用することに決めました
While a common token for each session gives reasonable protection againgst CSRF attacks, a new token for each request is even more secure. However, the latter has several limitations regarding Ajax, separate windows and multiple browser tabs, as these might renew the token despite the old token still being present on forms which should be submittable. Therefore we have decided to stick with the more foolproof and flexible approach to renew the token once per session.

  XH::CSRFProtection クラスでは、独自のCSRFトークンを処理し、リクエストごとにセッションごとに1回更新するかどうかを選択できます。 これを行うには、クラスの独自のインスタンスを作成し、独自のキー名と、各要求に対して新しいトークンをを渡します。
上記で説明した処理に加えて、要求終了時にセッション変数にCSRFトークンを格納する XH::CSRFProtection::store() を呼び出す必要 があります。
概要:

require_once $pth['folder']['classes'] . 'CSRFProtection.php';
$myCsrfProtection = new XH_CSRFProtection('my_csrf_key', true);
if (!isset($_POST[...])) {
    echo '
'; // emit form input elements echo $myCsrfProtection->tokenInput(); echo '
'; $myCsrfProtection->store(); } else { $myCsrfProtection->check(); // processing of form submission }

外部スクリプト

プラグインが「外部」スクリプトを要求することがあります。つまり、CMSimple_XHインストールのindex.phpを要求しません。
この場合、 XH::CSRFProtection クラスはまったく使用できません。このクラスは、CMSimple_XHによって設定される変数、定数などに依存するためです。 クラスが正しく動作するようになるかもしれませんが、クラスの定義は次のバージョンで変更される可能性があります。 この場合、あなた自身のCSRF保護を実装する方がよいでしょう。