Articles

WordPress Error Fix: “Call to undefined function get_header()”

♦ Posted by Jeff Starr in PHP, Security
January 11, 2019

テーマファイルを直接標的とするボット攻撃が大きく増加していますね。 まず彼らはテーマディレクトリのURLを取得します。 ボットがこの情報を取得する方法は数多くあります。 たとえば、ほとんどのテーマは CSS や JavaScript ファイルなどのアセットを含んでおり、リンクは完全な URL を含んでいます。 そこで、テーマのURLを入手すると、悪質なボットは、index.phpheader.phpといったよく知られたテーマのテンプレートファイルに対して直接リクエストを行います。 テンプレートファイルを直接リクエストすると、セキュリティ上の脆弱性が明らかになる可能性があり、これはますます一般的な攻撃経路となっているようです。 また、「未定義関数 get_header() の呼び出し」(および類似の)エラーの引き金にもなります。 幸いにも、簡単な修正があります。

あなたのサイトは標的になっていますか

あなたのサイトがテーマ ファイルへの直接のリクエストで攻撃されているかどうかを調べるには、サイトのアクセス/エラー ログをチェックできます。 以下は、私自身のログから、何を探すのに役立ついくつかの例です:

注: 以下のログ エントリでは、Google がクロールしてエラーを報告しないように、すべてのファイル パスが例の URL に変更されています。 実際のログファイルでは、エラーにはURLではなくファイルパスが含まれています。 追伸:Googlebotがプレーンテキストのパス情報を、それも<pre>タグの内部をクロールするのは最も馬鹿げています。
2018-12-30 17:54:07 ErrorAH01071: Got error 'PHP message: PHP Fatal error: Uncaught Error: Call to undefined function get_header() in https://example.com/wp-content/themes/digwp/index.php:1Stack trace: #0 {main} thrown in https://example.com/wp-content/themes/digwp/index.php on line 1'2018-12-30 12:53:55 ErrorAH01071: Got error 'PHP message: PHP Fatal error: Uncaught Error: Call to undefined function get_header() in https://example.com/wp-content/themes/digwp/404.php:1Stack trace: #0 {main} thrown in https://example.com/wp-content/themes/digwp/404.php on line 1'2018-12-30 12:53:55 ErrorAH01071: Got error 'PHP message: PHP Fatal error: Uncaught Error: Call to undefined function esc_url() in https://example.com/wp-content/themes/digwp/header.php:8Stack trace: #0 {main} thrown in https://example.com/wp-content/themes/digwp/header.php on line 8'

ですから、あなたのサイトが直接テンプレート攻撃で狙われているなら、この種のエラーをたくさん目にするでしょう。 これらの例では、index.php404.phpheader.phpに対するリクエストです。 私の分析では、テンプレートリクエストのほとんどはこれら3つのファイルに対するものですが、次のような他のよく知られたWordPressファイルに対するスキャンも見られるかもしれません:

/archive.php/wp-includes/rss-functions.php ..various theme template files..various files in the WP Media Library

基本的に、WordPressコア、テーマ、プラグインファイルへの直接のリクエストは、事前に適切な対策を取らない限り、ほとんどの場合はエラーを引き起こします。 たとえば、この後、「未定義関数」エラーを簡単に停止する方法を紹介しますが、これは貴重なサーバー リソースを節約し、サイト全体のセキュリティを向上するのに役立ちます。 これらは、直接読み込まれたテンプレート ファイルに対して WordPress コアが読み込まれないために発生します。

たとえば、header.php を直接要求した場合、ファイルが WordPress の外部で要求されるため、esc_url() などのコア関数が使用できません。 まあ、あなたのテーマがすでに似たようなテクニックを実装しているかもしれませんし、そうでない可能性もあります。 リスクは?

修正方法

このタイプのエラーを防ぐ最も簡単な方法は、WordPress が使用できない場合、単にスクリプトを終了させることです。 これは、ファイルへの直接アクセスを防ぐために使用される、古くて効果的な PHP テクニックです。

<?php if (!defined('ABSPATH')) exit; ?>

これは簡単に言うと、「ABSPATH 定数が定義されていない場合、スクリプトを終了します。 これは、ABSPATH が WordPress がロードされたときにのみ定義されるため、機能するのです。 したがって、悪質なボットがやってきて、テーマのテンプレートを要求し始めると、サーバーから空白のページ (空の応答) を受け取るだけです。

同様のコードを WordPress を使用している間に見たことがあるかもしれません。 スクリプトへの直接アクセスを防止することは、PHP のセキュリティの重要な部分です。 攻撃者/ボットが、許可されていないときに、コンテキストの範囲外でスクリプトを実行することなどは避けたいものです。

この手法を実装するには、対象となるテーマ ファイルを開き、ファイルの先頭にある行を含めます。 たとえば、多くのテーマ テンプレートでは、他のコードの前にヘッダーが含まれており、次のようになります:

<?php get_header(); ?>

“no direct access” スニペットを追加すると、次のようになります:

<?php if (!defined('ABSPATH')) exit;get_header(); ?>

コードをどのようにフォーマットするかは問題ではありませんが、ポイントは他の関数が呼び出される前に ABSPATH 行を含むことです:

プロのヒント。 さらに悪質なボットを阻止したいですか?

Bonus

さらに、ディレクトリ表示を無効にすることにより、機密ファイル情報を保護することができます。 たとえば、ブラウザでテーマの親ディレクトリにアクセスした場合、何が見えるでしょうか。 ディレクトリビューが有効になっている場合、すべてのファイルのリンクされたリストが表示されます。 これは良くありません。 表示されるべきは、真っ白な画面か、その他のサーバーレスポンスです。 ファイル情報を安全かつセキュアに保つためです。

Directory Views を無効にする方法は数多く存在します。 WordPress の方法は、保護したいディレクトリに新しい (空の) index.php ファイルを作成することです。

重要! 重要!新しい index.php ファイルは、そのディレクトリにすでに存在しない場合にのみ作成してください。

次に、index.phpに次のコードを追加します。

<?php // Silence is golden.

WordPress coreはさまざまなディレクトリでこの技術を使用しています。 オープンディレクトリ表示を無効にすることで、攻撃者がサーバー上にどのファイルが存在するかという情報を得ることを防ぎます。 .htaccess でカバーしている場合や、そうでない理由があり特定のディレクトリのビューを有効にしておく場合を除き、すべての公開ディレクトリでセキュリティの利点と推奨されるプラクティスです。

Closing thoughts

この記事で説明した簡単なテクニックは、危険なコードの実行やログがいっぱいになるエラーを防止する、実績あるセキュリティ手段です。 これは、あなたのサイトのパフォーマンスとセキュリティが向上することを意味します。 この記事で説明したような種類のエラーが発生していなくても、テーマやプラグインのファイルを直接アクセスから保護することは、セキュリティにとって良いことです。

Jeff Starr

著者について
Jeff Starr = Designer. デベロッパー。 プロデューサー。 ライター。 エディター。 Etc.