ノリブログ?

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);
echo $crypttext;

$plaintext = $blowfish->decrypt($encrypt);
echo $plaintext; 

PHPとperlの連携-Blowfish

今回、perlで暗号化、PHPで復号化することが必要です。
そこで上に書いたサンプルプログラムをいじって、perlとPHPで同じkeyを使ってperlで暗号化,PHPで復号化したのですが、元のデータが復元できませんでした。
これはそれぞれのモジュールの初期化設定や、パラメータ設定の問題だと思います。
どのようにすれば連携できるのか現在調査中です