• ベストアンサー

サニタイジング化されてしまったクォーテーションの復活

Javaで掲示板を作成しております。 入力された内容をタグがあれば正規表現によりサニタイジング化しています。 <font size="5" color="red">TEST"test"</font> → &lt;font size=&quot;5&quot; color=&quot;red&quot;&gt;TEST&quot;test&quot;&lt;/font&gt; 許可したタグは復活させています。 → <font size=&quot;5&quot; color=&quot;red&quot;>TEST&quot;test&quot;</font> ここで質問なのですが、 「&quot;5&quot;」と「&quot;red&quot;」のダブルクォーテーションを 復活させて「"5"」と「"red"」となるように、 また、「&quot;test&quot;」は復活させないようにするにはどういう方法が御座いますでしょうか? できれば、 <font size="5" color="red">TEST1"test1"</font> <font size="6" color="blue">TEST2"test2"</font> <font size="7" color="yellow">TEST3"test3"</font> がまとめて置換できればと思います。 宜しく御願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

>許可したタグは復活させています。 これは考え方が間違っています。許可している文字列はサニタイジングをすべきではありません。許可しながゆえにサニタイジングをするのですから。まぁどっちでも結果は同じになりますが、考え方とか構造の美しさの問題からあまりお勧めしません。 クロスサイトスクリプティングとは、例えば <script>alert(document.cookie);</script> このような文字列が入力された場合で、そのまま表示されたとするとクッキーの内容を表示することが出来てしまうことなどを利用した攻撃のことです。 上記はクッキーの内容を表示するだけで何の害もありませんが、ここに取得した値をget送信する記述を書けば 、攻撃者の用意するサーバにクッキー情報を送信することが出来てしまうわけです。 scriptタグは無効でfontタグのみを有効にした場合でもまだ同じ問題が残ります。例えばfontタグにonなんとか属性を記述しそこにスクリプトを記述すれば同じことが出来ます。 以上のことから、タグを有効にするという処理を入れることはお勧めできません。特にどういう記述が危険かも分からないのに有効にするというのはきわめて危険です。 スクリプトが実行できる可能性のあるタグを特定し、それのみを無効にするということも可能ではありますが、正規表現では表現しきれないと思います。出来たとしても複雑すぎてメンテナンスが大変困難です。 色や文字修飾を有効にしたいというのであれば、独自の特殊タグ、例えば「#色名#」と「##」で囲まれた部分をfontタグに置換するとかそんなルールにすると安全ですよ。

yachoi
質問者

お礼

御回答ありがとう御座います。 許可するタグよりも非許可のタグの数が多いのでそれなら思い切って すべてサニタイジングしてしまおうと思い進めておりましたが、 確かに美しくないですね... クロスサイトスクリプティングについて丁寧な解説をいただきイメージがつきました。 独自タグを検討してみたいと思います。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • UKY
  • ベストアンサー率50% (604/1207)
回答No.2

そもそも " を &quot; に変換せず全部そのままにしておけばいいんじゃないかと思ったんですが。

yachoi
質問者

お礼

ご回答ありがとうございます。 そうですね、ダブルクォーテーションの変換さえなければ面倒な置換処理を行なう必要が なくてよいかと思うのですが、 入力ミスあるいは意図的にタグのパラメータのダブルクォーテーションを 対にしなかった場合に以降の内容に影響がでてしまう点と、 この文字がクロスサイトスクリプティング対策が必要とするという 内容を見かけましたので、&、<、>、'、"の5つの文字はサニタイジング しておりました。 SQLインジェクション対策で「'」を無害化させるのは分かるのですが クロスサイトスクリプティングについてはよく分かりません。 scriptタグさえ押さえてしまえば問題ないような気がするのですが...

すると、全ての回答が全文表示されます。
  • Bonjin
  • ベストアンサー率43% (418/971)
回答No.1

><font size=&quot;5&quot; color=&quot;red&quot;>TEST&quot;test&quot;</font> ここまで戻せたなら < と > の間にある &quot; だけ " に戻せばいいんじゃないでしょうか?

yachoi
質問者

お礼

早々の回答ありがとう御座います。 アドバイスを頂きまして、はまっていたところから抜け出せました。 ありがとう御座いました。

yachoi
質問者

補足

Bonjinさんより頂いたアドバイスを参考に記述したものです。 //タグ内のダブルクォートを復活させる pattern = Pattern.compile("<(.+?)>", Pattern.CASE_INSENSITIVE); matcher = pattern.matcher(input); while(matcher.find()){ String targetStr = matcher.group();//この時点では<と>で囲まれたものだけが取得されている Pattern subPattern = Pattern.compile("&quot;(.*?)&quot;"); Matcher subMatcher = subPattern.matcher(targetStr); while(subMatcher.find()){//<と>の中で&quot;と&quot;で囲まれたものが取得 String targetStr2 = subMatcher.group(1); Pattern subSubPattern = Pattern.compile("&quot;(" + targetStr2 + ")&quot;"); Matcher subSubMatcher = subSubPattern.matcher(input); input = subSubMatcher.replaceAll("\"$1\""); } }

すると、全ての回答が全文表示されます。

関連するQ&A