プロが教える店舗&オフィスのセキュリティ対策術

こんにちは。

使用環境
OS:Turbolinux Appliance Server 3.0
Postfix:2.4.5
PHP:5.2.4

とあるサイトで空メールを受信すると自動でPHPを動かし、ワンタイムパスワードを返信するプログラムを利用しています。

今まで問題なく利用できていたのですが、最近ガラケーから空メールを送信した時だけワンタイムパスのみでなくエラーメールを返すようになりました。
PCやiPhoneからのメールにはエラーを返しません。

エラーメッセージは以下のような感じです

Command died with status 1: "/usr/bin/php -q /home/.sites/xxx/yyy/web/onetime.php". Command output: zend_mm_heap corrupted

どちらの場合もワンタイムパスは返信されてきますし、今まで動いていたことからも権限の問題はないと思われます。

何が原因なのか、またどうすれば解消するのかご存知の方がいらっしゃいましたらご教授お願いします。

A 回答 (5件)

ガラケーのメールアドレスがRFCに準拠していないものだからではないでしょうか?


http://www.ecc.kumagaku.ac.jp/file/tech/RFC-prob …
PHP側のセキュリティアップデートなんかで、準拠しないアドレスへの処理が出来なくなったのでは?

とエスパーしてみる。
    • good
    • 0
この回答へのお礼

ありがとうございます。
この問題のせいだとしたら、ガラケーだから、というわけでなく個人のアドレスの問題だということですよね…。

PHPのアップデートなどは行っていないのですが、dkim-milterとdk-milterのアップデートはしました。
これが関係あるのでしょうか…?

また、処理自体は実行されているので、このエラーメールだけ止まれば問題はないのですが^^;

お礼日時:2013/12/19 11:58

function is_valid_email ($email) {


return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
}

でメールアドレスが(PHPから見て)有効かどうか簡単にチェックできるので試してみてください。IPv6で表記されたものを除けば、このfilter_var関数に使われている正規表現は99.9%正しくRFC準拠判定が出来ます。
    • good
    • 0
この回答へのお礼

ありがとうございます。

頂いた関数を実行してみたところ、エラーメールの返るアドレスもそうでないアドレスも1を返してきました。
と、いうことは該当メールアドレスは有効だ、という理解でいいでしょうか?

だとすると、メールアドレスそのものの問題ではないのでしょうか?

お礼日時:2013/12/19 12:04

>> 該当メールアドレスは有効だ、という理解でいいでしょうか?



そういうことですね。

FILTER_VALIDATE_EMAILについての調査結果です、IPv6以外は正しく動いていることが分かります↓
http://qiita.com/mpyw/items/257eabe0b43b1e02e6f7

PHP自体がクラッシュするということは言語本体のバグを疑ってもいいかもしれません。ダメ元ですが最新バージョンのPHP5.5にアップデートされてみてはどうでしょうか?5.2はもう何年も前のかなり古いものなので。
    • good
    • 0
この回答へのお礼

ありがとうございます。

言語自体のバグ、ですか…。
PHPのアップデートは前々からやったほうがいいんだろうな、とは思っているのですが、
自社に詳しい人間がおらず、グループサイトや売上管理等、自社サーバ内のすべてが関わってくるので怖くてスルーしてきてますw
とはいえ、今後のことも考えるとどこかで必要になってくる作業ですよね…。
ローカル環境でテストしまくるしかありませんかね^^;

(PGという肩書があるのは未経験採用された私のみで、採用時にいた上司は私が入社して4ヶ月ほどで辞めてしまったので以降すべて独学ですorz)

お礼日時:2013/12/19 15:14

> この問題のせいだとしたら、ガラケーだから、というわけでなく個人のアドレスの問題だということですよね…。


はい、そうなりますが、ガラケーというか昔からの契約者のメールアドレスで問題になる事があります。

> PHPのアップデートなどは行っていないのですが、dkim-milterとdk-milterのアップデートはしました。
> これが関係あるのでしょうか…?
大いにあるような気がします。それ以外のセキュリティアップデートは行っていないのでしょうか?

> また、処理自体は実行されているので、このエラーメールだけ止まれば問題はないのですが^^;
#2さんの回答で問題ないとすると、元のソースで利用している何かに問題があるのでしょうが、ソースが見えないので。

エラーコードからすると、何らかのメモリリークを起こしているのではないでしょうか。
http://pentan.info/php/zend_mm_heap.html

この回答への補足

以下が問題のphpです。
このプラグラムも私が作ったものではないので漠然としか理解できていないと思います^^;


<?
include "constant.php";
ini_set('include_path', INCPATH);

//PEARのライブラリ読み込み
$pear = "/usr/share/pear/";
require_once("{$pear}Mail.php");
require_once("{$pear}Mail/mime.php");
require_once("{$pear}Mail/mimeDecode.php");
require_once("{$pear}MDB2.php");
require_once("{$htdocs}class/dbclass.php");//DB接続クラス

//FOR TEST
$testStr = "";

//DBに接続
$conDB = new MySQLDB();

// メールデータ取得設定
$params['include_bodies'] = true;
$params['decode_bodies'] = true;
$params['decode_headers'] = true;

//メールソースを標準入力から読み込み
$params['input'] = file_get_contents("php://stdin");
$params['crlf'] = "\r\n";
$source = $params['input'];

//メール解析用インスタンス
$structure = Mail_mimeDecode::decode($params);

//登録先
$from_mail = $structure->headers['to'];

//送信者のメールアドレス
$sender = $structure->headers['from'];

$pos1 = strpos($sender,"<");
$pos2 = strrpos($sender,">");
if($pos1){
$sender = substr($sender,($pos1+1),($pos2-$pos1-1));
}

//送信者の情報取得
$sql = "SELECT * FROM admin WHERE admin_mail = ? AND admin_validity <> 1";
$senderSplited = str_replace(array("<",">"),"",$sender);
$res = $conDB->preparedSql($sql,array($senderSplited),1);//*****************************************************

if(count($res)>0){

//署名付きの場合の処理を追加
preg_match("/<.*>/",$to_mail,$str);
if($str[0]!=""){
$str=substr($str[0],1,strlen($str[0])-2);
$to_mail = $str;
}

$params = array(
"host" => "localhost",
"port" => 25,
"auth" => false,
"username" => "user",
"password" => "pass"
);

$mailObject = Mail::factory("smtp", $params);
$mailTitle2 = mb_convert_encoding("【ワンタイムパスワード】","ISO-2022-JP","UTF-8");

$headers = array(
"To" => $sender,
"From" => "onetime@example.com",
"Subject" => $mailTitle2
);

//ワンタイム設定
$onetime = rand(100,99999);

$sql = "UPDATE admin
SET admin_onetime = ?,
admin_note = ?
WHERE admin_id = ?";
$arr = array($onetime,date("Y-m-d H:i:s"),$res[0]["admin_id"]);
$otp = $conDB->preparedSql($sql,$arr,2);

$bodyArranged = mb_convert_encoding("ワンタイムパスワード: {$onetime}","ISO-2022-JP","UTF-8");

//スタッフへメール送信
$mailObject->send($sender, $headers, $bodyArranged);
}

//AND admin_validity = 0


?>

よろしくお願いいたします

補足日時:2013/12/19 15:38
    • good
    • 0
この回答へのお礼

度々ありがとうございます。

>大いにあるような気がします。それ以外のセキュリティアップデートは行っていないのでしょうか?
それ以外ではアップデートは行っていません。
自サーバから発行するメルマガがGmailから弾かれてしまうのでspam認定をされないようにごにょごにょやっているのですが、SPFの設定などはこちらからの送信用設定なので受信をトリガーにしたプログラムには関係ないと思ったのですが、影響があるのでしょうか…

> #2さんの回答で問題ないとすると、元のソースで利用している何かに問題があるのでしょうが、ソースが見えないので。
申し訳ありません。
ソースを提示するべきですよね。ソースを捕捉に改めて提示させていただきますので、お時間が許せば何かアドバイスいただけると助かります。

>エラーコードからすると、何らかのメモリリークを起こしているのではないでしょうか。
サイトのご提示までありがとうございます。このサイトは拝見したのですが、php.iniを安易に触るとほかに影響が出てしまいそうで怖くて、二の足を踏んでいます。また、メモリリークの関係ならどのアドレスからもエラーメールが返ってくるのでは?と思ったりもしています。

お礼日時:2013/12/19 15:34

> このプラグラムも私が作ったものではないので漠然としか理解できていないと思います^^;


作った人に聞くのが筋だと思いますが。

こちらもPHPは素人ですが、DBへの問い合わせと更新を行っているようですね。
それぞれ、正常になされているのか、確認できますか?

> //メール解析用インスタンス
> $structure = Mail_mimeDecode::decode($params);
ここも怪しいかもしれません。このソースではデコード処理対応が適切にされているか、でこの後の処理が変わってくると思います。
これの戻りに対して、正常かどうかの判定がありませんので、ガラケーだけ、というのも関連しているかもしれません。

あとは、一般的な方法として、デバッグ文などを入れてみて、どこまで処理がいっているか確認するしか無いでしょう。

----
ソースをすべて乗っけても、デバック出来るわけではありませんので、悪しからず。
    • good
    • 0
この回答へのお礼

ありがとうございます。

作った人、に尋ねられたら一番いいのですが、作った人は既に辞めてしまっているので尋ねることができません;

>DBへの問い合わせと更新を行っているようですね。
>それぞれ、正常になされているのか、確認できますか?

これに関しては、DBそのものはワンタイムが書き直されてメールで送られてくるものと一致しているので大丈夫だと思います。

教えていただいた部分を重点的に一つずつ確かめてみます。
お時間をとらせてしまい申し訳ありませんでした。

ありがとうございました。

お礼日時:2013/12/19 17:44

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!