teratail header banner
teratail header banner
質問するログイン新規登録
PHP

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

Q&A

解決済

1回答

402閲覧

[PHP] 特定のIPアドレスからアクセスされた場合に require_once しているファイル内の定数が定義されていないとエラーが発生する

mamiya_shou

総合スコア21

PHP

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

0グッド

0クリップ

投稿2024/03/26 17:09

編集2024/03/27 11:03

0

0

実現したいこと

  1. require_once しているファイルを無視してPHPを実行する(Webページにアクセスする)ことが可能なのか知りたいです(※特定のIPアドレス以外では定数が定義されていないというエラーは発生しません)
  2. 1が可能の場合、定数を定義しているファイルを読み込ませるようにしたいです。

発生している問題・分からないこと

index.php は定数 SITE_NM を定義した define.php を必ず require_once して読み込んでいます。
なので index.php 実行時に定数 SITE_NMが定義されていないということはありません。
しかしながら特定のIPアドレスからアクセスされた場合に、
PHP Fatal error: Uncaught Error: Undefined constant "SITE_NM" in 略/index.php:xx という Fatal error が発生します。

エラーメッセージ

error

1PHP Fatal error: Uncaught Error: Undefined constant "SITE_NM" in (略)/index.php:xx 2Stack trace: 3#0 {main} 4 thrown in (略)/index.php on line xx

該当のソースコード

PHP

1[define.php] 2<?php 34define('SITE_NM', 'サイト名(仮)'); 5

PHP

1[index.php] 2<?php 3require_once './define.php'; 4 56<title><?php echo SITE_NM; ?></title> 7

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

定数が定義されていないという PHP Fatal error が発生する特定のIPアドレスについて、Whois で調査しました。

  1. 50.19.46.214 = ec2-50-19-46-214.compute-1.amazonaws.com → Amazon.com, Inc. (AMAZO-4)、アメリカ合衆国
  2. 199.45.155.17 = scanner-202.hk2.censys-scanner.com → Censys, Inc. (CENSY)、インド
  3. 198.235.24.92 → Palo Alto Networks, Inc、アメリカ合衆国

補足

・PHPのバージョンは8.3、スクラッチなのでフレームワークは使用していません。
・PHP 7.4の時は「PHP Warning: Use of undefined constant SITE_NM - assumed SITE_NM' (this will throw an Error in a future version of PHP) in 略/index.php on line xx」という Warning が発生していました。

お詳しい方、アドバイスよろしくお願いします。

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

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

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

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

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

maisumakun

2024/03/26 21:56

> 特定のIPアドレスからアクセスされた場合に これが原因だと判断した根拠は何でしょうか?
mamiya_shou

2024/03/27 00:21 編集

maisumakun さん > ※特定のIPアドレス以外では定数が定義されていないというエラーは発生しません 上記の通りです。
maisumakun

2024/03/26 23:42

「IPアドレス」そのものが原因ではなく、そこから「特殊なアクセス方法」を行っていることでエラーが発生している、という線はないのでしょうか?
tabuu

2024/03/26 23:48 編集

特定のIPアドレス以外でもエラーは発生しているがエラーが表示されていない、または条件分岐等で実行されていないというようなことはないですか? 下記のような単純なコードでも同じ現象が発生しますか? [define.php] <?php define('MY_TEST', 1); [index.php] <?php var_dump(0); require_once './define.php'; var_dump(MY_TEST);
ikedas

2024/03/26 23:57

「(略)」と書いてある箇所を全て削除したファイルでも、同じことが起きますか。 そうでないのなら、同じことが起きる最小限のファイルを提示してください。
mamiya_shou

2024/03/27 00:22 編集

maisumakun さん > 「IPアドレス」そのものが原因ではなく、そこから「特殊なアクセス方法」を行っていることでエラーが発生している、という線はないのでしょうか? 「特殊なアクセス方法」の可能性はあります。ただアクセス側のことなので詳細については不明です。
mamiya_shou

2024/03/27 00:20

tabuu さん > 特定のIPアドレス以外でもエラーは発生しているがエラーが表示されていない、または条件分岐等で実行されていないというようなことはないですか? ありません、エラーは全てログに残るので発生していたら確認した際に気付きます。 > 下記のような単純なコードでも同じ現象が発生しますか? 実際に試しましたが発生しませんでした。
tabuu

2024/03/27 00:34

>実際に試しましたが発生しませんでした。 発生しないといは、特定のIPアドレスからのアクセスでもエラーは発生しなかった(問題は発生せず正常だった)ということでしょうか?
mamiya_shou

2024/03/27 01:06

tabuu さん 特定のIPアドレスからのアクセスはこちらでは検証できませんので(アクセスする相手次第)、特定以外のIPアドレス(通常のアクセス)で単純なコードではエラーは発生しなかったということをお伝えしたかった次第です。
tabuu

2024/03/27 01:36

他の方もおっしゃっていますが特定のIPアドレスからアクセスされた場合は通常とは異なる処理になっていると思います。 例えば異なるディレクトリのindex.phpにリダイレクトされているなど。再現することができないので、ご提示いただいた情報だけでは解決は難しいと思います。
mamiya_shou

2024/03/27 01:51

tabuu さん IPアドレスによって処理を分岐することは問題が発生している定数では行っておりません。 > ご提示いただいた情報だけでは解決は難しいと思います。 こちらとしましては「require_once を無効化してPHPファイルを実行する術が無い」ということが分かるだけでも収穫ですので。
maisumakun

2024/03/27 02:05

> ただアクセス側のことなので詳細については不明です。 アクセスログなどから読み取れる情報はないでしょうか?
mamiya_shou

2024/03/27 02:12

maisumakun さん アクセスログは失念していました、確認してみます。
mamiya_shou

2024/03/27 11:09

エラーが発生したIPアドレスのアクセスログを記載します。 1) 50.19.46.214 - - [25/Mar/2024:00:09:57 +0900] "GET / HTTP/1.1" 500 978 "-" "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.1 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/534.1" 1) 50.19.46.214 - - [25/Mar/2024:00:09:57 +0900] "GET / HTTP/1.1" 500 5309 "-" "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.1 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/534.1" 2) 199.45.155.17 - - [21/Mar/2024:22:24:18 +0900] "GET / HTTP/1.1" 500 5309 "-" "Mozilla/5.0 (compatible; CensysInspect/1.1; +https://about.censys.io/)" 3) 198.235.24.92 - - [15/Mar/2024:23:17:46 +0900] "GET / HTTP/1.1" 500 978 "-" "Expanse, a Palo Alto Networks company, searches across the global IPv4 space multiple times per day to identify customers&#39; presences on the Internet. If you would like to be excluded from our scans, please send IP addresses/domains to: scaninfo@paloaltonetworks.com" あまりアクセスログを見たことはありませんが、2と3が一般的なものとは異なっているように感じます。
ikedas

2024/03/27 11:13 編集

> > 下記のような単純なコードでも同じ現象が発生しますか? > 実際に試しましたが発生しませんでした。 つまり、「(略)」として現在は質問に載せていないどこかに原因があって、問題の現象が起きているということですよね。 実際のソースから少しずつコードを削っていって、どこを削ったら問題の現象が起きなくなるかをを確かめればいいです。問題の起きなくなったときに削った箇所が原因です。
mamiya_shou

2024/03/27 11:23

ikedas さん 返信遅くなってしまい申し訳有りません。 実際に稼働中のサイトのため(略)の部分を削り、特定のIPアドレスからアクセスして検証することが事実上不可能です(相手がアクセスしてくれる保証が無いため)。 おそらく仰られている通りだと思われます、時間を見て(略)部分で記載できる部分を追記致します。
ikedas

2024/03/27 11:53 編集

あと、本当に接続元IPアドレスが原因なら、本番環境でクライアントのアクセスをまたなくても、 コマンドライン版のphp で REMOTE_ADDR=198.235.24.92 php index.php などとすれば問題が再現するはずですよね。
mamiya_shou

2024/03/27 12:08

ikedas さん レンタルサーバーの都合上、コマンドライン版は使えません。
ikedas

2024/03/27 12:21

本番環境のレンタルサーバ でなくても、同じバージョンのコマンドライン版が使える環境ならよいです。まあIPアドレス以外の要因もありうるので、あまり手間がかかるようなら無理してやる必要はないと思いますが。
mamiya_shou

2024/03/27 12:25

残念ながら手持ちの実行環境はすべてコマンドライン版が使えません、ご理解ください。
tezcello

2024/03/28 04:14

require_once をキャンセルする方法は無いと考えると、 require_once './define.php'; が失敗している可能性を探る手もあるかと。 __ログを精読していれば気付くでしょうが... 例えば、これが記述されている index.php自体がどこかで include / require されていると、パスによっては存在していない事になるかも。 何にしても、状況確認が出来ていない(情報が足らない)ので、件の定数を使う直前で未定義であれば例外を投げるとかで各種情報(スタックトレースは有効かも)を記録しては?
guest

回答1

0

ベストアンサー

require_once 自体を無効化することは出来ませんが、対象ファイルが別の場所で既にrequire_onceされていた場合、2回目のrequire_onceの部分ではファイルがロードされません。
なので、別の場所で require_once しておけば、該当箇所でのロードを避けることは一応出来ます。ただし、コードは1回目のrequire_onceの時点で動いてはいるはずです。

他に有り得そうな要因としては下記2つでしょうか。コード全体が分からないとこれ以上の回答は難しいです。
エラーが発生しているクライアントについて、リクエスト情報も取得して検証されるのが良いかと思います。

1 クライアントのアドレス、またはリクエスト内容によって処理が異なる
特定ホストからの場合IPアドレススキャンで来ている可能性があるので、ドメイン名ではなくIPアドレスでアクセスされていることも多いです。他にも、$_SERVER の変数などで通常のブラウザからであれば送信されているヘッダを前提としている処理がないか見直してみてください。

2 uopz_undefine を使ってdefineが無効化されている https://www.php.net/manual/ja/function.uopz-undefine.php

投稿2024/03/27 02:13

Eggpan

総合スコア3297

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

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

mamiya_shou

2024/03/27 11:26

require_once の仕様は理解しております。 「2 uopz_undefine」は grep に引っかからないため可能性としてはありません。 「1 クライアントのアドレス、またはリクエスト内容によって処理が異なる」の可能性はありますので調査致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問