最近、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()がこちら
1 2 3 4 5 6 7 8 | function lfCheckFileName() { $file = trim( $_GET [ 'image' ]); if (!preg_match( "/^[[:alnum:]_\.-]+$/i" , $file )) { return false; } else { return true; } } |
よくみてみると、正規表現で記号の例外の表記がちょっと違う感じ。
これだとディレクトリをあらわす”/”がはいっていると、falseになってしまう。
ということで、この様に修正。
1 2 3 4 5 6 7 8 | function lfCheckFileName() { $file = trim( $_GET [ 'image' ]); if (!preg_match( "/^[[:alnum:]_\.\-\/]+$/i" , $file )) { return false; } else { return true; } } |
すると、
ということで、無事に修正できました。
2013-9-9追記
「/」を有効にすると、「../」これが通ってしまうので、ディレクトリトラバーサルができてしまう。特定のフォルダ下になる場合は、realpathを取って指定したフォルダの下にあるかどうかのチェックをする必要があるとのことです。
ご指摘いただき、ありがとうございます!