以前、EC-CubeのプラグインでSMBCのカード決済プラグインを調査してバグを見つけたわけですが、本日、新しいモジュールに「しれっ」と変更されたようです。IPAに報告しましたからね。何か気づいたのでしょう。
一瞬(数日間)非公開になっていたことから、色々頑張ったんでしょう(笑)
で、その改修が、また、おそ松くんというか・・・(笑)
以前のコードはこんな感じ。
// パスワード等をマスクする
if (!$raw && is_array($msg)) {
$keys = array('card_no', 'security_cd');
foreach ($keys as $key) {
if (isset($msg[$key]) && !is_array($msg[$key])) {
$msg[$key] = str_pad('', strlen($msg[$key]), '*');
}
}
$msg = print_r($msg, true);
}
今度のコードはこんな感じ。
// パスワード等をマスクする
if (!$raw && is_array($msg)) {
$keys = array('card_no', 'security_cd');
foreach ($keys as $key) {
if (isset($msg[$key]) && !is_array($msg[$key])) {
$msg[$key] = str_pad('', strlen($msg[$key]), '*');
} elseif (isset($msg[$key]['value'])) {
$msg[$key]['value'] = str_pad('', strlen($msg[$key]['value']), '*');
}
}
$msg = print_r($msg, true);
}
以前は、
・card_no って変数見つけたら、配列じゃなければ「*」に置き換えるよっ!
ってコードでしたが、今度は、
・card_noって変数のvalueって配列変数だったら「*」に置き換えるよっ!
ってのが追加されてました。
いやいや、マジかよ。いいのかよ・・・・(笑)
理屈はわかるけど、その前の分岐条件が怪しい。
この辺の言語仕様はphpのバージョンによっても動きが様々かもしれませんが、ね。
} elseif (isset($msg[$key]['value'])) {
これは、やばくないっすか(笑)
いや、やりたいことわかるけどさ。。。。。
もし、$keyがあずかり知らん名前だったらどうすんのよ。phpが良きに計らってくれる可能性もあるけど、普通考えたら、
} elseif (isset(null['value'])) {
って可能性もあるわけでしょ?
ちゃんとしたプログラマなら、こんな書き方は、言語仕様の変更等で怖いからやらない気がするんよね・・・
どうせやるなら、多次元配列を再帰的にarray_key_existsを使ってチェックする関数作るべきだと思うんだよね・・・
シロートかよ(笑)
まぁ、それより気になるのは、今まで蓄積してた、カード情報をどうするんですかね。。。
使ってる業者全員に連絡入れるんすかね・・・?
入れなければ、これ、まずいっすよ。きっと。。。。。