- - PR -
Filter処理について
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-04-27 14:25
いつもお世話になっております。
現在、Filter処理で悩んでいることがあります。 環境(WinXP、JDK1.5.0、struts1.2.4、tomcat5.5.16) sample.jspから送信ボタンでアクションに処理が移りますが、 そこで、2つのFilter処理を考えております。 どちらも、sample.jspのテキスト項目の全てに行う予定です。 1.EncodingFilter.javaによるテキスト項目のエンコーディング 2.SecurityFilter.javaによるテキスト項目の特殊文字を変換 始めに、1.の処理を作成しうまくいきました。 次に、 2.の処理を作成していましたが止まってしまいました。 sample.jspのテキスト項目(name01、name02、name03)がありますが、 各テキストごとに変換するのではなく、項目数がいくら増えてもいいように sample.jspにある全てのテキスト項目を一度に変換できないのか? ということです。 解決方法をご存知の方がいらっしゃれば、ご教授お願いします。 ■sample.jsp ----------------------------------------------------- <html:html> <head><title>テキストの入力のタグの削除</title></head> <body> <html:form method="post" action="/action"> 名前01:<html:text property="name01"> 名前02:<html:text property="name02"> 名前03:<html:text property="name03"> <input:submit property="sosinBtn" value="送信"> </form> </body> </html:html> ■EncodingFilter.java ------------------------------------------------- public class EncodingFilter implements Filter { public void init(FilterConfig arg0) throws ServletException{ } public void doFilter( ServletRequest request, ServletResponse response, FilterChain chain ) throws IOException, ServletException{ request.setCharacterEncoding("Shift_JIS"); chain.doFilter(request, response); } public void destroy(){ } } ■SecurityFilter.java ----------------------------------------------- public class SecurityFilter implements Filter { public void init(FilterConfig arg0) throws ServletException{ } public void doFilter( ServletRequest request, ServletResponse response, FilterChain chain ) throws IOException, ServletException{ request.setCharacterEncoding("JISAutoDetect"); // ★name01のみではなく、全ての項目を一度に変換できないものなのか? String name01 = request.getParameter("name01"); name01 = name01.replaceAll("<","<"); name01 = name01.replaceAll(">",">"); String name02 = request.getParameter("name02"); name01 = name02.replaceAll("<","<"); name01 = name02.replaceAll(">",">"); : response.setContentType("text/html;charset=Shift_JIS"); } public void destroy(){ } } ■web.xml---------------------------------------------------------------------- : <web-app> <display-name>Struts Blank Application</display-name> <!-- リクエストパラメータの日本語対応フィルタ --> <filter> <filter-name>EncodingFilter</filter-name> <filter-class>pac.EncodingFilter</filter-class> </filter> <!-- セキュリティ対応タブ変換フィルタ --> <filter> <filter-name>SecurityFilter</filter-name> <filter-class>pac.SecurityFilter</filter-class> </filter> <filter-mapping> <filter-name>EncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>SecurityFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> : | ||||
|
投稿日時: 2006-04-27 14:45
Web開発はやったことありませんが・・・
こんな感じでしょうか? | ||||
|
投稿日時: 2006-04-27 14:50
まず、このフィルタの処理では期待している動作をしないと思います。
おそらく、入力パラメータのサニタイジングをしたいのでしょうが、これだとフィルタ のローカル変数が書き換わるだけで、JSP側にはそのままHTTPリクエストのパラメータが 渡ってしまいます。 期待しているのが上記のとおりであれば、getParameterメソッドをオーバライドした RequestWrapperを生成し、そのgetParameterメソッドでサニタイジングした文字列を 返すようにすればいいでしょう。 | ||||
|
投稿日時: 2006-04-27 15:11
ちょっと落ち着いて考えてみた。
あなたがやりたいのは a.XSS対策として"<"をエスケープしたいので、 描画時にエスケープできていれば良い。 b.Action(Servlet)側でgetParameter()する段階で、 既にエスケープされている必要がある。 のどっち? DBやビジネスロジックとしては"<"のままの方が良いはずなので、 一般的にはaってことになる。 そうなると、エスケープ処理はjspが出力するレスポンスに対して行う必要がある。 でもレスポンスの中身をエスケープするのは一筋縄じゃいかない。 (だって、レスポンスの中身はHTML形式のテキストだから、 "<"や">"は本来のタグの分も既に混じってるはず。) っていうことで、JSPで対応することになる。 さらにStrutsのカスタムタグのエスケープ機能について調べると、 http://www.atmarkit.co.jp/fsecurity/rensai/struts01/struts01.html のようにデフォルトでエスケープしてくれることが分かる。 本当にやりたいことがXSS対策じゃないなら、 詳細な目的(目標)を説明してほしいです。 [ メッセージ編集済み 編集者: これ 編集日時 2006-04-27 15:12 ] | ||||
|
投稿日時: 2006-04-27 19:12
想馬様、uk様、これ様へ
皆様のお陰で、対処でき有難う御座いました。 ■恥ずかしながら、サニタイジングとXSSの言葉/意味を知りませんでした。 ⇒ 調べて勉強させていただきました。 ■私のやりたいことが伝わらず、言葉足らずなところが あったことをお詫び申し上げます。 今回やりたかったことは、 「入力パラメータのサニタイジングをし、 XSS対策として"<"をエスケープしたいという事でした。」 (サニタイジングとXSSという言葉を知らなかったので書けませんでしたが。。。) ■対処結果 Strutsのカスタムタグのエスケープ機能でデフォルトでエスケープしてくれることが 分り、解決致しました。 |
1