2

SafeHtml をリンクと組み合わせてどのように使用しますか?

シナリオ: ユーザーは、リンクを含む可能性のある未フォーマットのテキストを入力できますI like&love http://www.stackoverflow.com。このテキストを GWT で安全にレンダリングしたいのですが、リンクをクリック可能にしますI like&amp;love <a="http://www.stackoverflow.com">stackoverflow.com</a>。GWT フロントエンドでテキストをレンダリングするだけでなく、リンクをクリックできるようにする必要がある電子メールでも送信したいと考えています。

これまでのところ、次のオプションを検討しました。

  1. 完全なテキストを HTML としてバックエンドに保存し、フロントエンドにそれが正しくエンコードされていると想定させます ( I like&amp;love <a="http://www.stackoverflow.com">stackoverflow.com</a>) -> XSS の脆弱性を導入します
  2. プレーン テキストを保存しますが、リンクは HTML ( I like&love <a="http://www.stackoverflow.com">stackoverflow.com</a>)としてバックエンドに保存し、フロントエンドでHtmlSanitizerを使用します。
  3. リンク ( ) のプレーン テキストと特別なエンコードをI like&love [stackoverflow.com|http://www.stackoverflow.com]バックエンドに保存し、フロントエンドでカスタム SafeHtml ジェネレーターを使用します。

私たちには、3 番目のオプションが最もきれいに見えますが、GWT の SafeHtml インフラストラクチャを利用できないため、最も多くのカスタム コードが必要になるようです。

問題を最もよく解決する方法を誰かが共有できますか? これまで検討していなかった別のオプションはありますか?

4

1 に答える 1

2

ユーザーが入力したとおりにテキストを保存し、出力用に変換するときに特別な処理を実行しないのはなぜですか (たとえば、電子メールの送信、PDF の作成など)。これは最も自然なアプローチであり、ユーザーに文字列の編集を提案する場合など、特別な処理を元に戻す必要はありません。

原則として、私は常に直接のトランスポート/ストレージ/出力ターゲットに対してのみエンコード/エスケープ/変換を実行します。このルールから逸脱する理由はほとんどありません。変換された値を DB にキャッシュするなど、パフォーマンスが理由の 1 つかもしれません。(これらの場合、DB フィールドに「text_htmltransformed」のような特定の名前を付けるのが最善だと思います。これにより、エスケープしないのと同じくらい有害な「オーバーエスケープ」を回避できます。)

注: エスケープ/エンコーディングは、入力検証に代わるものではありません。

于 2012-11-28T13:12:07.200 に答える