• 締切済み

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」の表記に問題があるのだと思うのですが… 解決方法、教えてください。よろしくお願いします。

  • PHP
  • 回答数6
  • ありがとう数3

みんなの回答

  • php504
  • ベストアンサー率42% (926/2160)
回答No.6

CGIファイルも普通のテキストファイルなのでtypeではなくファイル名の拡張子で制限した方がいいでしょう

-TaKaHiRo-
質問者

お礼

アドバイス、ありがとうございました。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.5

もしそのエラーなら preg_match("/^text/html\/.*(txt|html)$/i",・・・) ではなくて preg_match("/^text\/.*(txt|html)$/i",・・・) じゃないでしょうか?

-TaKaHiRo-
質問者

お礼

アドバイス、ありがとうございました。 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)
回答No.4

error($_FILES["file"]["type"]."の形式は不正です。"); などして内容を表示してみては? 単純にマッチしてないだけのような気がしますが・・・

-TaKaHiRo-
質問者

補足

error($_FILES["file"]["type"]."ファイル形式が不正です。"); の結果は、 text/htmlファイル形式が不正です。 となりました。 見た目、問題ないと思うのですが・・・ 「見えない文字」があるんでしょうか?

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.3

> error("ファイル形式が不正です。"); Webサーバのログを見ることができるのでしたら、 当該アクセス時のログの内容を見せていただけますか?

-TaKaHiRo-
質問者

お礼

アドバイス、ありがとうございました。 残念ながら、今回のログを参照することができませんでした。 (多忙で確認できませんでした。)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

とりあえず text/html ↓ text\/html してみては?

-TaKaHiRo-
質問者

補足

if(!preg_match("/^text\/html\/.*(txt|html)$/i", $_FILES["file"]["type"])){  error("ファイル形式が不正です。"); } これで試してみましたが、できませんでした。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.1

> 上手く動いてくれません。 どんな風に、でしょうか? エラーメッセージが出たのでしたら、全文を載せてください。

-TaKaHiRo-
質問者

補足

「エラーメッセージ」とは、 error("ファイル形式が不正です。"); を略しただけです。 ですので、画面には「ファイル形式が不正です」というメッセージが表示されます。 htmlファイルをアップロードした場合でも、 期待に反して、このエラーメッセージが出てしまうのです。

関連するQ&A

  • preg_matchの使い方

    選択した画像ファイルをgifフォルダにアップロード保存して 同入力画面にも出力するサンプルの勉強をしています。 「preg_match」を使ってアップロードできるファイルを gif,jpg,pngに限定するというようにしたいのですが 使い方が間違っているようで上手く行きません。 どこが間違っているのでしょうか? よろしくお願いいたします。 ---------------------------------------------------------- <html> <body> <form action="" method="post" enctype="multipart/form-data"> <input type="file" name="data"> <input type="submit" value="表示"> </form> <?php $updir = "./gif/"; $filename = $_FILES["data"]["name"]; if(file_exists($_FILES["data"]["tmp_name"])){ $filesize = filesize($_FILES["data"]["tmp_name"]); if($filesize <= 100000){ if(preg_match("/\.gif$ | \.jpg$ | \.png$/", $filename)){ ←←※※※ move_uploaded_file($_FILES["data"]["tmp_name"], $updir.$filename); echo "ファイル名".$filename."アップロード成功!"; echo "<br><br>"; echo "<img src='./gif/$filename'>"; }else{ echo "jpg,pngもしくはgifのファイルしかアップできません。"; } }else{ echo "$filesize バイト。ファイルサイズが大きすぎます。"; } } ?> </body> </html> ----------------------------------------------------------

    • ベストアンサー
    • PHP
  • phpでファイルの先頭8バイトだけで画像の形式を調べる

    phpでファイルの先頭8バイトだけで画像の形式を調べる phpで画像の形式を調べる方法について http://labs.gmo.jp/blog/ku/2007/05/8.html のページを参考に、php5にて以下のようなコードを書いてみました。 //アップロードされたファイルを読み込み $fp = fopen($_FILES["upfile"]["tmp_name"],"rb"); $imgdata = fread($fp,filesize($imgfname)); fclose($fp); //画像形式判定 echo getImageType($imgdata)."形式と思われます\n"; function getImageType($dat){ if ( preg_match( '/^x89PNGx0dx0ax1ax0a/', $dat) ) { $type = "png"; } elseif ( preg_match( '/^GIF8[79]a/', $dat) ) { $type = "gif"; } elseif ( preg_match( '/^xffxd8/', $dat) ) { $type = "jpg"; } return $type; } ところが、png/gif/jpegいずれの画像でテストしてもgetImageTypeの結果が""となってしまい、正常に判定することができません。 修正点などご教授いただければ幸いです。

    • ベストアンサー
    • PHP
  • .htaccessの正規表現

    .htaccessの正規表現で質問があります。 <Files ~ "\.(html|gif|jpeg|png)$"> 例えばこのような場合最後のファイル名が「html」「gif」「jpeg」「png」に適用されますが、~(チルダ)はパターンマッチ、(||)(カッコとパイプライン)はパイプラインで区切ってそのいずれか、$(ドルマーク)は行末のマッチングと分かったのですが、\.(円マークとドット)が分かりません。どういう意味なんでしょうか? 例えば、次のように記述すると間違いなんでしょうか? <Files ~ "(html|gif|jpeg|png)$"> また、 <Files password.html> このような記述が載っていたのですが、ファイル名がこのような場合ダブルクォーテーション(")で囲まなくていいのでしょうか? また、*(アスタリスク)と?(クエスチョンマーク)は必ず1文字以上でなければいけないのでしょうか?0文字ではダメなんでしょうか? 回答よろしくお願いします。

    • ベストアンサー
    • HTML
  • PHP正規表現の難題・preg_replaceでイメージタグをリンクタグに…

    PHPのpreg_replaceを使用して、 imgタグをaタグに置換するプログラムで躓いています。 全てのパターン$hogeで適用される正規表現をかけません。 (※現在パターン1のみ出来ない状況で困っています) 間違い箇所ありましたらご教授下さい。 ■パターン1 $hoge = '<img src="http://test.jp/test.gif" class="test" style="border:none;" />'; ■パターン2 $hoge = '<img src="http://test.jp/test.gif">'; ■パターン3 $hoge = '<img width="100" src="http://test.jp/test.gif">'; preg_replace('/\<img(.*)src=\"?(http[\-_\.\!\~\*\'\(\)a-z0-9\;\/\?\:@&=\+\$\,\%\#]+(jpg|jpeg|gif|png|bmp))\"(.*)\>/i',"<a href='\\2'>link</a>",$hoge); どうぞよろしくお願い致します。

    • ベストアンサー
    • PHP
  • 【PHP】関数から渡した引数を正規表現で扱うには?

    下記(1)はディレクトリ「sample_dir」のファイル一覧を取得し、ファイル名「hogehoge」から始まるものだけを一覧表示させたものです。 「hogehoge」以外の文言でも絞り込めるように関数を呼び出して((2))、指定文言を引数で$xに渡したいのですが、引数が認識されません。 引数を正規表現で扱うには、どのように記述したら良いですか。 ご教示をお願いします。 ---------------------------------------- (1) ---------------------------------------- //対象ディレクトリ $dir_s="./sample_dir"; //ディレクトリ内のファイルを取り出す $filelist=scandir($dir_s); //ファイル数をチェック $count=count($filelist); for($i=0; $i<$count; $i++){ $y = ($filelist[$i]); if(preg_match("/^hogehoge/", $y)){ print_r($y); } } ---------------------------------------- (2) ---------------------------------------- function file_search($x){ for($i=0; $i<$count; $i++){ $y = ($filelist[$i]); if($z = preg_match($x, $y)){ print_r($y); } } } file_search("/^filename/"); //引数「filename」でマッチさせたい

    • ベストアンサー
    • PHP
  • PHPの正規表現でHTMLタグの内容を抽出したい

    jqueryでPHPにurlを渡して、そのurlの中のtitleタグの内容を抽出したいと思ってます。が、うまく行きません。 ●jquery↓ <script type="text/javascript"> function site_check(){ var url = $("#url0").val(); if(url=="") return; $.getJSON("test.php?url=" + encodeURI(url) ,function(res){ $("#title").html(res.title); }); } </script> ●test.php↓ $html=file_get_contents($_GET["url"]); preg_match_all("/<title>(.*?)<\/title>/i",$html,$html_title); header('Content-type: application/json'); echo json_encode($html_title); このコードではなにもレスポンスが帰って来ません。 もし足りない情報がありましたらご指摘ください。

    • ベストアンサー
    • PHP
  • スマートフォンから画像のアップロード

    スマートフォン用サイトで画像のアップロード機能を実装しようと思っています。 PCサイト用に作成したものをそのまま流用しようと思ったのですが、 うまくいきませんでした。 対応する画像はjpg,gif,pngの三種類です。 下記がPC用のソースです。 <form action="edit_url" method="POST" enctype="multipart/form-data"> <input type="file" name="Img" size="10"> </form> フォーム受け取り先で if(is_uploaded_file($_FILES['Img']['tmp_name'])){ //jpg,gif,png以外のファイルの場合はエラー if($_FILES['Img']['type'] != "image/pjpeg" AND $_FILES['Img']['type'] != "image/jpeg" AND $_FILES['Img']['type'] != "image/png" AND $_FILES['Img']['type'] != "image/gif"){ echo "エラー"; } } とすると「エラー」が表示されます。 $_FILES['Img']['type'] の中身を見ると 「application/octet-stream」 になっていました。 試してみた端末はandroid4.0の端末で、デフォルトブラウザを使用しました。 スマートフォンから画像をアップロードするには、 どのようにしたらよいのでしょうか。

    • ベストアンサー
    • PHP
  • php imagecopyresized(

    簡単掲示板を作成しようとしています。 画像のアップロード時のリサイズを行う imagecopyresized(がうまくいかず、黒い画像のまま保管されています。 サイズ「250*150」 ファイル形式「jpg,png,gif」 他のテストサイズは、ファイル形式全てうまくいきました。 「150*150」[300*150][400*400][400*150][800*800]ではうまくいきます。 どうしてなのかわからず困っています。 送り側: <FORM ENCTYPE = "multipart/form-data" ACTION = "up_set.php" METHOD = "post"> <INPUT TYPE = "file" NAME = "myf"> <INPUT TYPE = "submit" VALUE = "アップロード"> </FORM> 受け取り側: $file = $_FILES['myf']; $ima = date('YmdHis'); $fn = $ima.$file['name']; move_uploaded_file($file['tmp_name'], './img/' . $fn); $my_gaz = $fn; $motogazo = @imagecreatefromjpeg("./img/$fn"); list($w,$h) = getimagesize("./img/$fn"); $new_h = 200; $new_w = $w * 200/$h; $mythumb = imagecreatetruecolor($new_w, $new_h); imagecopyresized($mythumb, $motogazo, 0, 0, 0, 0, $new_w, $new_h, $w, $h); if($file['type']=='image/jpeg'){ imagejpeg($mythumb, "./img/thumb_$fn"); } if($file['type']=='image/png'){ imagepng($mythumb, "./img/thumb_$fn"); } if($file['type']=='image/gif'){ imagegif($mythumb, "./img/thumb_$fn"); } print $file['name'] . "のアップロード成功!<BR>" . "<IMG SRC='./img/thumb_$fn'>";

    • ベストアンサー
    • PHP
  • 正規表現の質問

    お世話になります。 PHPでの正規表現に関する質問です。 使っている教本の中に、次のようなコードがあります。 $files = new FilesystemIterator('.'); $files = new RegexIterator($files, '/\.(?:txt|csv)$/i'); foreach ($files as $file) { echo $file->getRealPath() . '<br>'; } これは、スクリプトと同じフォルダーにあるファイルの中で、.txt と .csv の拡張子のついたものだけを選択して表示するために、正規表現を使っているのですが、この中の ?: という部分の意味が分かりません。いろいろと正規表現に関する記事をネットで調べてみましたが、: コロンをメタ文字として扱っているものは見たことがありません。この ?: の役割を教えてください。お願いします。 ちなみに、これを取り去ってもちゃんと期待通りの結果が出ます。

    • ベストアンサー
    • PHP
  • サムネイルを2つ生成する方法

    PHP+MYSQLをつかって画像UP掲示板をつくっています。一覧ページにて投稿された画像をIMGタグで縮小しているのですが、転送量を減らす為もう一つ小さいサムネイルを作りたいと思っております。色々試してみたのですが初心者の為うまくいきません。 もしご存知の方がいらしゃいましたらヒントだけでも教えていただけないでしょうか。よろしくお願いいたします。 // 新規投稿された時の処理 if($_POST["q"] == '新規追加') { 省略 // エラーチェック switch ($_FILES["画像"]["error"]) { case UPLOAD_ERR_INI_SIZE: case UPLOAD_ERR_FORM_SIZE: error("サイズ制限を超えています。"); case UPLOAD_ERR_PARTIAL: case UPLOAD_ERR_NO_FILE: error("エラー"); } // ファイルサイズを再チェック if($_FILES["画像"]["size"] > 1024 * 100) { error("エラー"); } // gifとjpeg以外のファイルを拒否 if(!preg_match("/^image\/.*(gif|jpeg)$/i", $_FILES["画像"]["type"])) { error("エラー"); } // 特定の文字以外の文字を使用したファイル名を拒否 if(preg_match("/[^\w\d\-\.]/", $_FILES["画像"]["name"])) { error("エラー"); } // ファイルを移動 $ext = substr($_FILES["画像"]["name"],-4); $mictime = microtime(); $imagefile = substr($mictime, 11) . substr($mictime, 2, 6) . "$ext"; $upload_file = UPLOAD_DIR . $imagefile; if(move_uploaded_file($_FILES["画像"]["tmp_name"], $upload_file)) { chmod($upload_file, 0644); } 省略

    • ベストアンサー
    • PHP