|
[2005/02/11] ITProのPHPウォッチによるとプロジェクトは停止状態にあり、新プロジェクトとしてeAcceleratorプロジェクトが開始されています。近いうちにまた調べてみようと思います。
先日パフォーマンスUP目的でTurck MMCacheを導入してみましたが、もう一つ大きな機能があります。バージョン2.3.10からバンドルされたPHPスクリプトの暗号化機能です。この手の機能・ツールは有償として配布されている事が多いですが、2004/11/15現在で無償で提供されているのはMMCacheぐらいではないでしょうか(他にあったら教えてください(^-^;)。
ということで、早速試してみました。インストール手順は、先日の導入ページを参照してください。また、CGI版 or CLI版のPHPとPHP拡張モジュールであるzlibモジュールが必要になりますので、必要であればインストールを行います。以下はすでにソースからPHPをbuildしてある場合にzlibモジュールをsharedモジュールとしてインストールする例です。php.iniの編集は、extension_dirを正しく設定している場合「extension=zlib.so」を追記するだけです。extension_dirを設定していない場合、正しく設定するかzlib.soへの絶対パスを追記します。
$ cd [PHPのソースディレクトリ]
$ make distclean
$ ./configure --with-zlib=shared
$ make build-modules
$ su -
# make install-modules
# vi /path/to/php.ini(※)
# /path/to/apachectl stop
# /path/to/apachectl start
#
早速以下のようなPHPスクリプトで暗号化を試してみました。
●test.php
<?php
define('PASSWORD', '秘密のパスワード');
class Test
{
function add($a, $b)
{
return $a + $b;
}
}
?>
<?php
$test = new Test();
echo 'result=' . $test->add(2, 3) . '<br>';
echo 'PASSWORD=' . PASSWORD . '<br>';
?>
暗号化手順は、MMCacheのソースを展開したディレクトリにあるencode.phpを使用します。今回は、暗号化するファイルを置いたディレクトリにコピーして使用しました。実行時に何も引数を渡さない場合、ヘルプが表示されます。
●encode.phpのヘルプを表示する$ php ./encoder.php
Usage: php -q encoder.php [options] source_file_name
php -q encoder.php [options] source_file_name...
php -q encoder.php [options] source_directory_name...
Options:
-s suffix
encode files only with following suffix (default is "php")
-a
encode all files (no by default)
-l
follow symbolic links (no by default)
-r
encode directories recursively (no by default)
-c
copy files those shouldn't be encoded (no by default)
-f
overwrite existing files (no by default)
-o target
If you encode only one script then 'target' specifyes an output
file name. If you encode directory or several files at once
then 'target' specifyes an output directory name.
Examples:
php -q encoder.php some_file.php
php -q encoder.php some_file.php -o some_encoded_file.php
php -q encoder.php *.php -o some_dir
php -q encoder.php ~/public_html/x -rcf -sphp -sinc -o ~/public_html/y
$
上記ヘルプを踏まえtest.phpを暗号化してみます。出力ファイル名は、test.encoded.phpです。結果は以下の通りで、適宜改行を入れています。
●encode.phpの実行$ php ./encoder.php test.php -o test.encoded.php
$
●test.encoded.php
<?php if (!is_callable("mmcache_load")
&& !@dl((PHP_OS=="WINNT"||PHP_OS=="WIN32")?"TurckLoader.dll":"TurckLoader.so")) {
die("This PHP script has been encoded with Turck MMcache, to run it you must
install <a href=\"http://turck-mmcache.sourceforge.net/\">Turck MMCache
or Turck Loader</a>");}
return mmcache_load('eJxVUFEKwjAM7UsrKx7AI4h3GFXGHPgzGMwLTDb1wy8372+yphULbdL3Xv
OStm1d1ZfGkDEGtOFzmebFkEuZLvAWbBhH1sppV3yr/LNnjRXVgFOUZ+QmiBhMovTed8jajrIIxsHRk
bQix2ixUyC9TvGu8Sw+0tuV+22cKUq+/ZCwtg//UHkPJWU87AlwufQ/V8IB1sapk1sVANIPkdzGVk2g
Nck2nqmC0/c0f15LcHQgJJsjAB3qC0tDH4A=');?>
暗号化されたスクリプトの先頭には、MMCacheが有効な場合に暗号化されたスクリプトを読み込む、といったスクリプトが埋め込まれています。また、このスクリプトはMMCacheがインストールされている環境でそのまま実行することができます。また、(当然ですが)MMCacheのキャッシュ機能により暗号化されたスクリプトもキャッシュされます。
また、暗号化されたスクリプトはBASE64エンコードされていますが、以下のようにbase64_decodeをかけてもdefineでベタ書きしていた内容も綺麗に暗号化されていることが分かります。実際に試してみてください(以下のソースは適宜改行しています)。
●暗号化+BASE64エンコードされたスクリプトをBASE64デコードするスクリプト
<?php
echo base64_decode('eJxVUFEKwjAM7UsrKx7AI4h3GFXGHPgzGMwLTDb1wy8372+yphULbdL3Xv
OStm1d1ZfGkDEGtOFzmebFkEuZLvAWbBhH1sppV3yr/LNnjRXVgFOUZ+QmiBhMovTed8jajrIIxsHRk
bQix2ixUyC9TvGu8Sw+0tuV+22cKUq+/ZCwtg//UHkPJWU87AlwufQ/V8IB1sapk1sVANIPkdzGVk2g
Nck2nqmC0/c0f15LcHQgJJsjAB3qC0tDH4A=');
?>
あと、暗号化を行うことでスクリプトファイルのサイズ自体もかなりコンパクトになります。モノにもよりますが、100KB程度のPHPスクリプト(でかいなぁ。。。)が20KB前後にはなると思います。
これでスクリプトが丸見えだとマズイ場合でも大丈夫ですね。
|