Webアプリの常識をJSPとStrutsで身につける
連載インデックスへ
Webアプリの常識をJSPStrutsで身につける(11)

Webアプリにおける11の脆弱性の常識と対策


株式会社メセナ・ネットコム
山中 秀樹
2009/9/1


バリデーション(入力データチェック)の必要性

 Webアプリケーションの共通的な安全対策として「バリデーション」(入力データチェック)があります。例えば、「特殊文字のエスケープ」や「想定外の文字・文字列が存在した場合エラーを返す」などがあります。

 入力データチェックは、今回説明したXSSやSQLインジェクション、HTTPレスポンス分割、OSコマンドインジェクション、ディレクトリトラバーサルの予防になります。

 バリデーションの常識については、連載第7回の「Webアプリ開発の常識、バリデーションとテンプレート」をご参照ください。

特殊文字のエスケープを行うプログラム例1(XSS対策)


<html:html>
<head><title>特殊文字のエスケープ</title></head>
■ 入力されたIDとパスワードを<bean:write>タグで表示。<br>
<br>
name:<bean:write name="HelloForm" property="name" /><br>
pass:<bean:write name="HelloForm" property="password" /><br>
<br>
■ 入力されたIDとパスワードを<nested:write>タグで表示。<br>
<br>
<nested:root name="HelloForm" >
name:<nested:write property="name" /><br>
pass:<nested:write property="password" /><br>
</nested:root>
</html:html>

図2 [新規 JUnit テスト・ケース]ダイアログ
図2 実行イメージ

  実行イメージのHTMLソース  
<html>
<head><title>特殊文字のエスケープ</title></head>
■ 入力されたIDとパスワードを<bean:write>タグで表示。<br>
<br>
name:&lt;&gt;&amp;&quot;&#39;<br>
pass:&lt;&gt;&amp;&quot;&#39;<br>
<br>
■ 入力されたIDとパスワードを<nested:write>タグで表示。<br>
<br>

name:&lt;&gt;&amp;&quot;&#39;<br>
pass:&lt;&gt;&amp;&quot;&#39;<br>
</html>

 <bean:write>タグには特殊文字のエスケープ(HTMLエンコードまたはURLエンコード)機能が実装されています。ソースコードを見ると、特殊文字「<」「>」「&」「"」「'」が「&lt;」「&gt;」「&amp;」「&quot;」「&#39;」に置き換わっているのが確認できます。

 また、プログラム例のように<nested>タグであっても、特殊文字のエスケープは行われます。

コラム 「<nested:root>タグとは」
<nested:root>タグは、共通にアクセスするJavaBeanを指定するタグで、大量のプロパティを指定する場合などに、<bean:write>タグなどで指定するname属性を省略して、表記を簡素化できます。

<nested:write>タグは、プロパティ値を出力する<bean:write>タグを継承したもので、機能は<bean:write>タグと一緒です。このように<nested>タグには、ほかの<bean>タグや<logic>タグの機能を継承しているものが多くあります。

<nested:root>タグ内でプロパティにアクセスする場合は、struts-html.tld、struts-bean.tld、struts-logic.tldのnested拡張のカスタムタグを使用します。

特殊文字のエスケープを行うプログラム例2(SQLインジェクションOSコマンドインジェクション対策)


public static String escape(String str) {

char c;
StringBuffer returnValue = new StringBuffer();

for( int i=0; i < str.length(); i++ ) {

c = str.charAt(i);

if ( c == '<' ) {
returnValue = returnValue .append("&lt;");
} else if( c == '>' ) {
returnValue = returnValue .append("&gt;");
} else if( c == '&' ) {
returnValue = returnValue .append("&amp;");
} else if( c == '"' ) {
returnValue = returnValue .append("&quot;");
} else if( c == '\'' ){
returnValue = returnValue .append("&#39");
} else {
returnValue = returnValue .append(c);
}
}
return new String(returnValue);
}

URLエンコーディングを行うコード例(HTTPレスポンス分割対策)


response.addHeader("Location: " + URLEncoder.encode(value));

想定外の文字や文字列が存在する場合、エラーを返すプログラム例(パス/ディレクトリトラバーサル対策)


public void pathCheck(String path) {
 
    if(-1 != path.indexOf("../")){
 
        //エラー処理を記述
    }
}

セキュリティを意識した開発は、Webアプリ開発者の常識

 以上、11種類の脆弱性について説明しました。これで、Webアプリにおける脆弱性に関する理解が深まったと思います。いまだ、Webアプリケーションの脆弱性を突く攻撃は増加しているので、アプリケーション開発時には、「セキュリティを意識した開発」が常識といえるのではないでしょうか。

 次回はいよいよ最終回。スクリプトの常識と題し、JavaScriptの実装やAjaxの組み込みについて説明していこうと思います。

@IT関連記事


[これはひどい]IEの引用符の解釈
教科書に載らないWebアプリケーションセキュリティ(1)
 Webアプリケーションとセキュリティは切り離せない。セキュアなコードを書くために知っておくべき小ネタを取り上げる
Coding Edge」フォーラム 2009/2/27
無料でWebアプリにありがちな脆弱性を調べて治す
Tomcatはどこまで“安全”にできるのか?(5) 
Webアプリを作ったが、どこに脆弱性があるか分からない! という人のために無料ツールを紹介し対処法の例も解説します
Java Solution」フォーラム 2008/3/5
TERASOLUNAのセキュリティ機能でWebアプリを強化
オープンソースTERASOLUNAで作るWebアプリ(最終回) 
ログオンした情報を管理するユーザー情報保持機能と特定アクセスの画面を作るアクセス権限チェック機能を紹介
Java Solution」フォーラム 2009/3/10
J2EEのセキュリティのキホンを知る
[連載]J2EEの基礎
(7) J2EEのセキュリティには、プログラムコードによる手続き型のセキュリティだけでなく、コンポーネントのdeploy時にセキュリティを設定する方法がある
Java Solution」フォーラム 2001/12/7
規模や信頼性で決めるWebサイトの構成
[連載]Java初心者のためのWebシステム入門(8) Webサイトの構築方法は、サイトの規模や信頼性をどの程度確保するかで決まってくる
Java Solution」フォーラム 2002/8/27
Webサイト設計時の考慮点を知ろう
[連載]Java初心者のためのWebシステム入門(2) システム構築の前に、まずWebサイトの構成を設計する必要があります。今回は設計時の考慮点をやさしく解説します
Java Solution」フォーラム 2002/3/5
Webアプリケーションを作る前に知るべき10の脆弱性
Security&Trustウォッチ(47)
 知ることはは力なり! OWASPが発表したWebアプリの脆弱性トップテンを基に、エンジニアが知っておくべきポイントをもう一度復習しよう
Security&Trust」フォーラム 2007/6/13
スーパーユーザーの特権を制限する
止められないUNIXサーバのセキュリティ対策(4)
 管理者の些細なミスがシステム全体に及ぶためrootになれるユーザーは限定したい。よりセキュアな権限の制限方法とは
Security&Trust」フォーラム 2005/3/4

プロフィール
山中 秀樹(やまなか ひでき)

株式会社メセナ・ネットコム所属

Strutsを使用したWebアプリケーション開発に携わっている。現在は無事に開発を終え、保守を担当している。広い視野と柔軟な発想力を持った技術者を目指し、日々勉強を行っている。趣味はサッカー観戦、読書

 

1-2-3-4

 Index
第11回 Webアプリにおける11の脆弱性の常識と対策
  Page1
切っても切れない? Webアプリケーションと脆弱性
【1】XSS(クロスサイトスクリプティング)
【2】強制的ブラウジング(強制的ブラウズ)
  Page2
【3】SQLインジェクション
【4】パラメータの改ざん
【5】HTTPレスポンス分割
【6】OSコマンドインジェクション
  Page3
【7】セッション管理に関する脆弱性
【8】パス/ディレクトリトラバーサル(乗り越え)
【9】バッファオーバーフロー(バッファオーバーラン)
【10】バックドアとデバッグオプション
【11】エラーコード
  Page4
バリデーション(入力データチェック)の必要性
コラム 「<nested:root>タグとは」
セキュリティを意識した開発は、Webアプリ開発者の常識





Java Solution全記事一覧



TechTargetジャパン

Java Solution フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

キャリアアップ

- PR -
@IT Sepcial

イベントカレンダー

PickUpイベント

- PR -
もっと見る
- PR -

お勧め求人情報

ホワイトペーパーTechTargetジャパン

@IT Sepcial
ソリューションFLASH