Web上のPDFファイル等にセキュリティをかけるには?

[上に] [前に] [次に]
フシギダネ 2000/03/09(木) 17:48:31
Web上にあるPDFファイル等をブラウザで見る時に、ログインしていないと参照出来ないようにするにはどうしたらいいでしょうか?
かつ、ログインIDによってレベル分けし、レベル1の人は見れるがレベル2の人は見れないようにしたいのですが。
HTMLなら、Cookie等で可能と思いますが、PDFファイルとなると・・・。

EMI 2000/03/09(木) 18:18:52
CGIをラッパーに使えば可能かと思いますが、「ログインしていないと」と言うことはダウンロードされると困るんでしょうか?
あるいは、ActiveXを使うという手もあるかもしれませんが、よくわかりません。

フシギダネ 2000/03/09(木) 18:47:52
>EMIさん
>CGIをラッパーに使えば可能かと思いますが
???
CGIラッパーというのは聞いた事ありますが、
具体的にはどうやってどうするのでしょうか?
全くわかりません。
なんせ無知なもので・・・。
わかりやすく教えていただけませんか?

EMI 2000/03/09(木) 18:59:24
大まかに書くと、こんな感じ。

#!/usr/local/bin/perl

unless(#ユーザー認証){
  #エラー画面表示
  exit;
}

print "Content-Type: application/pdf\n\n";  #すいません、PDFファイルのMIMEタイプ知りません。

#PDFファイル出力処理

__END__

ええと、これで理解できたでしょうか?
要するに、間にCGIをかませることによってユーザー認証を行い、それがうまくいったらPDFファイルを出力させると言うことなんですが。

フシギダネ 2000/03/09(木) 19:23:09
ありがとうございます。
なんとなく理解できました。
が、これだとURL直接入力された場合(http;//xxx.yyy.xxx/aaa.pdf)、表示されてしまう気がするのですが。
いかがでしょう?

EMI 2000/03/09(木) 19:33:41
pdfファイルを分割するとか、URIの通ってないディレクトリに格納するなどの方法で回避できます。
他にもいくつか方法はあるでしょう。
「直リンク」なんかで検索かけてみるといいかもしれません。

フシギダネ 2000/03/09(木) 19:48:30
>URIの通ってないディレクトリに格納するなどの方法
なんとなく分かって来ました。
つまりは、pdfファイルをCGIのメモリーに取り込んで、Content-Type application/pdfで出力するという事でしょうか?

にゃあ 2000/03/10(金) 05:28:51
分割して、1部分をCGIの中に組み込んでおくとかはどうでしょうか?
(更新が面倒かな…)

にゃあ 2000/03/10(金) 05:33:09
うぅぅ、ちょっと解りにくい… 補足です。

PDFも、圧縮がかかっているのならば、
途中の部分が消えてしまえば解凍が不可能に成ると思います。
さらに、どこから切断したのか解らないなら、ほぼ完璧な
セキュリティーになると思います。

□□□□□■□□□□□

こういうデータの■を抜き出して
これをCGI内に組み込んでおく。
□□□□□□□□□□ では解凍も出来ないし、
CGIを使わなければ■の位置もわからない。

という寸法です。

Fuji.♪ [E-Mail] [HomePage] 2000/03/10(金) 09:37:02
ログインが必要ということですから、それこそ.htaccessなどでアクセスコントロールをかけるのが楽なのでは?

フシギダネ 2000/03/11(土) 13:21:17
>ログインが必要ということですから、それこそ.htaccessなどでアクセスコントロールをかけるのが楽なのでは?
ログインID=UNIXアカウントではない為、ちょっと厳しいのでは?
と思うのですが。

びーだま [E-Mail] 2000/03/11(土) 13:24:52
> >ログインが必要ということですから、それこそ.htaccessなどで> アクセスコントロールをかけるのが楽なのでは?
> ログインID=UNIXアカウントではない為、ちょっと厳しいのでは?
> と思うのですが。

いいえ、.htaccess で設定できる ID は別に UNIX アカウントで
なくても、なんでも良いです。ローカルで別個に利用できますよ。

# .htaccess は、Apache という前提ですか?

びーだま [E-Mail] 2000/03/11(土) 13:30:59
> >URIの通ってないディレクトリに格納するなどの方法
> なんとなく分かって来ました。
> つまりは、pdfファイルをCGIのメモリーに取り込んで、Content-> Type application/pdfで出力するという事でしょうか?

うーん、ちょっと勘違いしているかも。

> >URIの通ってないディレクトリに格納するなどの方法

というのは、ドキュメントルート配下から外して、WEBとして
見ることの出来ない(アクセスできない)位置に置くという
ことです。

CGIの中からなら、ドキュメントルート配下にファイルが無く
ても、サーバ内のファイル位置を指定することでアクセスでき
ますからね。

この場合は、ファイルに特別な加工を施して置く必要はありません。

あとは、CGIからその内容を、Content-Type application/pdf
として送出してあげればよい。ということですね。

フシギダネ 2000/03/11(土) 19:25:08
>というのは、ドキュメントルート配下から外して、WEBとして
>見ることの出来ない(アクセスできない)位置に置くという
>ことです。
>
>CGIの中からなら、ドキュメントルート配下にファイルが無く
>ても、サーバ内のファイル位置を指定することでアクセスでき
>ますからね。
そう理解しています。

>あとは、CGIからその内容を、Content-Type application/pdf
>として送出してあげればよい。ということですね。
念の為、確認。
バイナリで読み込んで、標準出力に書き出せばいいって事ですよね。

びーだま [E-Mail] 2000/03/11(土) 19:36:19
>> あとは、CGIからその内容を、Content-Type application/pdf
>> として送出してあげればよい。ということですね。
> 念の為、確認。
> バイナリで読み込んで、標準出力に書き出せばいいって事ですよね。

あまりやらない方法なので、私が答えるのもなんですが、

UNIX なら

open (FH, "$file") | die;
while (<FH>) {
print;
}
close(FH);

Win32 なら、open のあと、binmode とか、すれば良いのでは?
間違っていたら、だれかフォローください。

びーだま [E-Mail] 2000/03/11(土) 19:37:24
open (FH, "$file") || die;

の誤りです。ごめんなさい。

にゃあ 2000/03/13(月) 07:42:20
少々面倒ですが、
パスワードZIPかなにかでPDFを圧縮してはどうでしょうか?
レベル2な人しか、そのパスワードを教えない…

だけどなぁ… 世の中にはZIPファイルを無理に開くソフトも
ありますからねぇ〜(汗)

フシギダネ 2000/03/13(月) 18:21:32
あと、.htaccessなんですが、

>びーだまさん
>いいえ、.htaccess で設定できる ID は別に UNIX アカウントで
>なくても、なんでも良いです。ローカルで別個に利用できますよ。

ちなみにユーザは1万人位でDB(オラクル化)されています。
こいつとの連携なんて出来るんですか?

ふじ 2000/03/13(月) 20:25:07
>open (FH, "$file") | die;
>while (<FH>) {
>print;
>}
相手がバイナリファイルだと分かっているなら、こういう書き方はしないで、

open FH, "< $file";
while(read(FH, $buf, 4096)){
    print $buf;
}

のようにした方が良いでしょう。(4096 は、一度に読み込むバイト数。適当に)
<FH> だと、\n が現れるまで際限なくデータを $_ に読み込んでしまいますから。

> ちなみにユーザは1万人位でDB(オラクル化)されています。
> こいつとの連携なんて出来るんですか?
多分出来ますけど、Apache にモジュールを組み込んだり、
再コンパイルする必要があったりするかも(詳しくは知らない(^^;)

Apache に手を入れないなら、Perl で
DBI
DBD::Oracle
を使って Oracle に問い合わせれば良いのでは。
http://member.nifty.ne.jp/hippo2000/perltips/index.htm
ここなど参考に。

じぇろにも 2000/03/13(月) 23:07:30
http://www.macomnet.ru/~oskin/mod_auth_oracle.html

フシギダネ 2000/03/14(火) 19:44:04
皆様いろいろありがとうございました。
print "Content-type: application/pdf\n\n";
open FH, "< $file";
while(read(FH, $buf, 4096)){
        print $buf;
}
で解決とさせて頂きます。

フシギダネ 2000/03/14(火) 19:44:37
[[解決]]
解決チェック忘れてました。

[上に] [前に] [次に]