この記事では、Yii2 の XSS 攻撃防止戦略を例とともに説明します。参考までに皆さんと共有してください。詳細は次のとおりです:
XSS脆弱性修復
原則: お客様が入力したデータを信頼しないでください
注: 攻撃コードは必ずしも
① 重要な Cookie を変更します。http のみとしてマークされています。この場合、JavaScript の document.cookie ステートメントは Cookie を取得できません。
② ユーザーが期待するデータの入力のみを許可します。 例: 年齢テキストボックスでは、ユーザーは数字のみを入力できます。 数字以外の文字は除外されます。
③ データの Html エンコード処理
④ 特殊な Html タグをフィルターまたは削除します。例: script、iframe、< の >、" for
⑤ JavaScript イベント タグのフィルター。例: "onclick = "、"Onfocus" など。
XSS 防止
<?php echo CHtml::encode($user->name) ?>
このメソッドのソース コード:
/** * Encodes special characters into HTML entities. * The [[\yii\base\Application::charset|application charset]] will be used for encoding. * @param string $content the content to be encoded * @param boolean $doubleEncode whether to encode HTML entities in `$content`. If false, * HTML entities in `$content` will not be further encoded. * @return string the encoded content * @see decode() * @see http://www.php.net/manual/en/function.htmlspecialchars.php */ public static function encode($content, $doubleEncode = true) { return htmlspecialchars($content, ENT_QUOTES | ENT_SUBSTITUTE, Yii::$app->charset, $doubleEncode); }
http://php.net/manual/zh/function.htmlentities.php
http://cn2.php.net/manual/zh/function.urlencode .php
定数名の説明
ENT_COMPAT 二重引用符を変換し、一重引用符はそのままにします。
ENT_QUOTES 二重引用符と一重引用符の両方を変換します。
ENT_NOQUOTES 二重引用符と一重引用符の両方を変換せずに残します。
ENT_IGNORE 無効なコードユニットをサイレントに破棄します。空の文字列を返す代わりにシーケンスを返します。セキュリティに影響を与える可能性があるため、このフラグの使用は推奨されません。
ENT_SUBSTITUTE 代わりに、無効なコード単位シーケンスを Unicode 置換文字 U+FFFD (UTF-8) または FFFD (それ以外の場合) に置き換えます。
ENT_DISALLOWED 指定されたドキュメント タイプの無効なコード ポイントをそのままにするのではなく、Unicode 置換文字 U+FFFD (UTF-8) または FFFD (それ以外の場合) に置き換えます。たとえば、外部コンテンツが埋め込まれた XML ドキュメントの整形式性を保証します。
ENT_HTML401 コードを HTML 4.01 として処理します。
ENT_XML1 コードを XML 1 として処理します。
ENT_XHTML コードを XHTML として処理します。
ENT_HTML5 コードを HTML 5 として処理します。
string htmlspecialchars ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = ini_get("default_charset") [, bool $double_encode = true ] ] ] )
" (二重引用符) になります。ENT_NOQUOTES が設定されていない場合は、
' (一重引用符) になります。 ' (または ') は ENT_QUOTES が設定されている場合のみです。
< (より小さい) は <
> (より大きい) になります
<?php $new = htmlspecialchars("<a href='test'>Test</a>", ENT_QUOTES); echo $new; // <a href='test'>Test</a> ?>
string htmlentities ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = ini_get("default_charset") [, bool $double_encode = true ] ] ] )
<?php $str = "A 'quote' is <b>bold</b>"; // Outputs: A 'quote' is <b>bold</b> echo htmlentities($str); // Outputs: A 'quote' is <b>bold</b> echo htmlentities($str, ENT_QUOTES); ?>
http://www.baidu.com/s?wd=%B2%E2%CA%D4%BA%BA%D7%D6&rsv_bp=0&rsv_spt=3&inputT=7477 になります
この文字列内のすべての英数字以外の文字は、-_ を除き、すべての文字に置き換えられます。パーセント記号 (%) の後に 2 つの 16 進数が続き、スペースはプラス記号 (+) としてエンコードされます。このエンコーディングは、WWW フォーム POST データのエンコーディングと同じであり、application/x-www-form-urlencoded メディア タイプと同じエンコーディングです。歴史的な理由により、このエンコードは、スペースをプラス記号 (+) としてエンコードする点で RFC1738 エンコード (rawurlencode() を参照) とは異なります。
<?php echo '<a href="mycgi?foo=', urlencode($userinput), '">'; ?>