質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

8回答

26523閲覧

特定のPHPファイルへの直リンクを禁止する方法

tarotarosu

総合スコア114

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

4クリップ

投稿2016/08/01 04:45

###前提・実現したいこと
notshow.phpというPHPファイルがあります。このファイルはリンク元がindex.htmlだった場合のみ表示され、かつ直リンクを禁止し、直リンクされた場合は専用のページにリダイレクトする、という処理を以下のコードをnotshow.phpの頭に記述することで実現してみました。

###該当のソースコード

php

1//notshow.phpへの直リンク禁止 2if (empty($_SERVER["HTTP_REFERER"])) { 3 //リダイレクト 4 header('Location: リダイレクトさせたいページのURL'); 5}

挙動としては一応意図したとおりに動きました。しかし、このようにすることで直リンクを禁止したとしても、セキュリティ的に他に問題がないのか心配です。
(例えば、この場合ですとリンク元はどこからでもアクセス可能ですよね?(index.html以外にnotshow.phpへのリンクは載せていないので問題ないとは思っているのですが…))
何か危険な点がございましたらご指摘いただけると非常に助かります_(..)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答8

0

リファラーの偽装について補足させてください。偽装の可否は以下のようになります。

閲覧しようとしている当人: リファラーの偽装が可能
閲覧しようとする人は別人: リファラーの偽装は不可能

つまり、悪い人がサイトを作って、notshow.php への直リンクを貼ったとして、そのサイトを閲覧した人が自らリファラーを偽装することは可能ですが、そうするシチュエーションが思いつきません。通常は、サイトを閲覧する人はリファラーの偽装などしないでしょうから、正しいリファラーが送られてくるか、リファラーが送られてこないことは、ある程度想定してもよいでしょう。
一方、サイトを作った人が、直リンクの際に別のリファラーが送信されるようにHTMLを書くことはできません。このために、CSRF対策として、リファラーを使う方法が有効なのです。

「ある程度想定してもよい」と書きましたが、ここに絶対性を求めることはできません。前述のように、アセスする当人は偽装が可能だからです。したがって、直リンク禁止の目的が、「概ね禁止できればよい」なのか、「絶対に直リンクにてアクセスされると困る」かによって判断が変わってきます。たとえばサイトで用いている画像を他サイトから直接<img>タグで使われたくない…が、多少の直アクセスは許容可能という場合は、リファラーによる制御もあり得るということです。

加えて補足が2点あります。

まず、現在提示されている方法ですと、リファラーがない場合をエラーとしていますが、これは不適切です。「直リンク」の場合は、リンク元のURLがリファラーとして設定されるので、リファラーは空ではないからです。したがって、このようなチェックの場合は、リンクしてよいURLやドメイン名を基準とした、いわゆるホワイトリストチェックを書く必要があります。

また、別の方が指摘されているように、ブラウザの設定やプラグイン、セキュリティソフトなどにより、リファラーを常に送信しないように設定している人もいます。リファラーによるチェック処理を置くと、本当は直リンクでない正当なアクセスなのに、このチェックでエラーにされて閲覧できない人が出てきます。

したがって、リファラーによるチェックは、企業内システムなど閲覧する人のブラウザの設定等が想定できる場合のみ用いるとよいでしょう。

結論としては、リファラーによるチェツクはまったく無意味というわけではないものの、完全ではないことと、正当な利用者まで拒否してしまう場合があるので、あまり推奨されない、というのが結論です。

投稿2016/08/10 01:44

ockeghem

総合スコア11701

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

php

1//notshow.phpへの直リンク禁止 2if (empty($_SERVER["HTTP_REFERER"])) { 3 //リダイレクト 4 header('Location: リダイレクトさせたいページのURL'); 5}

このコードだと利用者の不便を生むだけではないでしょうか?直接そのURLにアクセスしたい場合があったときに困りませんか?(これは直リンクとは言わないと思います・・・直リンクは以下のように「他者のサイト内に存在する画像などを直接imgタグのsrc属性などで参照する行為」を指します)

html

1<img src="http://example.com/img.png" alt="他サイトの画像">

既に回答で指摘されている通り,リファラは偽装可能な項目であって,セキュリティ対策的な意味は一切持ちません.無効化だけならrel="noreferrer"属性をつけるだけでできますし,ブラウザの拡張機能をインストールすれば偽装までできます.

【このコードを書いてもできること】
・noreferrer指定されていない他者サイトのaタグをクリックして飛んで来ること

【このコードのせいで出来なくなってしまうこと】
・WebブラウザのアドレスバーにURLを入力して直接アクセスすること

さて,このコードを書いた目的はなんでしょうか?もし「フォーム送信を繰り返して必要事項を順番に埋めていく」タイプのWebページであれば,セッション変数を使って状態を管理すべきです.

投稿2016/08/01 05:09

mpyw

総合スコア5223

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

リファラーはあくまでクライアントが送ってくるものですので、いくらでも偽装できます(リファラーを変更可能なFirefox用の拡張機能すらあります)。「間違えてアクセスするのを防ぐ」程度の意味はあるかもしれませんが、セキュリティとしての効果はほぼ皆無です

逆に、セキュリティソフトウェアを使うことで、「リファラの送信を止める」ような状況もありえます。そうなると、正当なユーザーもアクセスできなくなります

アクセス制御として本格的に考えたいのなら、別な手法を使いましょう。

投稿2016/08/01 04:50

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

直接リンクを禁止 = セキュリティ的に強固
の等式は成り立たないので、セキュリティ問題の有無に関して回答は出来ないですよ。
HTTP_REFERER の偽装も可能ですし。

投稿2016/08/01 04:49

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

考えてることをやりたいならリンク元のページでセッションを開始し適当なトークンを埋め込むようにして
notshow.phpにアクセスした時にそのトークンを保持していなかったらエラーページにリダイレクトする
という感じでやればいいんじゃないでしょうか
クロスサイトリクエストフォージェリ対策のような発想ですね
別にセッションでなくてもpostやgetで適切なトークンを投げたときだけリダイレクトしないという対応もできます

セキュリティ的にはリンク元にさえアクセスすればnotshow.phpにアクセスできる状態になりますからリンク元へのアクセスをどう制御してるかに依存します

投稿2016/08/01 06:51

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

PHP: $_SERVER - Manual

'HTTP_REFERER'

現在のページに遷移する前にユーザーエージェントが参照していた ページのアドレス(もしあれば)。これはユーザーエージェントに よってセットされます。全てのユーザーエージェントが これをセットしているわけではなく、また、HTTP_REFERER を変更する機能を持つものもあります。 要するに、信頼するべきものではありません。

あんまり当てになりませんね。

とりあえず、まずはリファラーの内容が当該のサーバアドレスを含むかまでチェックは必要かと思います。
あと本気でやるならトークン発行してとか、結構大変だと思います

投稿2016/08/01 04:55

Mr_Roboto

総合スコア2208

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

別に直リン自体がなにか悪いことをしているわけじゃないので放置でよいでしょう
むしろセキュリティ的な話であればログインシステムを導入し
セッションでユーザーIDを確認するほうが重要になります。

投稿2016/08/01 04:56

yambejp

総合スコア114839

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

リファラーはブラウザのアドオンなど使用すれば変更可能な情報なので、
リファラーでの判定は完全なセキュリティ対策になりません。

notshow.phpへの遷移を、単純なaタグでの遷移ではなく、POST通信による遷移にしてあげると、
cakeやcodeigniterなどのフレームワークにはPOST通信の認証機能がついてますので、
フレームワークの機能を用いた認証ができます。

フレームワークの機能を用いるため、GET通信でのnotshow.phpへのアクセスも可能なはずなので、
notshow.phpにて、POSTパラメータの有無をチェックし、POSTパラメータが無ければ、
header('Location: リダイレクトさせたいページのURL');
へ遷移させる方法もあります。

投稿2016/08/02 04:11

shu_otsuka

総合スコア59

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問