参照制限のその後

[新着] Webテンプレートを仮オープンしました



0   名前: けろ : 2007/03/11(日) 20:46  ID:aEXzOG7c sub-tS
http://www.tagindex.com/cgi-lib/q1bbs/patio.cgi?mode=view&no=2925
上記「htaccessで参照制限」について、問い合わせた際は、ご丁寧にご指導
くださいまして本当にありがとうございました。
SetEnvIf Request_URI "/html/(index\.html)?" Ref1
SetEnvIf Referer "abcdef.jp/html/" Ref2
order deny,allow
deny from all
allow from env=Ref1
allow from env=Ref2

で参照制限は出来たのですが、今度はこの参照制限にプラスして、
「特定のIPまたはホストからのアクセスを拒否する」といった場合についての
記述についてお訪ねします。
上記の参照制限のhtaccessと一緒に、
SetEnvIf Request_URI "/html/(index\.html)?" Ref1
SetEnvIf Referer "abcdef.jp/html/" Ref2
order deny,allow
deny from all
allow from env=Ref1
allow from env=Ref2
order allow,deny
allow from all
deny from 111.222.333.
deny from yahoo.co.jp

または
SetEnvIf Request_URI "/html/(index\.html)?" Ref1
SetEnvIf Referer "abcdef.jp/html/" Ref2
SetEnvIf Remote_Addr "111\.222\.333\." Ref3
SetEnvIf Remote_Host "yahoo\.co\.jp" Ref3

order deny,allow
deny from all
allow from env=Ref1
allow from env=Ref2
deny from env=Ref3

などと、試してみましたが、なかなか
「参照制限をしつつ、特定のIPまたはホストからのアクセスを拒否」
をする事ができません。
お力をお借りしたく、ご回答を宜しくお願い致します。

1   名前: 元帥 : 2007/03/11(日) 20:46  [URL]  ID:Azc7Go/r sub-bK
以下でどうでしょうか。
SetEnvIf Remote_Addr "111\.222\.333\." !Ref1 !Ref2
SetEnvIf Remote_Host "yahoo\.co\.jp" !Ref1 !Ref2
指定された条件を満たす時、設定された環境変数を無効にするというものです。
これでいけるかと。

参考
http://httpd.apache.org/docs/2.0/ja/mod/mod_setenvif.html#setenvif

2   名前: けろ : 2007/03/11(日) 20:46  ID:ML/gjhmn sub-tS
元帥さん、前回も今回もご丁寧にありがとうございます。
さて、ご回答がありました記述で試した結果をご報告致します。

まず、「1つのhtaccessで参照制限をしつつ、特定のIPなりホストを拒否したい」
との事での記述ですが…。私は「以下のようにするという意味かな?」と思って
行ってみました。
SetEnvIf Request_URI "/html/(index\.html)?" Ref1
SetEnvIf Referer "abcdef.jp/html/" Ref2
SetEnvIf Remote_Addr "111\.222\.333\." !Ref1 !Ref2
SetEnvIf Remote_Host "yahoo\.co\.jp" !Ref1 !Ref2
order deny,allow
deny from all
allow from env=Ref1
allow from env=Ref2

ちなみに、テスト環境なので「Remote_Addr」については「111\.222\.」で行い、
「Remote_Host」について、ネットに接続時の自分のホスト名を入力しました。
結果は「アクセスが出来てしまう」という事になりました。

私が、テストを行う前に、こちらの掲示板で元帥さんからのご回答を拝見した時、
「あれ、これってアクセスできちゃう方向じゃない?」と思った点があります。

それは、
SetEnvIf Remote_Addr "111\.222\.333\." !Ref1 !Ref2
の「!Ref1 !Ref2」は
allow from env=Ref1
allow from env=Ref2
つまり「allow=許可」してしまうという意味ではないかな?と思って。
(私の誤解もあるかもしれません)
という事で、ご回答の記述で試した結果は、アクセス出来てしまったわけです。

ご連絡、お待ちしています。

3   名前: けろ : 2007/03/11(日) 20:46  ID:ML/gjhmn sub-tS
追伸です。

サーバーのバージョンは「***(※)」との事です。
***(※)とは、プロバイダ側で詳しいバージョンを伏せ字にしています。
(なんでも、セキュリティ対策のためとか…)

SSIは利用可能なので、SSIを使ってApacheの詳しいバージョンを知る
方法があれば、試した結果をご連絡できますが…。

元帥さんが今回ご回答くださった「!Ref1 !Ref2」の「!」とは、
「この条件以外」という意味になるのですか?。
で、私は「もしかしたらApacheのバージョンが古いから機能しないのかな?」と
考えたわけでして…。

---
(※)投稿者の希望により、記事の一部を修正しました。
by 管理人
---

4   名前: けろ : 2007/03/11(日) 20:46  ID:ML/gjhmn sub-tS
度々すみません。
結果です。
SetEnvIf Request_URI "/html/(index\.html)?" Ref1
SetEnvIf Referer "abcdef.jp/html/" Ref2
SetEnvIf Remote_Addr "111\.222\.333\." !Ref1 !Ref2
#SetEnvIf Remote_Host "yahoo\.co\.jp" !Ref1 !Ref2
order deny,allow
deny from all
allow from env=Ref1
allow from env=Ref2

で、まず「Remote_Host」にはコメントとして…、「Remote_Addr」だけで
試しました。私が、ネットに接続時のIPアドレスです。
そしたら、「Forbidden」でアクセス拒否が出来ました!。
ありがとうございます。m(_ _)m

がしかし、今度は「Remote_Addr」をコメント(行頭に#)として、
「Remote_Host」は行頭の#を取って、そこに私がネットに接続時のホスト名を
入れてみました。
「xxxxx\.ne\.jp」にしてみたり、「xxxxx.ne.jp」にしてみたりしましたが、
ホスト名だとアクセスが出来てしまいました。なぜでしょう…(^_^;)

5   名前: 元帥 : 2007/03/11(日) 20:46  [URL]  ID:xIQujz8/ sub-bK
考えられる原因として二点。
・入力ミス
ないとは思いますが、一応念のため。
aaa.jpと思っていたものが実はbbb.jpだった等。
確認くん:
http://www.ugtop.com/spill.shtml

・ホスト名を取得できない
Remote_Hostで取得したものが、変換されずにIPアドレスのままであるかもしれません。
以下のサンプルCGIをサーバにアップして、ブラウザーで見てください。もし何も表示されなければNGです。ホスト名(場合によってはIPアドレス)が表示されればOKです。
#!/usr/local/bin/perl
print "Content-Type: text/html\n\n";
print "$ENV{'REMOTE_HOST'}";
http://www.futomi.com/lecture/htaccess/allow_deny.html

6   名前: けろ : 2007/03/11(日) 20:46  ID:ML/gjhmn sub-tS
元帥さん、ご連絡ありがとうございます。
ご連絡を頂戴する前に、私のほうでも
www.ugtop.com/spill.shtml にアクセスをして確認をしていました。
ホスト名は正しく入力しております。

また、www.futomi.comさんのページにある、「REMOTE_HOST」を確認する
ファイルをサーバーにアップして確認してみましたが、レンタルサーバー側でも、
プロバイダのサーバー側の両方で、このCGIを使ってREMOTE_HOSTを取得する事は
できませんでした。

ちなみに、レンタルサーバー側もプロバイダのwwwサーバー側もSSIを許可しています。
また、レンタルサーバー側もプロバイダのwwwサーバー側も、「掲示板」での利用で、
書き込んだ際に、「IPアドレス、ホスト名」の取得は可能になっています。
なぜ、このスクリプトだと'REMOTE_HOST'が表示されないのでしょう…。

7   名前: けろ : 2007/03/11(日) 20:46  ID:ML/gjhmn sub-tS
レンタルサーバー側で利用できるのは以下の環境変数のみだそうです。
 
***(※)

また
REMOTE_HOST 環境変数を用いて、接続元ホスト名を取得することは可能です。
REMOTE_ADDR 環境変数を用いて、接続元ホストのIPアドレスを取得することは可能です。 
※ただし、相手側ホストにて、逆引きが設定されていない場合は、接続元ホスト名を取得することはできません。

1) HTMLが置かれているディレクトリ以下のコマンドのみ呼び出せます。コマンドパス
 が張ってある場合も同様です。 
2) 絶対パスのコマンドは呼び出せません。 /bin/echo や /bin/date も直接の呼び出し
 はできません。 
3) 引数はつけても無視されます(引数は機能しません)。 
  例: <!---#exec cmd="test abc" --> と書いても引数 abcはtest というコマンド
  に渡されません。exec cgi= も同様です。URL の引数も渡されません。 

との事です。

---
(※)投稿者の希望により、記事の一部を修正しました。
by 管理人
---

8   名前: けろ : 2007/03/11(日) 20:46  ID:ML/gjhmn sub-tS
futomiさんのCGIではありませんが、HTMLファイルに以下の記述して試しました。
<!--#echo var="REMOTE_HOST"--><br>
<!--#echo var="REMOTE_ADDR"-->
そしたら、
REMOTE_HOSTは、(none)
REMOTE_ADDRは、IP
が出ました。やはり、ホスト名で拒否するのは出来ないという事でしょうか?。

9   名前: 元帥 : 2007/03/11(日) 20:46  [URL]  ID:xIQujz8/ sub-bK
もしかしたら「確認くん」では自前で変換を行っていたのかもしれませんね。
契約先に、IPアドレスを返すのか、ホスト名を返すのか、問い合わせてみてはどうでしょうか。
もし、負担のために変換を行っていないと返答されたら、CGI等を用いてページを作成、CGI内で変換処理を行う必要があります。

といっても、拒否したいホスト先がホスト名を返していてくれれば良いので、実用上は問題ないと考えて宜しいのではないでしょうか?

10   名前: けろ : 2007/03/11(日) 20:46  ID:XCo8r3GL sub-tS
元帥さん、ご連絡ありがとうございます。
ホスト名で拒否は出来ないという事は「確実」(私が利用しているサーバーでは)
なので、IPアドレスで拒否をする事にしますね。
ご迷惑をお掛けいたしました。

それと、元帥からのご回答をもって、このスレッドは管理者様にお願いをして、
削除して頂く事にします。なにせ、「7」でプロバイダの情報を載せていますので。
ご理解頂ければ幸いです。

11   名前: けろ : 2007/03/11(日) 20:46  ID:.pGgTf29 sub-tS
今回は「MP3が再生されない」についてです。
htaccessの記述は、このスレッドの >>4 です。

MP3ファイルを置くのに、以下のタグで貼り付けをしています。
<object id="MediaPlayer1" classid="clsid:22D6F312-B0F6-11D0-94AB-0080C74C7E95" width="280" height="45" standby="Loading Microsoft Windows Media Player components..." type="application/x-oleobject">
<param name="SRC" value="file1/BGM.mp3">
<param name="AUTOSTART" value="false">
<param name="CONTROLS" value="ControlPanel">
<param name="CONSOLE" value="cons">
<param name="NOLOGO" value="true">
<param name="ShowDisplay" value="false">
<embed type="audio/mp3" src="file1/BGM.mp3" autostart="false" width="280" height="45" controls="ControlPanel" console="cons" nologo="true" showdisplay="false"> </embed>
</object>

すると、コントロール(?)の画面が出るのですが、再生をクリックしても、
全く再生されません。そこで、htaccessの記述を以下のようにしました。
SetEnvIf Request_URI "/html/file/($\.html)?$" Ref1
SetEnvIf Referer "$" Ref2
order deny,allow
deny from all
allow from env=Ref1
allow from env=Ref2

すると、MP3は再生されます。がしかし、「SetEnvIf Referer」を「$」にして
いるため、IEの「履歴」に「BGM.mp3」と履歴が残り、それをクリックすると、
Windows Media Playerが起動し、サイトまでファイルを読み込みにいって
再生されてしまいます。これでは、「直リンク禁止」の意味がなくなって
しまって、「どうすれば回避できるかな?」と考え込んでおりました。

ちなみに、mp3を置いているディレクトリの中に、上記2番目に記述をした
htaccessを設置しています。

また、「file2」のディレクトリの中にはhtaccessを設置せずに(という事は、
記述 >>4 の指示になる)、Flashのファイルを置いています。
Flashの再生する時のタグは以下のようにして貼り付けています。
その場合、IEの「履歴」に「貼り付けたFlashファイル(Flash.swf)」は表示されません。
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0" width="536" height="357">
<param name="movie" value="file2/Flash.swf">
<param name="quality" value="high">
<embed src="file2/Flash.swf" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="536" height="357"></embed>
</object>

これは、MP3を貼り付けるタグに問題があるのでしょうか。
それとも、MP3を貼る場合は、ページ内にタグを埋め込んでも、
リファラ(参照元制限 >>4 )は無効になってしまうのでしょうか。
ご連絡、お待ちしています。

12   名前: 元帥 : 2007/03/11(日) 20:46  [URL]  ID:UIR/ZJ6T sub-bK
MediaPlayerプラグイン使用の場合、MediaPlayerに処理を委譲するが、Flashに関してはブラウザが自分に埋め込まれているプラグインを利用して再生処理を行っている。
とか考えられませんかね。
それならば、初めて起動されるMediaPlayerにリファラはありません。
そこでリファラ取得の有無を確認してはどうでしょうか。

CGIファイル:get_referer.cgi
#!/usr/local/bin/perl
open FILE,">>test.txt";
$t = time();
print FILE "$t: $ENV{'HTTP_REFERER'}\n";
close FILE;
print "Location: BGM.mp3\n\n";

HTML
value="file1/get_referer.cgi"
src="file1/get_referer.cgi"


> その場合、IEの「履歴」に「貼り付けたFlashファイル(Flash.swf)」は表示されません。
この場合、HDD上のファイルをダブルクリック等で開くのとほぼ同等の行為になりますが、swf形式のファイルを開くデフォルトのアプリケーションは設定されていますか?

13   名前: けろ : 2007/03/11(日) 20:46  ID:.pGgTf29 sub-tS
元帥さんご連絡ありがとうございます。
さて、test.txtファイルに書き出された物ですが以下です。
1173556846: 
1173556847: 
特に、ホスト名とかIPとかではありませんでしたけど、この数字だけで
何か判明するのでしょうか…。

14   名前: 元帥 : 2007/03/11(日) 20:46  [URL]  ID:lkOftW/W sub-bK
数字は目安として、単なる時間です(確か、1970年1月1日からの経過秒だったと思います)。

コロン以降にリファラが入る予定でしたが、残念ながらリファラは取得できていないと考えられます。
Flashの方でも同様の実験をすれば、多分、リファラを返してくれると思うので再生が可能だったと思うのですが。

WindowsMediaPlayerではなく、QuickTime、又は他のプラグインを使うか、或いは直接リンクをはる。
リファラによって判断をするのではなく、CGI等を併用するといった解決策が考えられます。

15   名前: けろ : 2007/03/11(日) 20:46  ID:.pGgTf29 sub-tS
元帥さん、ご回答ありがとうございました。
私はMedia Playerを推奨してBGMを置いているので、
残念ながら、「直リンクされても仕方ない」といった
方向で運営していこうと思います。
ありがとうございました。

一覧へ戻る