EC-CUBEでLC_Page_ResizeImage.phpをアップデートしたらresize_imageが効かなくなった!そして、原因は正規表現!

最近、EC-CUBEを使って自分で運営しているランプのネットショップで、サムネイルがうまく表示されていない事態を発見した。

EC-CUBE

なんでだろうとおもって、まずはsite.logをみたところ

invalid access :resize_image.php $_GET[‘image’]=/product/MASTERLED7WEZ_130.jpg

とのこと。

あと、表示がこけているイメージのURLは下記のとおりになっていた。

http://ec.smartlight.jp/resize_image.php?image=/product/Pa-LDA6H_260.jpg&width=65&height=65

心当たりあるのはちょっと前に自分でいくつかのファイルをアップデートしたことで、その際に、resize_image.phpが呼び出しているPage_ResizeImageのクラスがあった。

なのでこちらもチェックしてみると、lfCheckFileName()が、イメージのファイル名の中に好ましく無い記号がはいっていた場合に、falseを返してinvalid access :resize_image.php というエラーを出すことがわかった。

で、このlfCheckFileName()がこちら


   function lfCheckFileName() {
        $file    = trim($_GET['image']);
        if (!preg_match("/^[[:alnum:]_\.-]+$/i", $file)) {
            return false;
        } else {
            return true;
        }
    }

よくみてみると、正規表現で記号の例外の表記がちょっと違う感じ。

これだとディレクトリをあらわす”/”がはいっていると、falseになってしまう。

ということで、この様に修正。


   function lfCheckFileName() {
        $file    = trim($_GET['image']);
        if (!preg_match("/^[[:alnum:]_\.\-\/]+$/i", $file)) {
            return false;
        } else {
            return true;
        }
    }

すると、

スマートライト  現在のカゴの中 1

ということで、無事に修正できました。

2013-9-9追記

「/」を有効にすると、「../」これが通ってしまうので、ディレクトリトラバーサルができてしまう。特定のフォルダ下になる場合は、realpathを取って指定したフォルダの下にあるかどうかのチェックをする必要があるとのことです。

ご指摘いただき、ありがとうございます!