- PR -

Filter処理について

1
投稿者投稿内容
未記入
ベテラン
会議室デビュー日: 2004/08/18
投稿数: 81
投稿日時: 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("<","&lt;");
name01 = name01.replaceAll(">","&gt;");

String name02 = request.getParameter("name02");
name01 = name02.replaceAll("<","&lt;");
name01 = name02.replaceAll(">","&gt;");



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>
想馬
大ベテラン
会議室デビュー日: 2003/05/29
投稿数: 245
お住まい・勤務地: 神奈川・東京
投稿日時: 2006-04-27 14:45
Web開発はやったことありませんが・・・

コード:
Map parameterMap = request.getParameterMap();
for ( Iterator i = parameterMap.keySet().iterator(); i.hasNext(); ) {
    String key = ( String )i.next();
    String value = ( String )parameterMap.get( key );
    
    // 以下に処理
}



こんな感じでしょうか?
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2006-04-27 14:50
まず、このフィルタの処理では期待している動作をしないと思います。
おそらく、入力パラメータのサニタイジングをしたいのでしょうが、これだとフィルタ
のローカル変数が書き換わるだけで、JSP側にはそのままHTTPリクエストのパラメータが
渡ってしまいます。

期待しているのが上記のとおりであれば、getParameterメソッドをオーバライドした
RequestWrapperを生成し、そのgetParameterメソッドでサニタイジングした文字列を
返すようにすればいいでしょう。
未記入
会議室デビュー日: 2006/03/28
投稿数: 18
お住まい・勤務地: 大阪
投稿日時: 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 ]
未記入
ベテラン
会議室デビュー日: 2004/08/18
投稿数: 81
投稿日時: 2006-04-27 19:12
想馬様、uk様、これ様へ
皆様のお陰で、対処でき有難う御座いました。


■恥ずかしながら、サニタイジングとXSSの言葉/意味を知りませんでした。

⇒ 調べて勉強させていただきました。


■私のやりたいことが伝わらず、言葉足らずなところが
あったことをお詫び申し上げます。

今回やりたかったことは、
「入力パラメータのサニタイジングをし、
XSS対策として"<"をエスケープしたいという事でした。」
(サニタイジングとXSSという言葉を知らなかったので書けませんでしたが。。。)


■対処結果

Strutsのカスタムタグのエスケープ機能でデフォルトでエスケープしてくれることが
分り、解決致しました。

1

スキルアップ/キャリアアップ(JOB@IT)