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

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

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

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

Q&A

解決済

3回答

1449閲覧

ユーザーからアクセスされるべきではない外部参照ファイルの設定について

pegy

総合スコア243

PHP

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

0グッド

1クリップ

投稿2021/06/01 07:41

例えば、MYSQLに関連する処理をrequire_once()等で外部から呼び出しをすることが考えられます。

php

1//index.php 2require_once("pdo.php") 3 4 try { 5 $stmt = $pdo->prepare('SELECT * from sample_table WHERE p_id = :page_id'); 6 $stmt->bindValue(':page_id', 1, PDO::PARAM_INT); 7 $stmt->execute(); 8 $result = $stmt->fetchall(PDO::FETCH_ASSOC); 9 } catch (PDOException $e) { 10 throw $e; 11 } 12//$resultを利用した処理を実装 13

php

1//pdo.php 2 $dsn ='mysql:dbname=sample;host=localhost'; 3 $user="root"; 4 $pass="root"; 5 $pdo = new PDO($dsn,$user,$pass, array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET CHARACTER SET `utf8`')); 6 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

これらのファイルをサーバーに設置する際に、例えば同じディレクトリに存在するとします。
そうするとユーザーからはhttps://xxx/xxx/pdo.phpには直接アクセスすることができてしまいます。本処理自体は直接アクセスされても何か実害があるわけではないですが、できればアクセスして欲しくないファイルとなります。

例えば、アクセス制限をサーバー上かけかけたりすることが考えられますが、場合によってrequire_once()でも参照することができなくなることもあると思います。

通常は、.htaccessファイルなどで、アクセス制限や参照制限を実装するのでしょうか。根本的なアプローチがわからず、もしかしたらサーバー次第であったりするのかもしれませんが、もし一般的な考え方等があれば教えてくださいますとありがたいです。

よろしくお願い申し上げます。

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

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

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

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

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

itagagaki

2021/06/01 07:51 編集

pdo.phpをGETするリクエストが来たらpdo.phpが実行されてその結果が返されるので、pdo.phpのコードが返されることはないのでは? (もちろんpdo.phpでコードが<?php ~ ?>の中に記述されている前提で)
guest

回答3

0

ベストアンサー

通常は、.htaccessファイルなどで、アクセス制限や参照制限を実装するのでしょうか。根本的なアプローチがわからず、もしかしたらサーバー次第であったりするのかもしれませんが、もし一般的な考え方等があれば教えてくださいますとありがたいです。

VPS等の自分で管理しているサーバであれば、

  1. ドキュメントルート以下に直接アクセスされるファイルを置く

例えばドキュメントルートが/var/www/public/なら、/var/www/public/index.php等を置く
2. ドキュメントルートより上位のディレクトリに直接アクセスされる必要の無いファイルを置く
例えば/var/www/lib/pdo.php

の2点が基本になります。

設定値と実行を切り分けて作っていれば、設定値だけ環境変数や.envなどから読み込むことも可能です。

例えば、アクセス制限をサーバー上かけかけたりすることが考えられますが、場合によってrequire_once()でも参照することができなくなることもあると思います。

該当のファイルやディレクトリのパーミッションを適正に設定すればそのような事は発生しません。
例: Apache+mod_phpならApacheが読み込めるパーミッションにする

レンタルサーバーの場合

レンタルサーバーの場合は

  • ドキュメントルートより上にファイルが置けるならVPSの場合と同じ
  • おけないなら、.htaccessでアクセス制限をかける

という形になります。

捕捉

設定値とDB接続をrequire()で直接実行してしまうようなコードは15年くらい前の品質水準であり、
このコードの制約の上で出来ることを考えることはあんまりお勧めできません。

別の教材やフレームワーク入門書等を使用して、
せめて設定値と実行が切り分けられるコードの下で標準的な手法を学習されることをお勧めします。

例えば、pdo.phpをクラスや自作関数のみが定義されているファイルにして、
requireした後にクラスや関数を実行することで初めて実行されるような形です。

投稿2021/06/01 08:04

編集2021/06/01 08:09
tanat

総合スコア18713

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

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

pegy

2021/06/01 11:41

詳細コメントをいただきありがとうございます。 自身の利用しているレンタルサーバーについて、ドキュメントルートより上にファイルを格納できるか確認をしてみます。 ""捕捉_フレームワークにつきまして フレームワークに言及してくださっていますが、これは例えば「Laravel」や「cakePHP 」を指していらっしゃいますでしょうか?ファイルをサーバー上にどのように配置するかという議論とこれらのフレームワークが直接、初心者のため結びつかなかったため、異なるものを指しているのであれば、入門書探しの鍵にもなるため是非とも知りたいとお問い合わせさせていただきました。 ※もちろん、具体的にこのような書籍がおすすめです、というものがあればとても嬉しいです。 ""捕捉_>pdo.phpをクラスや自作関数のみが定義されているファイルにつきまして 本件の質問は、少し極端な例でPDOの設定の一部を切り出したのですが、実際のpdo.phpはfunction.phpという名前で諸々汎用に使える関数やクラスを記載しており、様々なファイルから汎用パーツとしてrequireしております。ただ、おそらく他の方からの指摘も踏まえて、このようなやり方も現在では古い手法ということかと推察しておりますが、ここで言及されている、'pdo.phpをクラスや自作関数のみが定義されているファイル' とは具体的にどのような点でアプローチが異なるのかとても知りたいです。上のフレームワークを学べば分かるということであれば、素直に何か書籍を読んでみます! 重ねて失礼します。 よろしくお願い申し上げます。
tanat

2021/06/01 12:06

> ""捕捉_フレームワークにつきまして そうですね。LaravelやCakePHPになります。 これらをレンタルサーバーで運用するのはハードルが高いという問題はありますが、 業務では何らかのフレームワークを使うのが標準的な手法になっているため、学習する価値は十分に有ると思います。 > ""捕捉_>pdo.phpをクラスや自作関数のみが定義されているファイルにつきまして 質問では極端なケースだという事は理解しました。 WordPressっぽい作りですね。 WordPressは過去の経緯と積み重ねからそうなっているのですが、最近のアプリケーションではそのような形で設計されているケースは少数派だと思います。 > このようなやり方も現在では古い手法ということかと推察しておりますが、ここで言及されている、'pdo.phpをクラスや自作関数のみが定義されているファイル' とは具体的にどのような点でアプローチが異なるのかとても知りたいです。 Laravel等のフレームワークのルールに沿って開発すると(機能が過大ではありますが)イメージが付きやすいと思います。 もしくは`PHP PSR-4 autoload composer`あたりで検索してみて、クラスがオートロードされる仕組みのアプリケーションを組んでみると、requireで困っていた時には戻りたく無くなると思います。 正確なところはオブジェクト指向開発やデザインパターンの概念の理解も必要になってくるので、一度`PHP GoF デザインパターン `あたりで調べてみると視野が広がります。
pegy

2021/06/01 14:56

コメントをいただきありがとうございます。 1.フレームワーク(これまで単独開発しかしていなかったので、避けてきましたが・・) 2.PHP PSR-4 autoload compose 3,PHP GoF デザインパターン の3点を足がかりに学ぶを進めてみようと思います。 ご質問できてよかったです!改めて御礼申し上げます。
guest

0

ブラウザから参照できない場所(ドキュメントルート外)に置けばよいです。
PHPはサーバーサイドの言語なので、同じサーバー内であれば基本的にどこでも読み込めます。
ブラウザからのアクセスのためのファイルが最低1つ以上必要なだけです。
アクセス関係ないものは基本的にはドキュメントルート配下に置きません。

既存のフレームワークの構成を参考にしてください

投稿2021/06/01 08:03

m.ts10806

総合スコア80850

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

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

pegy

2021/06/01 11:43

komennとありがとうございます。”ドキュメントルート外”という考え方については、よくわかりました。 上記tanat様のコメントにも記載させていただきましたが、ここで皆様がいうフレームワークが何を指しているかわからずに勉強のアプローチに迷っており、コメントさせていただきました。 おそらく、同じ概念でコメントくださっていると解釈しております。
m.ts10806

2021/06/01 12:24

> ここで皆様がいうフレームワークが何を指しているかわからずに 前提があるなら質問に書いておいてください。 「PHP フレームワーク」で探したらそれなりに出てきます。
pegy

2021/06/01 14:58

コメントありがとうございます。やはり、LaravelやCakePHPといったフレームワークでした。これらがファイルの配置の仕方などについて何か考え方を与えてくれるとは思わなかったため、意外でした。 大変失礼をいたしました。
m.ts10806

2021/06/01 15:01

特に失礼されたとは思ってませんが、キーワードを見つけたならまず検索エンジンに投入して2,3記事を読む癖をつけるだけでも質問せずに解決出来たり、質問時に回答が得やすくなったりすると思います。 プログラミングに限らず、先人の知恵は次の発想を得るのに役立ちます。 「資産(リソース)」ですから。
guest

0

やろうとしていることは意味がないことです
ただし、以下調整を検討してください

  • pdo.phpをクラスとして提供する
  • pdo.phpの置き場所をinclude_pathもしくはapacheから参照できないパスにする

投稿2021/06/01 07:49

yambejp

総合スコア114839

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

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

pegy

2021/06/01 11:45

コメントいただきありがとうございます。 ありがとうございます。 ドキュメントルート外であれば通常、ユーザーは参照できないということなので、一旦その点は理解することができました。 ただ、皆様からもそもそも今回のファイルの切り分け方や実装の方法に問題があるというご指摘があるので、 クラスとして提供する場合のファイルの構成やサーバー上のあり方については、上記の方々のコメントも参考に検討してみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問