入力チェックの実行場所
セキュリティ

技術系の雑誌や書籍を読んでいると驚くような記述を見つけることがたまにあります。
今までで一番驚いたのが「入力チェックはサーバに負担がかかるのでクライアントで全て済ましてしまえばいい。」という記述。
「サーバでのチェックは不要」と続く。
やめて下さい、無責任な主張は。
新人が本気にします。
コード内にバグやセキュリティホールを垂れ流します。
クライアントでの入力チェックはサーバ負荷の軽減には役には立ちますが、最終的にサーバ側でも入力チェックは必要です。
何故でしょうか。
クライアントの入力チェックを通さずにデータの送信が可能だからです。
クライアントの入力チェック後、データの送信過程で改竄が可能だからです。
ブラウザ上以外からもデータの送信が可能だからです。
順を追って説明します。

1.クライアントの入力チェックを通さずにデータの送信が可能
送信イベントで入力チェック後データ送信
<form name="frmMain" action="update.cgi" method="post" onsubmit="fncInput();">
    <input type="text" name="txt">
    <input type="submit" value="送信">
</form>
上記コードは「ブラウザのJavaScriptを無効」にすると関数[fncInput]が実行されずそのまま送信可能です。
同一関数内で入力チェック後データ送信
function fncSubmit(){
    if(fncInputCheck()){
        document.forms["frmMain"].submit();
    }
}

(略)

<form name="frmMain" action="update.cgi" method="post">
    <input type="text" name="txt">
    <input type="button" value="送信" onclick="fncSubmit();">
</form>
上記コードは「JavaScriptを無効にしたブラウザ上からのデータ送信を防ぐ」事を目的にしています。
つまりJavaScript無効状態では関数[fncSubmit]が実行されないため、送信が不可能です。
但し、任意のコードを実行するBookmarklet Ver1.1を使用すると送信可能になります。
任意のコードを実行するBookmarklet Ver1.1を実行し、開いた別ウィンドウで次のコードを実行します。
入力チェックせずにデータ送信
window.opener.document.forms["frmMain"].submit();

2.クライアントの入力チェック後、データの送信過程で改竄
プロキシを使用します。
例えば、[Achilles]はクライアントにインストールするプロキシサーバです。
ブラウザが送信したデータを受け取り、編集した上でサーバへ送信できます。
受信も同様で、サーバに取得しに行ったデータを受け取り、HTMLを編集しブラウザへ表示させる事ができます。
[Achilles proxy]で検索すると日本語のサイトも引っ掛かりますので詳細な使用方法はそちらをご覧下さい。

3.ブラウザ上以外からもデータの送信が可能
ブラウザが送信するデータと同じ形式のデータ送信が可能であれば良いわけですから、そういうプログラムを作ればいいのです。
スキルはある程度求められますが、一番汎用性が高いでしょう。

コマゴマと書きましたが何が言いたいかと言いますと、「入力チェックはサーバ側で、受信したデータ全てに対して行う」ようにする。
そして、「クライアントの入力チェックは、サーバの負荷を下げる為の補助的な処理とする」事です。
これ以上、こんなコードは書くべきではありません。
プログラマの皆さん、もし何かあった時、これまでに記述されたコード全てを修正するのは他でもない、アナタですよ。

投稿者 Kanasansoft : 2005/07/16
このエントリーのトラックバックURL
http://www.kanasansoft.com/cgi/mt/mt-tb.cgi/35
トラックバック一覧
入力チェックの実行場所
Nice site

personal loans from personal loans : 2006/11/29

コメント一覧
このエントリーに対するトラックバックはありません。
コメント投稿




情報を登録する?