XOOPSのアップデート
カテゴリー:PHP
XOOPSを使い、管理しているサイトの1つにXOOPSのバージョンが古い(2.0.7.3)のままアップデートされていないものがありましたので、脆弱性をふさぐためアップデートを行いました。
XOOPS本体のアップデート
http://xoopscube.jp/modules/xigg/index.php/blog/43
上記の公式サイトより2.0.7→2.0.10 JP→2.0.11 JP→...→2.0.16a JPとCube以前の最新安定版までアップデートしました。
アップデートの方法は圧縮ファイルを展開したディレクトリの中のhtmlディレクトリを使用しているXOOPSのルートディレクトリにコピーするだけで大丈夫です。
module(piCal)のアップデート
XOOPSのmoduleの1つpiCalを使用していましたが、こちらも旧バージョン(0.85x以下)に脆弱性があるので、アップデートを行おうとしました。
http://xoops.peak.ne.jp/md/mydownloads/singlefile.php?lid=54
上記のサイトから最新バージョンをDLしてきてXOOPSのルーとディレクトリに展開。
しかし、その後モジュール管理からモジュールアップデートを行おうとすると以下のようなエラーが出ました。
Could not update piCal
そこで、一度アンインストールしてから再インストールしようと思いアンインストールの操作をするとまた以下のようなエラーが出ました。
ERROR: Could not delete piCal
メインメニューファイルへの書き込みに失敗しました
どうやら、ファイルのパーミッション関係がおかしくなっていることが原因なようです。今回原因を特定して解決するところまでできなかったので、脆弱性が解決するまで、このXOOPSを停止することにしました。
メール自動返信の追加・修正点
カテゴリー:Linux
メールの無限ループ回避
メール自動返信プログラム2 perlでの実装
http://www.nanbu.com/blog/blog1/detail-234.html
上の記事でperlを使ってメール自動返信プログラムを書いていますが
このプログラムではメールデーモンからエラーメッセージが返ってきたり、
自分のアドレスがFromに入っていたりした場合に無限ループになってしまいます。
そこで以下の2つの条件の時にメールを送信しないようにして、無限ループを回避させるようにします。
1.送信アドレスがメールデーモンのアドレスである時
2.送信アドレスが自分のメールアドレスと一致する時
コードにすると、以下のようなコードをメール送信の直前に挿入します。
エラーの発生とその内容をログファイルに記録して、処理を停止します。
$pt1 = "DAEMON";
$pt2 = "autoresponse@nanbu.com";
if($mailaddress =~ /$pt1/ ||$mailaddress =~ /$pt2/ ){
open(OUT, ">> /home/start/returnmail.log");
print(OUT localtime(time()).":::mail test ");
print(OUT "********ERROR:possibility of infinite loop************* ");
print(OUT $content);
print(OUT " ");
print(OUT "--");
print(OUT " ");
print(OUT $mailaddress);
print(OUT " ");
print(OUT $ma16);
print(OUT "----------------------------------------------------------");
close(OUT);
exit;
}
メールアドレスに「DAEMON」(メールデーモンのアドレス)が含まれている場合、または「autoresponse@nanbu.com」(自分のアドレス)が含まれている場合に処理を停止してエラーメッセージを書き込むようになっています。
なおメールデーモンのアドレスを「DAEMON」だけで判別するのは、ユーザのアドレスまでメールデーモンと判別される可能性がありますので、実際にはもっと厳密な判定をするほうが望ましいと思います。
Blowfishをつかってメールアドレスを暗号化
メール自動返信プログラム2 perlでの実装
http://www.nanbu.com/blog/blog1/detail-234.html
上の記事の仕様では、メールアドレスをアスキーコード変換して記号化しています。
これをアスキーコード変換ではなく、なんらかの方法でアドレスを暗号化することで
認証の役割をつけたいと思います。
暗号化方式の選択ですが、
1.PHP,perlでの実装ができること
(メール送信はperlで行って、アドレスの読み取りはPHPで行うため、perlで暗号化してPHPで復号化する必要がある)
2.使用に費用や手間がかからないこと
3.暗号化した時にデータが長くなりすぎない(携帯メールにURLのGETパラメータとしてつけて送信することを考えて)
を考えて、PHP,perlの両方にライブラリがあり、ライセンスがフリーであるBlowfishを使用することにしました。
perl-Blowfish
cpanでCrypt::CBCモジュールをインストールします。
ただし、今回は移植性を考えてユーザのホームディレクトリにインストールするようにしました。
この方法については下のサイトに詳しい説明があります。
CPANで自分のホームディレクトリ内にモジュールをインストール
http://wo.skr.jp/mt/2005/11/cpan.html
Crypt::CBCのインストールが終わったら以下のようなサンプルコードを書いて動作を確認してみます。
use Crypt::CBC;
$cipher = Crypt::CBC->new( {'key' => 'my secret key',
'cipher' => 'Blowfish',
'iv' => '$KJh#(}q',
'regenerate_key' => 0, # default true
'padding' => 'space',
'prepend_iv' => 0
});
$ciphertext = $cipher->encrypt("This data is hush hush");
$plaintext = $cipher->decrypt($ciphertext);
$cipher->start('encrypting');
open(F,"./BIG_FILE");
while (read(F,$buffer,1024)) {
print $cipher->crypt($buffer);
}
print $cipher->finish;
(サンプルコードはhttp://perldoc.jp/docs/modules/Crypt-CBC-2.08/CBC.podに掲載されているもの)
ただ、今回これで実行すると以下のようなエラーがでました。
If specified by -literal_key, then the key length must be equal to the chosen cipher's key length of 56 bytes at blowfish2.pl line 3
そこでkeyの部分を56バイトに変更するとエラーは表示されなくなりました。
PHP-Blowfish
まずPEARのPEAR::Crypt_Blowfishモジュールをインストールします。
その後以下のようなサンプルコードを書いて動作を確認してみます。
include_once 'Crypt/Blowfish.php';
$key = 'thisiskey';
$text = 'tihsisdata';
$blowfish = new Crypt_Blowfish($key); $crypttext = $blowfish->encrypt($text); $plaintext = $blowfish->decrypt($encrypt);
echo $crypttext;
echo $plaintext;
PHPとperlの連携-Blowfish
今回、perlで暗号化、PHPで復号化することが必要です。
そこで上に書いたサンプルプログラムをいじって、perlとPHPで同じkeyを使ってperlで暗号化,PHPで復号化したのですが、元のデータが復元できませんでした。
これはそれぞれのモジュールの初期化設定や、パラメータ設定の問題だと思います。
どのようにすれば連携できるのか現在調査中です