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

いつもお世話になっております。


画像をアップロードするスクリプトを考えているのですが…
(PHP+MySQL)

画像格納ディレクトリを用意し、MySQLにてファイル名・拡張子・投稿時間を管理するといったものです。ここで、

1.半角英数以外のファイル名だと、アップロードすることはできるが表示ができない。

2.なので、半角英数以外のファイル名の場合にはエラー表示を出すようにする。

少々強引ですが、現段階で自分にできることをやろうと思っていますので、上のような仕組みを考えています。

引っかかったのが、
$file_name=$_FILES['user_picture']['name'];
(user_pictureはPOSTからの値)
の半角英数の判別です。

これで得られるクライアントサイドのフルパスからファイル名だけを抽出して、その部分にpreg_matchを当てればいいと思うのですが、その方法が分かりません。

どなたかご教授いただけないでしょうか。
よろしくお願い致します。

(抽象的な方向性ではなく、具体的なアドバイス・スクリプトをお願いします。)
(そもそもなんで1.ができないのかご存知の方がいらっしゃいましたら、こちらもお願いします。)

A 回答 (1件)

最近のセキュリティのしっかりしたブラウザでは、input type="file" に入力されたパス+ファイル名のうちファイル名しか送信しないようになっています。


もしパス区切り文字が入っていたら、古いブラウザの利用者なので、弾くくらいの気持ちでよいかと思います。(セキュリティに無関心な利用者ではウィルスたっぷりのファイルの可能性も高いんじゃないかとか思うので)
ということで、これだけでいいのでは?

if(! preg_match ( '/^[0-9a-zA-Z.\-]+$/', $file_name ) ){
print "error filename";
exit;
}

>なんで1.ができないのか
大概のサーバーは、unix系(linux freebsd etc)なので、これらのOSでは、ファイル名に多バイト文字を使えないということだったと思いましたけど。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

確かに、echoにて$file_name=$_FILES['user_picture']['name'];を出してみたところ、フルパスではなくファイル名のみが表示されました。
私の思い込みでした。
すみません。

正規表現ありがとうございます。
今回、年内にサイトをアップロードすることを目標としていまして、正規表現についてはまだ勉強していないのですが、今後これについてはしっかり勉強し、hrm_mmmさんのご恩を他の方に返すように努力します。

1.に関してもご回答ありがとうございます。

今、いただいた正規表現でチェックしましたところ、意図した通りに動かすことができました。

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

お礼日時:2007/12/25 15:03

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