4

ユーザーが画像リンク (例: http://abc.test.gif ) を配置できるテキストボックスと、ユーザーが代替テキスト (例: "This is test.gif") を配置できる別のテキストボックス、および送信ボタンを取得しました。 .

ユーザーが送信ボタンをクリックすると、プログラムは<img src="http://abc.test.gif" alt="This is test.gif">この文字列を生成し、後で使用できるように DB に保存します。

私の質問は: イメージリンク"http://abc.test.gif"と alt タグのテキストをサニタイズする必要がありますか?"This is test.gif"

たとえば、UriUtils.isSafeUri("http://abc.test.gif");&を使用する必要がありますか?SafeHtmlUtils.fromString("This is test.gif"

4

1 に答える 1

3

srcタグのおよびalt属性に入る任意のものをユーザーが意図的に入力できるようにしていますimg。これは実際、あらゆる種類の XSS 攻撃に対してオープンです。最近のブラウザーでまだ機能するいくつかの例については、こちらをご覧ください。

また、後で使用するために文字列を DB に保存しているため (推測)、後でそのような文字列を使用して DOM にノードを作成するときに攻撃が発生し、さらに予測不可能な結果が生じる可能性があります。

1 つの解決策は、URL と代替文字列のみをデータベースに保存し (存在する場合は適切な入力検証を使用して)、次のような単純なテンプレートを使用して (またはプログラムで を使用して) 、必要なときにセーフ スニペットを生成することです。 .imgSafeHtmlBuilder

public interface Template extends SafeHtmlTemplates {
  @Template("<img src=\"{0}\" alt=\"{1}\"/>")
  SafeHtml img(SafeUri uri, SafeHtml alternativeText);
}

次のように使用します。

template.img(
    UriUtils.fromString(yourValidatedDbUrl),
    SafeHtmlUtils.fromString(yourValidatedAlternativeText));

このようにして:

  • ユーザー入力を検証します。
  • 検証された値のみを (そのまま) 保存します。
  • 本当に必要な場合にのみ安全な方法で img スニペットを生成します。
于 2013-05-06T17:23:01.360 に答える