質問 |
||
| 質問者:mm666 | サーバー内のファイルに対するアクセス制限 | |
|---|---|---|
困り度:
|
IDとパスワードを入力すると利用出来る会員制のページがあります。 認証は、クッキーとMySQLを駆使して行っています。 ログインすると、ダウンロードコーナーがあり、lzhファイルをダウンロード出来ます。 ところが、このlzh自体は直接URLを打ち込まれると、ログインしていない人でも簡単に取得出来る状態です。 lzhファイルのあるフォルダに「.htaccess」でアクセス制限をかければいいかとも思いますが、これではわざわざログインしているのに更にログインが必要になりおかしな感じになってしまいます。 普通に置いてあるlzhに対して、どのように制御する方法があるでしょうか? 宜しくお願い致します。 |
|
質問投稿日時:08/04/15 15:54 質問番号:3951011 |
||
回答 |
|
| 回答者:ralf124c | 0バイトダウンロードはファイル読み込みの権限がない場合に発生します。 FUTOMIのサーバアナライザなどであなたのWebサーバがブラウザ経由でどのユーザ権限でアクセスしているのかをチェックして権限を設定してください。 最低でも「644(rw-r--r--)」かなと思います。ただファイルの権限がそうでも、それより上のディレクトリに読み込み権限がなければたどりつけませんが・・・。 ご確認ください。 |
|---|---|
| 種類:アドバイス どんな人:専門家 自信:参考意見 |
|
| |
回答日時:08/04/17 10:02 回答番号:No.6 |
|
| この回答へのお礼 | ralf124cさま、アドバイスをありがとうございます。 権限は大丈夫でした。 私が指定階層を間違えていました。 ファイルも読めていなかったはずです。(エラーにはならなかったのは?でした) ralf124cさまのプログラムで一気に解決しました。 本当にありがとうございました。 |
回答良回答20pt |
|
| 回答者:ralf124c | いろいろと回答が出ているようですのでファイルの置き場所と理由についてはお分かりと思います。 CGIコードは非常に簡単なので以下に示します。 ↓ここから #!/usr/bin/perl ## 目的ファイルのファイル名 my $fname = "test.lzh"; ## 目的ファイルのパス付きファイル名(HTTPアカウントでアクセスできるところ) my $fn="/home/test/".$fname; ## HTTPヘッダ print "Content-type: application/octet-stream\n"; print "Content-Disposition: attachment; filename=".$fname."\n\n"; ## バイナリモードでファイルを開いてバイナリ指定の標準出力にプリント open(IN01,$fn) || &error("Can't open $fname"); binmode IN01; binmode STDOUT; while(my $DT=<IN01>){ print STDOUT $DT; } close(IN01); ↑ここまで このCGIでは「/home/test/」がHTTPの権限で参照できる環境であることが前提ですので あなたの環境に合わせて設定してください。 |
|---|---|
| 種類:アドバイス どんな人:専門家 自信:参考意見 |
|
| |
回答日時:08/04/16 20:36 回答番号:No.5 |
|
| この回答への補足 | すみません、どこに書いたらいいのか分からず補足に書かせてもらいました。質問者のmm666です。 教えて頂いたプログラムで成功しました! 単純に「## 目的ファイルのパス付きファイル名(HTTPアカウントでアクセスできるところ)」を間違えていました。 存在しないファイルを指定していたのですが、ファイルオープンでエラーになっていなかったので気付くのが送れました。(焦っていてすみません) たまに、何かの拍子にファイル保存ウィンドウが出るのではなく、ブラウザにコード?が書き出されてしまう時があります。 これはどんな時に起きてしまうのでしょうか。 一旦ブラウザを閉じ、再度アクセスすると上手く行きます。 どんな時にこの症状が出るのか定かではないのですが… (プログラムも、読み込むファイルも同じ状態です) 何度も何度もやっていたからかもしれませんね。 今はずっと上手く行っているので、これでGO出来ます。 本当にありがとうございました。 |
| この回答へのお礼 | ralf124cさま、詳しい説明をありがとうございます。助かります。 「application/octet-stream」というものをよく知りませんでした。 早速実験してみましたが、どうしても0バイトで保存されてしまいます。 エラーが出ないのでファイルはオープン出来ているとは思うのですが私の環境では保存がうまくされていません。 環境のせいかと思うので、もっと調査してみようと思います。 ありがとうございます。 |
回答 |
|
| 回答者:t-okura | すでに出ている回答でよいと思いますが、参考 URL のような form 認証 もあります。 この form 認証を使うと、直接 ダウンロードしようすると、認証画面に 飛ばされます。 |
|---|---|
| 種類:アドバイス どんな人:専門家 自信:参考意見 |
|
| |
回答日時:08/04/16 00:51 回答番号:No.4 |
|
| 参考URL: | http://module.jp/blog/authentication_from_apache.html |
| この回答へのお礼 | t-okuraさま、ありがとうございます。 このような素晴らしいものがあったんですね。 イチから作るプログラムであれば、ぜひ利用したかったです。 今回はすでに稼働中のものなので、認証部分を大幅に改造出来ないという事があり利用は難しいのが残念です。 情報をありがとうございます。とても助かります。 |
回答 |
|
| 回答者:gmataw | No.2です。 > 実験しているのですが、どうしても「ページが見つかりません」とlzhに > アクセス出来ない状態になっています。 えっと、先程提示したディレクトリ構成ですとWEBからはアクセス出来ません。 というか、アクセス出来なくするのが狙いです。 1.通常のWEBアクセスは遮断 2.download.phpの様なダウンロード処理プログラムを作成 で、download.phpからしかアクセス出来ない仕様にします。 プログラムは、 1.apacheユーザー(PHP/Perl)等からのアクセス権限を付与 2.ユーザー認証 3.ファイルを読み込み 4.出力 の処理を実装する事になるかと思います。 |
|---|---|
| 種類:回答 どんな人:専門家 自信:自信あり |
|
| |
回答日時:08/04/15 18:22 回答番号:No.3 |
|
| この回答へのお礼 | gmatawさまありがとうございます。 やっとメンテナンスが終わって見させて頂いてます。 Locationでアクセス出来なくて当然ですよね、頭から間違っていました。 ファイルを読み込んで出力するという事は、やはりWebからアクセス出来る場所にファイルをコピーする事になるという感じでしょうか。 それともファイルを書き込まなくてもユーザはダウンロード可能になるのでしょうか? 理解力がなくて何度も質問して申し訳ありません。 |
回答良回答10pt |
|
| 回答者:gmataw | 内容的にはNo.1さんと同じですが、もう少し詳しく書くと... apaccheのドキュメントルートが/var/www/html/だと仮定すると、 以下の様なディレクトリ構成になっているかと思います。 /var/www/ + html/ [APACHE_DOCUMENT_ROOT] + index.html + hoge.html + download.php + archives/ + hoge.lzh + foo.lzh 上記のarchives/配下にダウンロード用のファイルを配置すると 通常のWEBアクセスからはアクセス出来ない状態です。 この状態で、例えばdownload.php等のダウンロード実行ファイル を作成して、archives/配下の任意のファイルにアクセスして ダウンロード機能を実装すればよいかと思います。 |
|---|---|
| 種類:回答 どんな人:専門家 自信:自信あり |
|
| |
回答日時:08/04/15 17:25 回答番号:No.2 |
|
| この回答へのお礼 | gmatawさま、詳しい説明をありがとうございます。 実験しているのですが、どうしても「ページが見つかりません」とlzhにアクセス出来ない状態になっています。 ディレクトリの権限などの関係でしょうか、単純にアクセス方法を間違えているのか、階層を間違えているのか、 もう一度じっくりやってみます。 取り急ぎ、お礼を言いたくて書かせて頂きました。 |
回答 |
|
| 回答者:ralf124c | ファイルはHTTPから見えない場所において CGIを元のファイルのリンク先にし、そのCGIでは実行時にクッキーをチェックしてファイルを渡すかどうかを判断させる。 でどうでしょうか? |
|---|---|
| 種類:アドバイス どんな人:専門家 自信:参考意見 |
|
| |
回答日時:08/04/15 16:33 回答番号:No.1 |
|
| この回答へのお礼 | ralf124cさま、早速のご回答ありがとうございます。 この場合、クッキーチェックでOKであればLocationでlzhに飛ばすような感じでしょうか? HTTPから見えない場所のファイルに飛ばす事は可能なのでしょうか? 実験してみたいと思います。 |