セキュリティ原則の1つは、クライアントからサーバーに渡される文字列と変数を無害化することです。わかりやすいPHP XSS( クロスサイトスクリプティング )の脆弱性を防ぐための関数がいくつかあります:
XSS攻撃を防ぐためのDrupal 8戦略とは何ですか?XSS攻撃からサイトを保護するためにクライアントデータポストをクリーンアップするにはどうすればよいですか?
XSSの脆弱性を防ぐためにDrupal 7には filter_xss()
がありますが、Drupal 8はXSSに対する戦略です脆弱性?
クロスサイトスクリプティング(XSS)攻撃を回避するための出力のサニタイズ
Twigテンプレートを使用するTwigテーマエンジンは、デフォルトですべてを自動エスケープするようになりました。つまり、Twigテンプレートから出力されるすべての文字列(たとえば、
{{ }}
の間の何か)は、フィルターが使用されない場合、自動的にサニタイズされます。Drupalで使用可能なTwigフィルターについては、 Filters-Modifying Variables in Twig Templates を参照してください。
Twigの自動エスケープを利用するには(そして安全なマークアップがエスケープされないようにするには)、理想的にはすべてのHTMLをTwigテンプレートから出力する必要があります。
API関数 t() および
\Drupal::translation()->formatPlural()
を@
または%
プレースホルダーと共に使用して、安全で翻訳可能な文字列を作成します。詳細については、 Code text translation API in Drupal 8 を参照してください。
- プレーンテキストには Html :: escape() を使用します。
- 一部のHTMLタグを許可するテキストには、 Xss :: filter() を使用します。
- ほとんどのHTMLを許可する必要がある管理ユーザーが入力したテキストには、 Xss :: filterAdmin() を使用します。
t()、Html :: escape()、Xss :: filter()またはXss :: filterAdmin()によってサニタイズされた文字列は、レンダー配列から作成されたマークアップ文字列と同様に、自動的に安全とマークされます Renderer .
テキストをサニタイズすることもできますが、関連するテキスト形式のテキスト領域などのコンテキストを除いて、テーマまたはモジュールでcheck_markupを使用することはほとんど正しくありません。
出典:Drupal 8:セキュアなコードを書く作成者:Rade、Shyamala、Robert Castelo、およびPere Orga。
Twigテンプレートは私のアプリケーションの出力を無害化しませんでした。ページが読み込まれたときに、コメントフィールドに入力されて保存されたスクリプト文字列またはXSS攻撃が実行されました。代わりに、hook_ENTITY_TYPE_load
の各文字列入力フィールドをサニタイズすることで問題を解決しました。
if(isset($entity->$fieldName)) {
$value = $entity->get($fieldName)->value;
$value = htmlspecialchars($value);
$entity->set($fieldName, $value);
}
Drupalは一般に、入力ではなく出力でフィルタリングするアプローチを採用しています。
個人の入力をフィールドシステムの一部ではないものとして受け入れるモジュールは、それを出力するときに(特権を持つ管理者ユーザーからでも)フィルタリングする必要があります。通常、出力はレンダー配列です。したがって、これを行う簡単な方法は、レンダリング時に許可されるタグを制限することです。 単語ラベルの分類モジュールの出力 から例をとるには:
use Drupal\Component\Utility\Xss;
...
public function termTitle(TermInterface $taxonomy_term) {
return [
'#markup' => $taxonomy_term->getName(),
'#allowed_tags' => Xss::getHtmlTagList(),
];
}