WindowsのApacheでSSLを有効にする

インストール方法です。
apache_2.2.4-win32-x86-no_ssl.msi
apache-2.2.4_openssl-0.9.8e.zip
を取ってきて、c:\tmpにおいた。

>cd c:\
>cd tmp
>msiexec /i apache_2.2.4-win32-x86-no_ssl.msi
Next>Next>Next>Next>Next>
Folder name: C:\Program Files\Apache Group\Apache2\
OK>Next>Install>Finish


>net stop Apache2
Apache2 サービスを停止中です.
Apache2 サービスは正常に停止されました。

C:\tmp>"C:\Program Files\Apache Group\Apache2\bin\httpd" -k uninstall
Removing the Apache2.2 service
The Apache2.2 service has been removed successfully.

>taskkill /im apachemonitor.exe
成功: プロセス "ApacheMonitor.exe" (PID 1036) は強制終了されました。

インストール済みのapacheを上書き。

>unzip -o -d "c:/Program Files/Apache Group" apache-2.2.4_openssl-0.9.8e.zip

>cacls "C:\Program Files\Apache Group\Apache2" /E /G SYSTEM:F /T

>"C:\Program Files\Apache Group\Apache2\bin\httpd" -D SSL -k install
Installing the Apache2.2 service
The Apache2.2 service is successfully installed.
Testing httpd.conf....
Errors reported here must be corrected before the service can be started.
Syntax error on line 62 of C:/Program Files/Apache Group/Apache2/conf/extra/http
d-ssl.conf:
SSLSessionCache takes one argument, SSL Session Cache storage (`none', `nonenotn
ull', `dbm:/path/to/file')

エラーが出た・・・

C:/Program Files/Apache Group/Apache2/conf/extra/httpd-ssl.confの以下の箇所を修正
(")でくくってみた。

 62: SSLSessionCache        "shmcb:C:/Program Files/Apache Group/Apache2/logs/ssl_scache(512000)"
 80: ErrorLog "C:/Program Files/Apache Group/Apache2/logs/error_log"
 81: TransferLog "C:/Program Files/Apache Group/Apache2/logs/access_log"
 99: SSLCertificateFile "C:/Program Files/Apache Group/Apache2/conf/server.crt"
107: SSLCertificateKeyFile "C:/Program Files/Apache Group/Apache2/conf/server.key"
 >net start Apache2
Apache2 サービスを開始します.
Apache2 サービスは正常に開始されました。

https://127.0.0.1/を開いてIt works!と表示されればOK。

【Struts】*.do設定で、struts-config.xmlに設定していないアドレスにアクセスがあった場合、エラーページへ飛ばす。

web.xmlに

    <servlet-mapping>
            <servlet-name>action</servlet-name>
            <url-pattern>*.do</url-pattern>
    </servlet-mapping>

のように*.doを設定していると、
javax.servlet.ServletException: アクション /hogeAction に対応するマッピングが見つかりません
というエラーが出ることがあります。

これはstruts-config.xml に "/hogeAction" というパスを持つアクションが存在しないために発生するエラーです。

これを、対応するアクションが存在しない場合にはエラーページへ飛ばすように設定したい。

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=10418&forum=12&3
上記URLを参考にRequestProcessorを継承して実装してみました。

まず、存在しないアクションを指定した場合にデフォルトで移動するパスを保持するにdefaultPathというプロパティを追加する為、ControllerConfig を継承したクラスを作ります。

public class MyControllerConfig extends ControllerConfig {
/* 存在しないdoを開いた時にデフォルトで開くパスを指定する */
private String defaultPath;

    public String getDefaultPath() {
        return defaultPath;
    }

    public void setDefaultPath(String defaultPath) {
        this.defaultPath = defaultPath;
    }

}


RequestProcessor#init(ActionServlet,ModuleConfig)をオーバーライドして、初期化コードを実装します。
また、指定されたアクションが
存在しない場合、エラーを表示している部分はprocessMappingのようでうすので、これを拡張し、指定されたアクションが無ければ、プロパティで指定したアクションへ移動するようにコードを追加します。今回はTilesを使用したいのでTilesRequestProcessorを拡張します。

public class MyTilesRequestProcessor extends TilesRequestProcessor {
    private String defaultPath = null;
    @Override
    public void init(ActionServlet servlet, ModuleConfig moduleConfig) throws ServletException {
        super.init(servlet, moduleConfig);

        ControllerConfig cc = moduleConfig.getControllerConfig();

        if (cc instanceof MyControllerConfig) {
            MyControllerConfig icc = (MyControllerConfig) cc;
            defaultPath = icc.getDefaultPath();
        }

    }
    protected ActionMapping processMapping(HttpServletRequest request, HttpServletResponse response, String path)
            throws IOException {

        // Is there a mapping for this path?
        ActionMapping mapping = (ActionMapping) moduleConfig.findActionConfig(path);

        // If a mapping is found, put it in the request and return it
        if (mapping != null) {
            request.setAttribute(Globals.MAPPING_KEY, mapping);
            return (mapping);
        }

        // Locate the mapping for unknown paths (if any)
        ActionConfig configs[] = moduleConfig.findActionConfigs();
        for (int i = 0; i < configs.length; i++) {
            if (configs[i].getUnknown()) {
                mapping = (ActionMapping) configs[i];
                request.setAttribute(Globals.MAPPING_KEY, mapping);
                return (mapping);
            }
        }

        /* 追加ロジックここから */
        // Is there a mapping for default path?
        mapping = (ActionMapping) moduleConfig.findActionConfig(this.defaultPath);
        if (mapping != null) {
            request.setAttribute(Globals.MAPPING_KEY, mapping);
            return (mapping);
        }       
        /* 追加ロジックここまで */
      
        // No mapping can be found to process this request
        String msg = getInternal().getMessage("processInvalid", path);
        log.error(msg);
        response.sendError(HttpServletResponse.SC_NOT_FOUND, msg);

        return null;
    }

}

struts-config.xmlの設定は次のようにしました。

<controller processorClass="com.hoge.MyTilesRequestProcessor" 
className="com.hoge.MyControllerConfig">
<set-property property="defaultPath" value="/notFoundAction" />
</controller>

でもぉ、こんなことをしなくても unknown="true"にすれば万事解決。
以上

tchでcvsの処理

foreach  REPLACE (`cat data.lst`)
set NEW_ARRAY = (`echo $REPLACE | sed 's/,/ /g'`)
echo $NEW_ARRAY[1]
echo $NEW_ARRAY[2]
echo $NEW_ARRAY[3]
end

data.lstはこんな感じ

1,aaaaaa,あああああ
2,bbbbbb,いいいいい
3,cccccc,ううううううう
4,dddd,ええええええ

Spring2.0の設定

Spring2.0の設定ファイルは1.xから結構変わってますね~
定義はこんな感じ
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:jee="http://www.springframework.org/schema/jee"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">

データソースの設定をJNDIから取得するのもこんなに簡単。
    <!–==== DataSource ==============================================–>
    <jee:jndi-lookup id="dataSource" jndi-name="データソース名" />
トランザクションの管理も楽
    <!–==== DataSource transaction manager ==========================–>
    <bean id="txManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
AOPの設定はこんな感じ。xxxxLogicというクラスにinsertXxxxというメソッドがあったらトランザクションを開始する設定。
    <!–==== aop for transaction =====================================–>
    <aop:config>
        <!– pointcut the execution of any method defined by the BaseLogic interface –>
        <aop:pointcut id="businessLogic"
            expression="execution(* com.andsystem.bl..*Logic*.*(..))" />
        <aop:advisor pointcut-ref="businessLogic" advice-ref="txAdvice" />
    </aop:config>
    <!–==== transactional advice ====================================–>
    <tx:advice id="txAdvice" transaction-manager="txManager">
        <tx:attributes>
            <tx:method name="insert*" rollback-for="java.lang.Exception"/>
            <tx:method name="find*" read-only="true" />
        </tx:attributes>
    </tx:advice>

セッション管理方式

□考慮すべき点
・セキュアモードCookieの利用
weblogic.xml デプロイメント記述子の、cookie-secureをtrueに設定する。
クッキーを HTTPS 接続でのみ返信するようブラウザに指示する。これにより、クッキー ID が保護され、HTTPS を使用する Web サイトでのみ使用されるようになる。この機能を有効にすると、HTTP でのセッション クッキーは機能しなくなる。

・セッションIDをGETメソッドで送らない
セッションIDをGETで送信するとURLの一部にセッションIDが埋め込まれる為セッションIDが漏洩する危険性がある。
Weblogicではデフォルトではクッキー無効ブラウザでは自動的にセッションIDがURLにエンコードされる。weblogic.xmlデプロイメント記述子のurl-rewriting-enabledをfalseにすることで、クッキーが無効なブラウザで、セッション ID が URL にエンコーディングされる動作をOffにする。

・セッションに格納するオブジェクト
セッションには最低限の情報を保持する。また保持した情報の鮮度にも気をつける。
セッションに保持する情報は必ず必要最低限にとどめる事。セッション内で非常にサイズの大きいオブジェクトを作成するような設計は出来るだけしない。
今後の拡張を考慮し、念のためセッションデータはシリアライズ可能にしておく。
セッション オブジェクトの属性を変更するには非推奨となった putValue に代わって HttpSession.setAttribute を使用する。
同様に、セッション オブジェクトから属性を削除するには、非推奨となった removeValue に代わって removeAttribute を使用する。

認証確認方式

セッションが認証済みセッションであるかどうかを確認する方式として以下の3つの方式が挙げられる。
(1)Actionの基底クラスで実装する。問題点、JSPが無防備になる。
(2)SpringAOPで実装する。問題点JSPが無防備になる。
(3)Filterで実装する。利点、JSPも保護できる。

Web開発するときに気になること

入力値の妥当性チェック
 サーバで必ず行う
 クライアントでの入力値チェックはユーザビリティの向上させる必要がある場合に実施する。
HTML出力時には特殊記号をエスケープ処理する(クロスサイトスクリプティングを防ぐ為にサニタイジング)
 Strutsのbeen:write または JSTLのc:out を使用すること。このタグはHTMLの特殊記号( < > , " ‘ & )を変換する機能を持つ。
SQL出力時にはバインドメカニズムを利用してSQLインジェクションを防ぐ
 プレースホルダとして「?」記号を使用しSQL文をあらかじめコンパイルしておくこと。
外部コマンド呼び出し時の妥当性チェック
http://www.atmarkit.co.jp/fsecurity/rensai/webhole02/webhole02.html
ファイル名指定時の妥当性チェック
 任意の場所にファイルをアップロードされる事がないように、ファイル名に使用される記号をサニタイジングする。
できれば通信は全てSSLで保護する。
セキュアモードCookieの利用 WebLogicの設定の場合、
 weblogic.xml デプロイメント記述子の、
 cookie-secureをtrueに設定する。
 クッキーを HTTPS 接続でのみ返信するようブラウザに指示する。これにより、クッキー ID が保護され、HTTPS を使用する Web サイトでのみ使用されるようになる。この機能を有効にすると、HTTP でのセッション クッキーは機能しなくなる。
安全なセッションIDの使用
 セッションID用のcookieの生成・維持はWebLogicサーバによって自動的に行われます。
アクセス権限のチェック
 チェックしましょう。
セッションタイムアウトの設定
 セッションは一定時間が過ぎると切断されるように設定する。長期(例えば1日以上)のセッション保持は行わない。
Cookieの有効ドメイン範囲制限
 Cookieの有効度メイン範囲は必ず限定しCookieの漏洩を防ぐ。
Cookieのハードディスクへの保存禁止。有効期限を指定しない事
 Weblogicではデフォルトでユーザがブラウザを終了すると期限が切れるようにクッキーが設定されているので問題ありません。
認証後に、新たなセッションIDを発行する事。ログインページではセッションIDを発行しない
セッションIDをGETメソッドで送らない
 CookieによるセッションIDの管理を行う。
脆弱なパスワードの拒否
ログイン、リトライ可能回数の制限
 本案件ではユーザ名、パスワードでのログインは行わない。
平文パスワード保存の禁止
 DBに保存するパスワードはハッシュ化しましょう。
秘密情報は画面へ表示しない
 秘密情報は画面へ表示しない事。表示しなければならない場合、マスクして表示するなどの対策を行う。
本番環境にソースファイルやバックアップファイルなど不要なファイルを置かない。
 アタックの足がかりになることがあります。
管理機能へのアクセス制限、原則、インターネット経由でのアクセスを禁止する
Webアプリケーションアセスメントの実施
 「セキュリティアセスメントサービス」等を受けるようにする。
Webシステムペネストレーションテストの実施
 コンピュータやネットワークのセキュリティ上の弱点を発見するテスト手法の一つで、システムを実際に攻撃して侵入を試みる手法。実際にWebサーバへアクセスしアタックを行いセキュリティホールが存在しないか確認する。

WebLogicのメモリ量をいじる

C:\bea\weblogic92\samples\domains\workshop\init-info\startscript.xml

            <!–<value>-Xms256m -Xmx512m</value>–>
            <value>-Xms256m -Xmx256m</value>

上記ファイル色々いぢるが反映されずーダメです。

たぶん「startscript.xml」の設定に基づき、
setDomainEnv.cmd や startWebLogic.cmd
が作られているようです。でもどうやって作るのかわからないので
手っ取り早くsetDomainEnvを直接以下のように変更した。

C:\bea\weblogic92\samples\domains\workshop\bin\setDomainEnv.cmd

とりあえず半分の値にしてみた。今のところこれで動作している(動作不安定になるようであればメモリ増やしてみるのも手)
mxとmsを一致させるとパフォーマンスがあがるかも(メモリサイズが固定され動的確保の時間がなくなるはず?)

@REM set MEM_ARGS=-Xms256m -Xmx512m
set MEM_ARGS=-Xms128m -Xmx256m

ポイントベースも邪魔なのでfalseにする。本来起動オプションで制御出来るっぱいバッチになっているが解析すんのも面倒なんで直接falseにしてまえば問題解決

@REM set POINTBASE_FLAG=true
set POINTBASE_FLAG=false

上記設定でとりあえずWeblogicのメモリ使用量が半分以下になった。

JSTL

http://www.oklab.org/java/jstl.html

http://www.javaroad.jp/opensource/js_taglibs1.htm

個別のJSPページでJSTL宣言を省略する
http://www.atmarkit.co.jp/fjava/javatips/119jspservlet39.html