EC-Cubeのプラグインのバグ見つけた。かなりやばい系。(更新編)

以前、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を使ってチェックする関数作るべきだと思うんだよね・・・
シロートかよ(笑)

まぁ、それより気になるのは、今まで蓄積してた、カード情報をどうするんですかね。。。
使ってる業者全員に連絡入れるんすかね・・・?
入れなければ、これ、まずいっすよ。きっと。。。。。


Comments are closed.