4

ページに HTML 入力フィールドであるテキストエリアがあります。その意図は、特定のアクションが実行された後にユーザーのブラウザーに表示される確認 HTML をユーザーが登録できるようにすることです。これは、何かを支払った後にペイパルが承認され、「ご購入いただきありがとうございます」と書かれたウェブサイトにリダイレクトされることを想像することができます。これはすでに問題なく実装されていますが、現在、ユーザーのセキュリティ (XSS/SQL インジェクション) について考えています。

私が知りたいのは、特定の html タグを<script> <embed> <object>コントローラーのポスト アクション内などで安全に除外する方法です。そのため、HTML 内に悪意のある html があることを検出した場合は、保存する前に実行を停止します。今、私はこのようにしています:

[CustomHandleError]
[HttpPost]
[ValidateAntiForgeryToken]
[AccessDeniedAuthorize(Roles = "Admin,CreateMerchant")]
public ActionResult Create(MerchantDTO merchantModel)
{
   if (ModelState.IsValid)
   {
      if (!IsSafeConfirmationHtml(merchantModel.ConfirmationHtml))
      {
         ModelState.AddModelError("ConfirmationHtml", "Unallowed HTML tags inputted");
         return View("Create", merchantModel);
      }
      .
      .
      .
   }
}

私の IsSafeConfirmationHTML は次のように定義されています

private bool IsSafeConfirmationHtml(string html)
{
   if (html.ToLower().Contains("<script") || html.ToLower().Contains("<embed") || html.ToLower().Contains("<object"))
   {
      return false;
   }
   return true;
}

これを行うためのよりスマートでクリーンな方法はありますか? つまり、「オブジェクト」、「スクリプト」などの単語をブロックする偽陽性を取得したくないのですが、「<」を「%3C」などに変換するエンコーディングにだまされたくありません。 ..

Ontopic : タグ内のスペーシングは機能しますか? 例: < script > alert("1"); < / script >?

4

1 に答える 1

1

したがって、エンコーディング攻撃を打ち負かすためにできることの 1 つは、UrlDecodeHtmlDecodeを実行することです(html デコードはおそらく余分ですが、スクリプトで何をするかによって異なります)。

チェックを高速化するもう 1 つの方法は、コンパイル済みの正規表現を使用することです。

private static Regex disallowedHtml = new Regex(@"script|embed|object",
     RegexOptions.IgnoreCase);

private bool IsSafeConfirmationHtml(string html)
{
    Match match = disallowedHtml.Match(html);
    return !match.success;
}

静的な Regex インスタンスは、最初の実行を除くすべての実行で正規表現のオーバーヘッドのほとんどをカットし、正規表現の一致を 3 つの個別のコンテンツを実行するよりもはるかに高速にします。開始山かっこ、html エンティティ、および URL エンコードされた文字を検索し、それらの文字と実際のタグ名などの間の空白を一致させるために、正規表現を十分に複雑にすることができます

これで、サイトへの訪問者に対して XSS またはインジェクション攻撃を実行するユーザー (アップローダー? 顧客? 適切な言葉はビジネス モデルによって異なります) から 100% 安全になるとは言えません。それらは、mime-type x-application などとして返される画像または css ファイルを指す可能性があります。そして、HTML は最近急速に変化しています。それを防ぐ最善の方法は、承認プロセスにも人間が関与することですが、人間は間違いを犯し、コンピューターはだまされる可能性があります。この 2 つのイベントが同時に発生してはならないという法律はありません。しかし、いくつかの安全策を講じることは正しいです。

于 2012-11-29T19:37:41.087 に答える