Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

JSP

本を見ながら勉強しているのですが、わからないところがでてきてしまいこちらに掲載させていただきました。
(ほかでも調べたのですが、理解できませんでした)
本には、

<%@ page contentType="text/html; charset=Windows-31J" %>
<jsp:useBean id="bbs" scope="application" class="java.util.Vector"/>
<%
  request.setCharacterEncoding("Windows-31J");
  if (request.getParameter("userName")!=null) {
    bbs.add(request.getParameter("userName"));
    bbs.add(request.getParameter("body"));
  }
%>
<HTML>
<HEAD><TITLE>ミニ掲示板</TITLE></HEAD>
<BODY>
お名前と書き込みをどうぞ。<BR>
<FORM action="sample.jsp" method="post">
  お名前  : <INPUT type="text" name="userName"><BR>
  本文   : <TEXTAREA name="body"cols="60" rows="10"></TEXTAREA>
  <INPUT type="submit" value="投稿">
</FORM>
<% for (int i=0; i < bbs.size(); i+=2) { %>
  <HR>
  <%-- ここで表示する内容にJavaScriptなどが含まれていたときに問題が起こる --%> 
  投稿者名:<%= bbs.get(i) %><BR>
  本文:<PRE><%= bbs.get(i+1) %></PRE>
<% } %>
</BODY>
</HTML>
と、
(HttpUtility.java)
package Beans;

public class HttpUtility {

    public static String encoding="Windows-31J";
  
    public static String getUnicodeString(String s) {
        try {
            return new String(s.getBytes("8859_1"), encoding);
        }catch(java.io.UnsupportedEncodingException ex) {
            return null;
        }
    }  
  
    public static String escapeHTML(String input) {
        char c;
        StringBuffer output = new StringBuffer();
        int length = input.length();
        for( int i=0; i<length; i++ ) {
            c = input.charAt(i); 
            if ( c == '<' ) {
                output.append("<");
            } else if( c == '>' ) {
                output.append(">");
            } else if( c == '&' ) {
                output.append("&");
            } else if( c == '"' ) {
                output.append(""");
            } else {
                output.append(c);
            }
        }
        return output.toString();
    }
  
    public static String escapeSQL(String input) {
        char c;
        StringBuffer output = new StringBuffer();
        int length = input.length();
        for( int i=0; i<length; i++ ) {
            c = input.charAt(i); 
            if ( c == '\'' )  else if( c == '\\' ) {
                output.append("\\\\");
            } else if( c == '"' ) {
                output.append("\\\"");
            } else {
                output.append(c);
            }
        }
        return output.toString();
    }

}

が載せてあり,このjavaのメソッドを使ってクロスサイトスクリプティングを回避しましょうと書いてあるのですが(これ以上詳しく載ってません)、<%@import...%>などを使ってみたりして起動を試みたのですがうまく連携しません。勉強不足で恐縮なのですが、特殊タグの無効化にする方法をお教えください。お願いします。


6

回答

5929

閲覧

6件の回答

評価

0

>うまく連携しません。
という言葉ではなく、実際に試してみたコードを書いてください。

評価

0

その後、色々調べてみたのですが、解決しませんでした。
今回

package jspbean;

public class WingsUtil {
  private static String htmlEscape(String strVal){
  StringBuffer strResult=new StringBuffer();
  for(int i=0;i<strVal.length();i++){
    switch(strVal.charAt(i)){
    case '&' :
      strResult.append("&");
      break;
    case '<' :
      strResult.append("<");
      break;
    case '>' :
      strResult.append(">");
      break;
    default :
      strResult.append(strVal.charAt(i));
      break;
    }
  }
  return strResult.toString();
  }
}

と、

<%@page contentType="text/html; charset=Shift-JIS" pageEncoding="Shift_JIS" %> 

<html>
<head>
</head>
  <body>
   コメントを入力してください。<br>
  <form action="beanWrite.jsp" method="post">
   <TEXTAREA name="name" cols="40" rows="10" property="comment"></TEXTAREA>
   <INPUT type="submit" value="投稿"/>
  </form>
   <%=WingsUtil.htmlEscape(request.getParameter("name")) %>
  </body>
</html>
でやってみたのですがだめでした。
<%=...を<%=request.getParameter("name")%>として
実行はできたのですが、上記ではできませんでした。
これ以上なにをすればいいのかまったくわかりません。
どなたかご指導のほどお願いします。

評価

0

>private static String htmlEscape

このメソッドは、誰が作ったものでしょうか?本に載ってるんですか?
これではなんら、目的を果たしていません。
もし本にこう書いてあるなら、間違ってるので内容を吟味して自分で修正しましょう。
もちろん、その前に自分の書いたものを疑って、本としっかり照らし合わせてみる必要があります。

評価

0

解けた

評価

0

今度は
<%@ page contentType="text/html; charset=Windows-31J" %>
<jsp:useBean id="bbs" scope="application" class="java.util.Vector"/>
<%! 
private String strEscape(String strEsc){
StringBuffer strResult=new StringBuffer();
for(int i=0;i<strEsc.length();i++){
switch(strEsc.charAt(i)){
case '&':
strResult.append("&");
break;
case'<':
strResult.append("<");
break;
case'>':
strResult.append(">");
break;
default:
strResult.append(strEsc.charAt(i));
break;
}
}
return strResult.toString();
}
%>
<% 
  request.setCharacterEncoding("Windows-31J");
  if (request.getParameter("userName")!=null) {
    bbs.add(request.getParameter("userName"));
    bbs.add(request.getParameter("body"));
  }
%>
<HTML>
<HEAD><TITLE>ミニ掲示板</TITLE></HEAD>
<BODY>
お名前と書き込みをどうぞ。<BR>
<FORM action="crossSiteScriptingTest.jsp" method="post">
  お名前  : <INPUT type="text" name="userName"><BR>
  本文   : <TEXTAREA name="body" cols="40" rows="10"></TEXTAREA>
  <INPUT type="submit" value="投稿">
</FORM>
  <HR>
  <%-- ここで表示する内容にJavaScriptなどが含まれていたときに問題が起こる --%> 
  投稿者名:<%= strEscape(request.getParameter("userName")) %><BR>
  本文:<PRE><%= strEscape(request.getParameter("body")) %></PRE>
</BODY>
</HTML>
とか、
jstlで
エンコード処理はできるようになったのですが、
実行してみると送信後の表示結果が上書きしてしまいます。
難しい...   

評価

0

んー…。
メソッドの中はこの掲示板の問題でアンエスケープされてるのかな?

それはともかく、"を書き込むとまずい気がしますが、どうですか。

>実行してみると送信後の表示結果が上書きしてしまいます。
「表示結果が○○○を上書きしてしまいます」でないと日本語として通らないんですが、これは「前回の内容を」でしょうか?
このサンプルは、送信した内容を表示することだけが目的であり、実際に掲示板として使えるようには、できていませんね。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。