PHP、MySQL、JavaScriptによるセキュアなインターネットファイル共有システムの作成はじめに私は最近、いつもの共有ディレクトリメカニズムを使ってファイル共有を実装することに嫌気がさしてきました。管理者レベルで定義するアクセス権が多すぎるだけでなく、異なるオペレーティングシステム間でファイルを共有するためのあらゆる処理が必要になります。その上、インターネット接続しか使用できないとしたらどうでしょう。もちろん、EメールやFTPを使うことはできますが、必ずしもスマートな解決策ではありません。そこで、ようやくPHPを使う気になったのです。次のことをすべて実行するPHPファイル共有プログラムを作成しました。
必要なもの
クイックスタートのためのインストール手順このサンプルプログラムのサーバーインフラストラクチャには、PHPコードを実行できるWebサーバーが必要です。また、選択したRDBMSのサポートによってPHPインタープリタをコンパイルする必要があります。この場合は、LAMPフレームワーク、つまり、Linux(Debian)、Apache、MySQL、そして言うまでもなく、PHPを選びました。次のインストール手順は、Apache 2.X、PHP 5.X、MySQL 4.Xがインストールされ、インターネット接続が確立されていることを前提とします。始めに、本稿のサンプルコードをダウンロードし、次のコマンドを実行してWebサーバーのドキュメントルート(以降、[document_root])下に「file_sharing.zip」ファイルを解凍します。 unzip file_sharing.zip PEAR MDB2のインストールPEARパッケージをインストールするには、PHPバージョン4.3.0またはそれ以上をインストールした場合に利用したインストーラが必要です。pear install MDB2 pear install MDB2#mysql SmartyのインストールDebian環境にSmartyテンプレートエンジン(Smartyについては後で詳しく説明します)をインストールするには、次のコマンドを実行します。apt-get install smarty
overLIBのインストール次に、overLIB JavaScriptライブラリをインストールします(overLIBについては後で詳しく説明します)。
mkdir overLIB cd overLIB MySQLのインストール次のコマンドを実行してMySQLデータベーススキーマを作成します。mysqladmin -u[user] -p[password] <file_sharing.sql 構成変数の設定ダウンロードしたソースコード内のファイル「inc.config.php」に示されているように、ローカルインストールに固有のグローバル変数があります。これらの変数を次の表1の推奨値に従って設定します。表1 構成変数の推奨設定値
著者注
Internet Explorerバージョン6および7は、W3Cの推奨とは逆に、ボタンの値ではなく、ボタンの内部テキストを送信します。そのため、本稿のサンプルでこれらのバージョンのIEを使いたい場合は、CSSのメリットの一部が犠牲になりますが、.tplファイル内のすべての<button>インスタンスを<input>で置き換える必要があります。
コードの解説PHPコードはこのサンプルの「接着剤」となる部分です。ソースコードのアプリケーションルートディレクトリ下には4つのPHPファイルがあります。メインファイルは「file_sharing.php」で、このファイルによってインクルードされる他のすべてのファイルに「inc.*.php」という名前を付けることにしました。ローカルインストールに固有のグローバル変数はすべて「inc.config.php」に入れました。つまり、本稿のダウンロードファイル(zipファイル)を解凍した後、このファイルに変数を適切に設定することでファイルを環境に適応させることができます。 「inc.vars.php」ファイルには、PHPセッション開始メカニズム(ここでは、タグソートとファイルソートのメソッドプロパティを渡す目的にのみ使用)と、便宜上必要なその他のグローバル変数、およびすべてのSmartyテンプレートに有効なグローバルな代入が含まれています。 「inc.util.php」ファイルには、主にコードの行数を削減することを目的とするいくつかのユーティリティ関数が含まれています。一部のルーチンはデータベースアクセスを実装するので、データベース抽象化レイヤの使用例として注目に値します。これらの関数はPEAR MDB2 APIを使ってMySQLにアクセスします(このアプローチの長所については、次のセクションで実装例を取り上げながら詳しく説明します)。 「file_sharing.php」ファイルは、すべてのHTTP要求を処理してGETメソッドまたはPOSTメソッドから渡された変数を構文解析する中心ファイルです。処理を構文解析した後、プログラムはイベントの管理に必要なデータをすべて取得して、そのデータをSmarty構造に割り当て、表示します。 PEARによるデータベース抽象化PEARは、PHP開発をスピードアップできるPHPライブラリ(パッケージ)の巨大なリポジトリです。このプログラムでは、メインのPEARパッケージは、データベース抽象化の最新ソリューションであるMDB2ライブラリです。この例ではMySQLデータベースを使いますが、このソリューションはコードに少し変更を加えるだけで、他の環境(例えば、Oracleをデータベースとする企業など)でも実行できます。MySQLの関連するPEARコンポーネントをインストールした後で別のデータベースを使用するために必要なことは、「inc.config.php」内の$dsn変数の値を変更することだけです。この変数には、DSNのドキュメンテーションに記載されているルールに従って有効なデータソース名(Data Source Name:DSN)を入れる必要があります。MySQLに使用したDSNは次のとおりです。 $dsn = 'mysql://user:password@mysql_server/mysql_db_name MySQLの代わりに別のデータベースを使いたい場合は、同じデータベーススキーマを作成する必要があります。もちろん、ファイル「file_sharing.sql」は有効ではありませんが、このファイルには、別のRDBMSを使ってデータベースを構成するために変換しなければならないSQLステートメントが含まれています。 ファイルの暗号化による機密保護このファイル共有アプリケーションの例では、128ビットキーのAES(Advanced Encryption Standard)アルゴリズムを使って、パスフレーズを暗号化形式(RFC 3174セキュアハッシュアルゴリズムに記載されているSHA1 160ビットチェックサムを使用)で保存することで、ファイルを必要に応じて暗号化形式で保存することができます。暗号化されたファイルの操作には必ずこれらのパスフレーズが必要なので、次の重要なガイドラインを覚えておきましょう。
Smartyの内容と働きSmartyを専門用語で言えば、テンプレートエンジンです。要するに、開発者が標準的なサイトレイアウトを維持しながらプレゼンテーションからロジックを切り離すことを簡単にできるようにするフレームワークです。多くのオンラインディスカッションフォーラムで、SmartyはMVCパラダイムの最小限の有効な実装かどうかという議論が繰り広げられていますが、私自身の考えでは、Smartyは経験の浅い開発者がコードとプレゼンテーションの分離を実現するための抜け道です。Smarty自体は基本的な構文を持つプログラミング言語です。前述のフォーラムで議論されているように、プレゼンテーションロジックを持つプレゼンテーションエンジンが必要だと考える人もいるようです。個人的には、ビジネスロジックとプレゼンテーションロジックの両方が存在すると考えます。つまり、プレゼンテーションロジックの乱用はよくないと思う場合でも、両方のロジックを受け入れることは可能です。実際、PHPコードによって、最終的な変数の代入をできる限り多く処理する必要があり、結局のところ、SmartyテンプレートはHTMLファイルを保たなければなりません。 Smartyをインストールするには、2つのディレクトリ(templatesとconfigs)を作成する必要があります。一般に、これらの2つのディレクトリはWebサーバードキュメントルートの外に置く必要がありますが、この例ではアプリケーションルートの下に入れました(smarty/templatesとsmarty/configs)。smarty/templatesディレクトリには、拡張子が.tplであるすべてのSmartyファイルを入れます。結局、Smartyファイルは、PHPコードによってコンテンツの割り当てと受け渡しが行われる単なるHTMLファイルです。 すでに説明したように、Smartyには、プレゼンテーションロジックの簡単な管理に役立つ基本的な構文が用意されています。 {include ...}という便利な構成体を使うと、複数のテンプレートの共通部分を1つのマスタテンプレートに埋め込むことができます。私は、PHPファイルと同じ命名スキーマを採用し、HTMLページの部分的なパーツを表すファイルに「inc」という接尾辞を使いました。このモジュール式メカニズムでは、Smarty/HTMLテンプレートの作成を始める前に、ページレイアウトを作成する必要があります。たとえば図3のスキーマは、この例で「files.all.tpl」ページと「files.tag.tpl」ページに使用しているスキーマです。Smartyファイルの編成と命名規則はこのスキーマを反映しています。図3 テンプレートのレイアウトスキーマ。Smartyファイルの編成と命名規則はこのスキーマを反映している。 ![]() $file_array=db_query($dsn,$sql)の$file_arrayが、SQLクエリから返されたインデックス付き配列です。各要素は行を表しますが、これはクエリフィールドに等しいキーを持つ連想配列です。コードをもう少し進むと、Smarty構造に割り当てられる行があります。これらの行の例を次に示します。
$smarty->assign('file_array', $file_array);
$smarty->display('files.all.tpl');
<ol class="core">
{foreach item=file from=$file_array name=file_loop}
<li class="core_left">
{if isset($file.protection)}
...
<input class="core" type="checkbox" name="select-{$file.id}"
value="yes" disabled="disabled"/>
...
{foreach ... }は、インデックス付き配列に対して繰り返し処理を行います。また、この例から、連想配列内の要素を参照する方法もわかります。{$file.protection}は$file['protection']に対応し、{$file.id}は$file['id']に対応します。overLIBとポップアップメニューPHPコードがサーバーサイドですべての処理を行わなければならない場合は、ワークフロープロセスが長くなりすぎるかもしれません。インタラクションを若干短縮するソリューションとしてJavaScriptのポップアップがありますが、JavaScriptを構成に挿入すると、許容しがたいエントロピーが生じて、ビジネスロジックとテンプレートロジックとの分離が著しく損なわれます。Smartyには、overLIBという非常に便利で強力なJavaScriptライブラリが埋め込まれています。SmartyのWebサイトによると、overLIBは「小さいポップアップ情報ボックスでWebサイトを拡張するために作成されたJavaScriptライブラリ」だそうです。Smartyは、overLIBを非常に単純な {popup ... }という構成体と統合します。ファイル「inc.file_list.tpl」で、overLIBの実際の使用例を見ることができます。
{include file='files.pop.tpl' assign='filePop'}
...
<a href="{$smarty.server.PHP_SELF}?id={$file.id}¬_crypted=1"
{popup
trigger=onClick
width=360
sticky=true
caption='Action'
closeclick=true
text=$filePop
}
>{$file.filename}</a>
...
PHPコードの改良コーディング中に適切なインデントやスペーシング規則を設定することはなかなか大変です。この目的には、PEAR PHP_Beautifierが大いに役立ちます。インストール方法は次のとおりです。pear install PHP_Beautifier php_beautifier [some_file].php --output new_file.php さらに、PEARには、一連のコーディング標準も用意されています。たとえば、フィルタのメカニズムを使ってコードをフォーマットするには、次のように実行します。 php_beautifier --filters "Pear()" [some_file].php --output new_file.php 著者紹介Roberto Giorgetti(Roberto Giorgetti)
イタリアに拠点を置くITマネージャ、テクニカルライター。主にビジネス分野と工業分野でオープンソースの開発に従事。核工学の学位を持つ。
関連記事 最新トップニュース
|
【ケータイ USA】新しい iPod は来週火曜に発表されるだろう(9月6日 13:00)
Apple が『iPod』関連の発表を準備中、内容は如何に(9月4日 12:40)
なぜ勝った? 世界No.1シェアをつかんだ“Windows”(9月5日 11:00)
【ケータイ USA】イギリスの団体が iPhone の広告における Apple の虚偽に言及(8月30日 13:00)
ソフトバンクモバイル、8月の純増数は約16万件――携帯電話契約数に関する速報(9月5日 14:40)
私の周りは“geek out”している人ばかり(9月5日)
|