SafeCracker は組み込みの ExpressionEngine XSS Sanitization Methodを使用して、クロス サイト スクリプティング (XSS) および SQL インジェクションの脆弱性からユーザーが送信した入力を消去します。
フロントサイドのユーザー入力は$this->EE->security->xss_clean()
、データベースに挿入される前、または画面に出力される前に、 を使用してサニタイズされます。
ありがたいことに、EllisLab のエンジニアは、SafeCracker で使用されるfieldtypesとfield_idsを「ホワイトリストに登録」し、XSS フィルタリングから除外する、文書化されていない秘密の方法を提供してくれました。
SafeCrackerが特定のフィールドからすべての HTML を削除しないようにするには、実行している ExpressionEngine のバージョンに応じて、次のファイルを開きます。
EE 2.1.3 以前(サードパーティのアドオンとしてインストールされた SafeCracker)
/system/expressionengine/third_party/safecracker/libraries/safecracker_lib.php
EE 2.2.0 以降(ファーストパーティ モジュールとしてインストールされた SafeCracker)
/system/expressionengine/modules/safecracker/libraries/safecracker_lib.php
注: ExpressionEngine 2.2.0 には SafeCracker がファースト パーティ モジュールとしてバンドルされているため、インストール場所は、実行しているバージョンまたはアップグレードしたバージョンによって異なります。
行 2371 (EE 2.1.3 の場合)または行2516 (EE 2.2 の場合)まで下にスクロールし、次を探します。
$this->skip_xss_fieldtypes = array();
$this->skip_xss_field_ids = array();
ここから楽しみが始まります。フィールドを「ホワイトリスト」に登録して XSS フィルターを適用しないようにするには、どちらかの配列にfieldtypeまたはfield_idを追加するだけです。
次に例を示します。
$this->skip_xss_fieldtypes = array(
// This is the fieldtype as specified in the Control Panel
// Channel Fields, not what you use in your SafeCracker template
'textarea'
);
$this->skip_xss_field_ids = array(
// This is the field_id from the exp_channel_data MySQL Table
'field_id_1'
);
特定のタイプのフィールドタイプ (textarea 、input など) を指定するか、より明確にしたい場合はfield_idを指定できます。前者の方法はより一般的ですが、後者の方法は絶対的であり、カスタム フィールドがそのタイプを変更した場合により柔軟です。
これらの変更により、XSS サニタイズ メソッドから除外したフィールドにはフィルタリングが適用されなくなり、任意の HTML をデータベースに送信できるようになります。
ExpressionEngine をアップグレードするとこのファイルが上書きされる可能性があるため、ファイルのアクセス許可を変更するか、バックアップを手元に置いておくことをお勧めします。
クロス サイト スクリプティングは、自分のサイトが攻撃ベクトルのソースになることを決して望まないため、非常に真剣に受け止める必要があります。常に注意を怠ってください。