- 締切済み
PHP 正規表現 スラッシュの扱いについて
PHPでファイルをアップロードするプログラムを作っています。 誤ってCGIなどのプログラムをアップしない為に、 拡張子を判断してそれを防ぐ為の構造を考えています。 そこで条件部を、 if(!preg_match("/^image\/.*(png|jpeg|gif)$/i", $_FILES["file"]["type"]) || !preg_match("/^text/html\/.*(txt|html)$/i", $_FILES["file"]["type"])){ エラーメッセージ } としたのですが、上手く動いてくれません。 恐らく「text/html」の表記に問題があるのだと思うのですが… 解決方法、教えてください。よろしくお願いします。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- php504
- ベストアンサー率42% (926/2160)
CGIファイルも普通のテキストファイルなのでtypeではなくファイル名の拡張子で制限した方がいいでしょう
- yambejp
- ベストアンサー率51% (3827/7415)
もしそのエラーなら preg_match("/^text/html\/.*(txt|html)$/i",・・・) ではなくて preg_match("/^text\/.*(txt|html)$/i",・・・) じゃないでしょうか?
お礼
アドバイス、ありがとうございました。 if文を二つに分けることで、問題を回避しました。 if(!preg_match("/^image\/.*(png|jpeg|gif)$/i", $_FILES["file"]["type"])){ if(!preg_match("/^text/html\/.*(txt|html)$/i", $_FILES["file"]["type"])){
- yambejp
- ベストアンサー率51% (3827/7415)
error($_FILES["file"]["type"]."の形式は不正です。"); などして内容を表示してみては? 単純にマッチしてないだけのような気がしますが・・・
補足
error($_FILES["file"]["type"]."ファイル形式が不正です。"); の結果は、 text/htmlファイル形式が不正です。 となりました。 見た目、問題ないと思うのですが・・・ 「見えない文字」があるんでしょうか?
- asuncion
- ベストアンサー率33% (2127/6289)
> error("ファイル形式が不正です。"); Webサーバのログを見ることができるのでしたら、 当該アクセス時のログの内容を見せていただけますか?
お礼
アドバイス、ありがとうございました。 残念ながら、今回のログを参照することができませんでした。 (多忙で確認できませんでした。)
- yambejp
- ベストアンサー率51% (3827/7415)
とりあえず text/html ↓ text\/html してみては?
補足
if(!preg_match("/^text\/html\/.*(txt|html)$/i", $_FILES["file"]["type"])){ error("ファイル形式が不正です。"); } これで試してみましたが、できませんでした。
- asuncion
- ベストアンサー率33% (2127/6289)
> 上手く動いてくれません。 どんな風に、でしょうか? エラーメッセージが出たのでしたら、全文を載せてください。
補足
「エラーメッセージ」とは、 error("ファイル形式が不正です。"); を略しただけです。 ですので、画面には「ファイル形式が不正です」というメッセージが表示されます。 htmlファイルをアップロードした場合でも、 期待に反して、このエラーメッセージが出てしまうのです。
お礼
アドバイス、ありがとうございました。