サニタイジング
日本語 | 消毒、無害化 |
英語 | sanitizing |
ふりがな | さにたいじんぐ |
フリガナ | サニタイジング |
害を及ぼす情報を、害のない状態にすること。
主に、クロスサイトスクリプティングの脆弱性を解決する処理を指す。
使用者が入力した情報を出力する際、HTMLの構造を変更したりJavaScriptとして実行されないよう、置換処理を行うことを「サニタイジング」「サニタイズする」と言う。
また、SQLインジェクションを避けるため、SQLとして機能しないように文字列を変換することも「サニタイジング」という。
クロスサイトスクリプティングの方が一般的のため、通常「サニタイジング」と言えばクロスサイトスクリプティングのサニタイジングを指すことの方が多いが、SQLインジェクションも認知されつつあるため、状況に応じてどちらを指すのか、それとも「無害化」という一般的な単語として使用しているのかを読み解く必要がある。
両者を区別するため、クロスサイトスクリプティング向けのサニタイジングを「HTMLサニタイジング」、SQLインジェクション向けのサニタイジングを「SQLサニタイジング」と呼ぶこともあるが、まだ一般的ではない。
主に、クロスサイトスクリプティングの脆弱性を解決する処理を指す。
使用者が入力した情報を出力する際、HTMLの構造を変更したりJavaScriptとして実行されないよう、置換処理を行うことを「サニタイジング」「サニタイズする」と言う。
また、SQLインジェクションを避けるため、SQLとして機能しないように文字列を変換することも「サニタイジング」という。
クロスサイトスクリプティングの方が一般的のため、通常「サニタイジング」と言えばクロスサイトスクリプティングのサニタイジングを指すことの方が多いが、SQLインジェクションも認知されつつあるため、状況に応じてどちらを指すのか、それとも「無害化」という一般的な単語として使用しているのかを読み解く必要がある。
両者を区別するため、クロスサイトスクリプティング向けのサニタイジングを「HTMLサニタイジング」、SQLインジェクション向けのサニタイジングを「SQLサニタイジング」と呼ぶこともあるが、まだ一般的ではない。
参考サイト
<!-- webapps/sample-servlet/form.html -->
<!-- http://localhost:8080/sample-servlet/form.html でアクセスできます。 --><HTML>
<HEAD>
<TITLE>入力フォーム</TITLE>
</HEAD>
<BODY>
<!-- 入力フォームです。 -->
<FORM METHOD="POST" ACTION="servlet/SampleServlet">
名前:<INPUT TYPE="text" NAME="name" SIZE="10"><BR>
<INPUT TYPE="submit" VALUE="実行"><BR>
</FORM>
</BODY>
</HTML>
// webapps/sample-servlet/WEB-INF/src/SampleServlet.java
// http://localhost:8080/sample-servlet/servlet/SampleServlet でアクセスできます。
// このサンプルプログラムは「サーブレット」の項目に書かれている準備を行ってから使用してください。
import java.util.ArrayList;
import java.util.Iterator;
import java.io.PrintWriter;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* サーブレットのテスト。
*/
public class SampleServlet extends HttpServlet
{
/** 「お名前一覧」用リスト。 */
private static final ArrayList names = new ArrayList();
/**
* リクエストとしてHTTPメソッドのGETが渡されるとこのメソッドが呼ばれます。
*/
public void doGet( HttpServletRequest request, HttpServletResponse response ) throws IOException, ServletException
{
// Content-Typeをセット。
response.setContentType( "text/html;charset=Windows-31J" );
// 入力値の文字コードをセットします。
// HTMLの文字コードを指定してください。
request.setCharacterEncoding( "Windows-31J" );
// 入力フォームから入力された値を取得します。
String name = request.getParameter( "name" );
System.out.println( name );
// (入力フォームの「名前:」に入力された文字列)
// 入力された名前を追加します。
if( ( name != null ) && ( name.equals( "" ) == false ) )
{
names.add( name );
}
// 注:通常は、データベースに登録します。
// また、この方法だと同期が取れていませんので、複数のブラウザで
// 同時にアクセスするとうまくいかないでしょう。
// HTML出力用のPrintWriterを取得します。
PrintWriter out = response.getWriter();
// HTMLを出力します。
out.println( "<HTML>" );
out.println( "<HEAD>" );
out.println( "<TITLE>サーブレットのテスト</TITLE>" );
out.println( "</HEAD>" );
out.println( "<BODY>" );
out.println( "入力された値:" );
// こちらは自分の入力した情報を出力するので特に必要はないのですが、
// 念のためサニタイジングします。
out.println( sanitizing( name ) );
out.println( "<BR>" );
// 名前一覧を出力します。
for( Iterator iter = names.iterator(); iter.hasNext(); )
{
String currentName = (String)iter.next();
// そのまま出力すると、クロスサイトスクリプティングができてしまうので
// サニタイジングします。
currentName = sanitizing( currentName );
out.println( currentName );
out.println( "<BR>" );
}
out.println( "</BODY>" );
out.println( "</HTML>" );
}
/**
* リクエストとしてHTTPメソッドのGETが渡されるとこのメソッドが呼ばれます。
*/
protected void doPost( HttpServletRequest request, HttpServletResponse response ) throws IOException, ServletException
{
// でも面倒なのでdoGet()メソッドに丸投げします。
doGet( request, response );
}
/**
* サニタイジングを行います。
*/
private String sanitizing( String string )
{
string = string.replaceAll( "&", "&" );
string = string.replaceAll( "<", "<" );
string = string.replaceAll( ">", ">" );
string = string.replaceAll( "\"", """ );
string = string.replaceAll( "'", "'" );
return string;
}
}
<!-- http://localhost:8080/sample-servlet/form.html でアクセスできます。 --><HTML>
<HEAD>
<TITLE>入力フォーム</TITLE>
</HEAD>
<BODY>
<!-- 入力フォームです。 -->
<FORM METHOD="POST" ACTION="servlet/SampleServlet">
名前:<INPUT TYPE="text" NAME="name" SIZE="10"><BR>
<INPUT TYPE="submit" VALUE="実行"><BR>
</FORM>
</BODY>
</HTML>
// webapps/sample-servlet/WEB-INF/src/SampleServlet.java
// http://localhost:8080/sample-servlet/servlet/SampleServlet でアクセスできます。
// このサンプルプログラムは「サーブレット」の項目に書かれている準備を行ってから使用してください。
import java.util.ArrayList;
import java.util.Iterator;
import java.io.PrintWriter;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* サーブレットのテスト。
*/
public class SampleServlet extends HttpServlet
{
/** 「お名前一覧」用リスト。 */
private static final ArrayList names = new ArrayList();
/**
* リクエストとしてHTTPメソッドのGETが渡されるとこのメソッドが呼ばれます。
*/
public void doGet( HttpServletRequest request, HttpServletResponse response ) throws IOException, ServletException
{
// Content-Typeをセット。
response.setContentType( "text/html;charset=Windows-31J" );
// 入力値の文字コードをセットします。
// HTMLの文字コードを指定してください。
request.setCharacterEncoding( "Windows-31J" );
// 入力フォームから入力された値を取得します。
String name = request.getParameter( "name" );
System.out.println( name );
// (入力フォームの「名前:」に入力された文字列)
// 入力された名前を追加します。
if( ( name != null ) && ( name.equals( "" ) == false ) )
{
names.add( name );
}
// 注:通常は、データベースに登録します。
// また、この方法だと同期が取れていませんので、複数のブラウザで
// 同時にアクセスするとうまくいかないでしょう。
// HTML出力用のPrintWriterを取得します。
PrintWriter out = response.getWriter();
// HTMLを出力します。
out.println( "<HTML>" );
out.println( "<HEAD>" );
out.println( "<TITLE>サーブレットのテスト</TITLE>" );
out.println( "</HEAD>" );
out.println( "<BODY>" );
out.println( "入力された値:" );
// こちらは自分の入力した情報を出力するので特に必要はないのですが、
// 念のためサニタイジングします。
out.println( sanitizing( name ) );
out.println( "<BR>" );
// 名前一覧を出力します。
for( Iterator iter = names.iterator(); iter.hasNext(); )
{
String currentName = (String)iter.next();
// そのまま出力すると、クロスサイトスクリプティングができてしまうので
// サニタイジングします。
currentName = sanitizing( currentName );
out.println( currentName );
out.println( "<BR>" );
}
out.println( "</BODY>" );
out.println( "</HTML>" );
}
/**
* リクエストとしてHTTPメソッドのGETが渡されるとこのメソッドが呼ばれます。
*/
protected void doPost( HttpServletRequest request, HttpServletResponse response ) throws IOException, ServletException
{
// でも面倒なのでdoGet()メソッドに丸投げします。
doGet( request, response );
}
/**
* サニタイジングを行います。
*/
private String sanitizing( String string )
{
string = string.replaceAll( "&", "&" );
string = string.replaceAll( "<", "<" );
string = string.replaceAll( ">", ">" );
string = string.replaceAll( "\"", """ );
string = string.replaceAll( "'", "'" );
return string;
}
}
<!-- webapps/sample-servlet/form.html --> <!-- http://localhost:8080/sample-servlet/form.html でアクセスできます。 --><HTML> <HEAD> <TITLE>入力フォーム</TITLE> </HEAD> <BODY> <!-- 入力フォームです。 --> <FORM METHOD="POST" ACTION="servlet/SampleServlet"> 名前:<INPUT TYPE="text" NAME="name" SIZE="10"><BR> <INPUT TYPE="submit" VALUE="実行"><BR> </FORM> </BODY> </HTML> // webapps/sample-servlet/WEB-INF/src/SampleServlet.java // http://localhost:8080/sample-servlet/servlet/SampleServlet でアクセスできます。 // このサンプルプログラムは「サーブレット」の項目に書かれている準備を行ってから使用してください。 import java.util.ArrayList; import java.util.Iterator; import java.io.PrintWriter; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * サーブレットのテスト。 */ public class SampleServlet extends HttpServlet { /** 「お名前一覧」用リスト。 */ private static final ArrayList names = new ArrayList(); /** * リクエストとしてHTTPメソッドのGETが渡されるとこのメソッドが呼ばれます。 */ public void doGet( HttpServletRequest request, HttpServletResponse response ) throws IOException, ServletException { // Content-Typeをセット。 response.setContentType( "text/html;charset=Windows-31J" ); // 入力値の文字コードをセットします。 // HTMLの文字コードを指定してください。 request.setCharacterEncoding( "Windows-31J" ); // 入力フォームから入力された値を取得します。 String name = request.getParameter( "name" ); System.out.println( name ); // (入力フォームの「名前:」に入力された文字列) // 入力された名前を追加します。 if( ( name != null ) && ( name.equals( "" ) == false ) ) { names.add( name ); } // 注:通常は、データベースに登録します。 // また、この方法だと同期が取れていませんので、複数のブラウザで // 同時にアクセスするとうまくいかないでしょう。 // HTML出力用のPrintWriterを取得します。 PrintWriter out = response.getWriter(); // HTMLを出力します。 out.println( "<HTML>" ); out.println( "<HEAD>" ); out.println( "<TITLE>サーブレットのテスト</TITLE>" ); out.println( "</HEAD>" ); out.println( "<BODY>" ); out.println( "入力された値:" ); // こちらは自分の入力した情報を出力するので特に必要はないのですが、 // 念のためサニタイジングします。 out.println( sanitizing( name ) ); out.println( "<BR>" ); // 名前一覧を出力します。 for( Iterator iter = names.iterator(); iter.hasNext(); ) { String currentName = (String)iter.next(); // そのまま出力すると、クロスサイトスクリプティングができてしまうので // サニタイジングします。 currentName = sanitizing( currentName ); out.println( currentName ); out.println( "<BR>" ); } out.println( "</BODY>" ); out.println( "</HTML>" ); } /** * リクエストとしてHTTPメソッドのGETが渡されるとこのメソッドが呼ばれます。 */ protected void doPost( HttpServletRequest request, HttpServletResponse response ) throws IOException, ServletException { // でも面倒なのでdoGet()メソッドに丸投げします。 doGet( request, response ); } /** * サニタイジングを行います。 */ private String sanitizing( String string ) { string = string.replaceAll( "&", "&" ); string = string.replaceAll( "<", "<" ); string = string.replaceAll( ">", ">" ); string = string.replaceAll( "\"", """ ); string = string.replaceAll( "'", "'" ); return string; } }