ホームページ >php教程 >PHP开发 >Yii2 XSS 攻撃防御戦略分析

Yii2 XSS 攻撃防御戦略分析

高洛峰
高洛峰オリジナル
2016-12-23 16:46:421273ブラウズ

この記事では、Yii2 の XSS 攻撃防止戦略を例とともに説明します。参考までに皆さんと共有してください。詳細は次のとおりです:

XSS脆弱性修復

原則: お客様が入力したデータを信頼しないでください
注: 攻撃コードは必ずしも3f1c4e4b6b16bbbd69b2ee476dc4f83abe33f64fc8736a12461fcf4b655eeb6c、" 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);
}

HtmlSpecialchars & HTMLETIES & UrLenCode: tp:///php。 net/manual/zh/function.htmlspecialchars.php

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 として処理します。

htmlspecialchars

特殊文字を HTML エンティティに変換します

string htmlspecialchars (
      string $string
      [, int $flags = ENT_COMPAT | ENT_HTML401
      [, string $encoding = ini_get("default_charset")
      [, bool $double_encode = true ]
    ]
  ]
)

実行される変換は次のとおりです:

& (アンパサンド) は &

" (二重引用符) になります。ENT_NOQUOTES が設定されていない場合は、
' (一重引用符) になります。 ' (または ') は ENT_QUOTES が設定されている場合のみです。
2c6d73791052a5ace03f32b371dacc3f (より大きい) になります

<?php
$new = htmlspecialchars("<a href=&#39;test&#39;>Test</a>", ENT_QUOTES);
echo $new; // <a href=&#39;test&#39;>Test</a>
?>

htmlentities

該当するすべての文字を HTML エンティティに変換します

string htmlentities (
      string $string
      [, int $flags = ENT_COMPAT | ENT_HTML401
      [, string $encoding = ini_get("default_charset")
      [, bool $double_encode = true ]
    ]
  ]
)


<?php
$str = "A &#39;quote&#39; is <b>bold</b>";
// Outputs: A &#39;quote&#39; is <b>bold</b>
echo htmlentities($str);
// Outputs: A &#39;quote&#39; is <b>bold</b>
echo htmlentities($str, ENT_QUOTES);
?>

urlencode

URLエンコードはURLの仕様に準拠します。標準の URL 仕様では、中国語や多くの文字を URL に使用することは許可されていないためです。

たとえば、Baidu で「漢字テスト」を検索します。 URL は

http://www.baidu.com/s?wd=%B2%E2%CA%D4%BA%BA%D7%D6&rsv_bp=0&rsv_spt=3&inputT=7477 になります

いわゆる URL エンコードは: 英数字以外の文字は、パーセント記号 (%) とそれに続く 2 つの 16 進数に置き換えられ、スペースはプラス記号 (+) としてエンコードされます。

この文字列内のすべての英数字以外の文字は、-_ を除き、すべての文字に置き換えられます。パーセント記号 (%) の後に 2 つの 16 進数が続き、スペースはプラス記号 (+) としてエンコードされます。このエンコーディングは、WWW フォーム POST データのエンコーディングと同じであり、application/x-www-form-urlencoded メディア タイプと同じエンコーディングです。歴史的な理由により、このエンコードは、スペースをプラス記号 (+) としてエンコードする点で RFC1738 エンコード (rawurlencode() を参照) とは異なります。

<?php
echo &#39;<a href="mycgi?foo=&#39;, urlencode($userinput), &#39;">&#39;;
?>
rreeee

この記事が皆さんの Yii フレームワークに基づいた PHP プログラムの設計に役立つことを願っています。

Yii2 の XSS 攻撃防御戦略分析に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。