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

ディレクトリ内の特定ファイルの表示と削除が出来るCGIを探しています。

「CGIScriptMarket」さんの「Web_Index」で出来るのですが、このままでは全部のファイル・下位ディレクトリを表示してしまうため使えません。改造が必要なのですが、良い方法が見つかりません。

表示したいのは「jpg」ファイルのみです。
そこで、消極的ですが、リスト振り分けを行っているであろう部分に(CGIの60行目当たり"foreach (@list) {"内に)
(($_ eq '.') or ($_ eq '..') or /\.cgi$/ or /\.htaccess$/ or /\.pl$/ or /\.dat$/ or /\.db$/) and next;
を追加しました。これで他のファイルは表示しなくなりましたが下位ディレクトリを表示してしまいます。
この方法ではなく、「jpgファイルだけを表示する」方法があるでしょうか?
素人的な文章だと
if(@list eq .jpg){表示する…}
これもおかしいですよね。eqだと"同じ"にならないとだめですよね。他にちゃんとした書き方があると思うのですが…

さらに、保存される画像を誰が消しても言いというわけではないです。IDとPASSによって入場した場所にこのCGIを設置します。
画像はIDと日付という組み合わせで保存されます。(0001-031013.jpgのような形)
そこで、ユーザーIDが入っている画像のみ表示するという機能も必要です。
仕方は上の方法とかぶるかもしれませんが、文字列の一部に含まれるものと比較する(この表現もおかしかったりして…)仕方も良くわかっていません。

以上2点ですが、説明不足かもしれません。何をしたいのかが良く伝わっていなければ補足お願いします。
よろしくお願いします。

A 回答 (4件)

以下の様にしてください。


まず、下記の文を(削除)コメントにします。
-----------------------------
#foreach (sort @dir_value) {
# if ($_ =~ /\.[^\.]+/) { push (@files,$_); }
# elsif ($_ ne '.' && $_ ne '..') { push (@list,$_); }
#}
#foreach (@files) { push (@list,$_); }
--------------------------------------
その後に、以下の文を追加します。
--------------------------------------
$uid = '0001'; #説明の為付加
--------------------------------------
@files = grep(-f,@dir_value); #ファイルのみを取り出す
@files = grep(/\.jpg$/,@files); #拡張子.jpgを取り出す
foreach (@files){ #ユーザIDの一致かつ次の文字が-のファイルだけを取り出す
if ($_ =~ m/^($uid)\-/) { push(@list,$_); }
}
@list = sort (@list); #名前をソートする
--------------------------------------------
$uidにはユーザIDが設定されているものとします。
この設定方法は、説明上$uid='0001'としましたが、この設定は、あなたが責任を持って行ってください。
ファイル名の先頭がユーザIDでかつ次の一文字が'-'であることを前提としています。ユーザIDは数字のみで構成されることを前提にしています。(-は含まれないこと)

この回答への補足

返答ありがとうございます。
無事指定のファイルだけ表示することが出来ました。
しかも、質問を載せ終わった後に気が付いた「もしも日付とユーザーIDが一緒になったら??」という点も"-"が付いたものがIDという形で処理する方法まで明記していただきありがとうございました。

さて、次の点ですが、ファイルの削除です。ない知恵を絞ってやってみたのですが、うまく出来ませんでした。

まずは、デリートモードが必要ですよね。
以下のようにやってみました。
著作権表示部分のすぐ下に、
require './jcode.pl';
を挿入。もちろんファイル「jcode.pl」を同フォルダにコピー
$script = "index.cgi";
を追加。

表示化開始される前の部分(スタイルシート表記の次)に
&decode;
if ($Mode eq "del"){ &del; }
を追加。
先ほどのリスト表示部分に
<a href=$script?mode=del&d_img=$_>[この画像を削除]</a>
を追加。

2つのサブルーチンを一番最後に追加。デコード文は他のCGIからのコピーです。
################ デコード ###################
sub decode {
local($buffer, $name, $value, @pairs);

if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else { $buffer = $ENV{'QUERY_STRING'}; }

@pairs = split(/&/, $buffer);

foreach (@pairs) {
($name, $value) = split(/=/);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
# S-JIS変換
&jcode'convert(*value, "sjis", "", "z");
$in{$name} = $value;
}
$mode = $in{'mode'};
}
################ デリート ###################
sub del{

# 写真削除
unlink("./$d_img");


print "Content-type:text/html\n";
print "Pragma: no-cache\n\n";
print "<html>\n<head>\n<title>$title</title>\n$style</head>\n$body\n";
print "<CENTER><h1>File Eraser</h1></CENTER>\n<hr noshade>\n";
print "<BR>\n";
print "画像削除終了\n";
print "</body>\n</html>\n";

exit;
}

サブルーチン「デリート」は、とりあえず用です。後で「この画像を削除しました」のようなサムネイルを表示したり、「編集画面に戻る」のようなボタンをつける予定です。

こうしてみましたが、消える気配も無くサブルーチンに移動している気配もありません。
何がいけないのでしょうか?

よろしくお願いします。

補足日時:2003/10/13 19:15
    • good
    • 0
この回答へのお礼

すみません補足です。
if ($Mode eq "del"){ &del; }

if ($mode eq "del"){ &del; }
じゃないとだめですよね。大文字小文字を間違えていました。
そのためちゃんと「画像削除終了」は表示しますが、削除がされていません。
修正すべき点がありましたらお願いします。

お礼日時:2003/10/13 19:30

No1です。


>そのためちゃんと「画像削除終了」は表示しますが、削除がされていません。
unlink("./$d_img");
この文は問題ありません。問題があるとすれば、$d_imgに正しく削除すべきファイル名がセットされているかです。
<a href=$script?mode=del&d_img=$_>[この画像を削除]</a>
で行っているように見えますが、ここの意味がよくわかりません。CGI自体はよく解りませんのでなんとも、言えないのですが、&d_img=$_で$d_imgに$_の内容が設定されるのでしょうか。また、$_は、foreach文などで使用された時のループ中の暗黙の変数名です。この文は、そうした中で使用しているのでしょうか。
また、削除しようとしているのは選択された1つのファイルだけでしょうか。それとも表示された全てのファイルでしょうか。
    • good
    • 0

No1です。


>そのためちゃんと「画像削除終了」は表示しますが、削除がされていません。
unlink("./$d_img");
この文は問題ありません。問題があるとすれば、$d_imgに正しく削除すべきファイル名がセットされているかです。
<a href=$script?mode=del&d_img=$_>[この画像を削除]</a>
で行っているように見えますが、ここの意味がよくわかりません。CGI自体はよく解りませんのでなんとも、言えないのですが、&d_img=$_で$d_imgに$_の内容が設定されるのでしょうか。また、$_は、foreach文などで使用された時のループ中の暗黙の変数名です。この文は、そうした中で使用しているのでしょうか。
また、削除しようとしているのは選択された1つのファイルだけでしょうか。それとも表示された全てのファイルでしょうか。

この回答への補足

>、&d_img=$_で$d_imgに$_の内容が設定されるのでしょうか。
>$_は、foreach文などで使用された時のループ中の暗黙の変数名です。この文は、そうした中で使用しているのでしょうか。

その通りです。画像を数枚用意して頭の部分(IDの部分ですね)を同じに、日付を変えて保存してみました。
<a href=$script?mode=del&d_img=$_>[この画像を削除]</a> はファイル名を表示する後ろに表示するように設定しているのでちゃんと繰り返していますし、IDもちゃんと変化しています。
このことからわかっていただけると思いますが、削除するのは1つずつのファイルです。
各ファイルのサムネイルを表示、その隣にファイル名・サイズ・最終更新日、その隣に上記[この画像を削除]ボタンを配置しています。

全ソースを載せたほうが良いでしょうか?

補足日時:2003/10/13 21:47
    • good
    • 0

><a href=$script?mode=del&d_img=$_>[この画像を削除]</a> はファイル名を表示する後ろに表示するように設定しているのでちゃんと繰り返していますし、IDもちゃんと変化しています。


ここの文での不明点は、
1)&d_img=$_ ではなく、$d_imgでは無いでしょうか。
2)繰り返し中で$d_imgに$_をセットした場合、最後の$_のみがセットされませんでしょうか。
この文は、削除ボタンが押下される前に画面に表示しているところで、呼び出しているように見えます。
削除ボタンが選択された時に、その削除ボタンに該当するファイル名を$d_imgにセットすべきだと思うのですが・・・。
>ソースを載せたほうが良いでしょうか?
$d_imgにファイル名を設定しているところの前後の文を提示していただけませんでしょうか。
また、念の為、$_imgの内容をsub delの中で(一時的にでも)だすようにして、$_imgが、削除すべきファイルがセットされているか、確認したほうがよいと思います。(万一、削除の権限がなくて、ファイルが削除できないこともありますから)

この回答への補足

今まで返答ありがとうございました。
お礼に追加の質問を書き込みましたが、返答がいただけなかったようです。
回答が急いで必要になってしまったので、再度質問をあげさせていただきます。

返答ありがとうございました。

補足日時:2003/10/17 14:59
    • good
    • 0
この回答へのお礼

返答遅れてすみません。
あれからいろいろとやった結果、上記の件に関しては解決しました。
しかし、新たな問題が発生してしまいました。

CGIをちゃんと分けるため1個上のディレクトリに移動してみたのですが、正常に動かなくなってしまいました。
opendir DIR,"./";
@dir_value = readdir DIR;
close (DIR);
この部分だと思うのですが、画像が入っているのはこのディレクトリ内の「img」ディレクトリです。
普通に考えて「opendir DIR,"./img";」としてみてもCGIがあるディレクトリを表示してしまいます。
他にも「./img/」「/img」「/img/」もやってみましたが全滅です。
下位ディレクトリを表示させるのには他に方法があるのでしょうか?

よろしくお願いします。

お礼日時:2003/10/16 18:29

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