テーマファイルへの直接アクセスを制限する価値はありますか?


31

テーマで次のスニペットに時々出くわしました:

if ( ! defined('ABSPATH')) exit('restricted access');

テーマ内のいくつかの(すべての?)PHPファイルの先頭にあり、悪意のあるソースによるファイルへの直接アクセスを防止することになっています。

これはTwenty TenやElevenには含まれておらず、WordPressの公式ドキュメントで推奨されていることは一度もありません。私にとっては良い考えのように思えますが、私はセキュリティについて判断するのに十分な知識も持っておらず、グーグルで多くを見つけることができません。

これはカスタムテーマに含めるべきものですか?もしそうなら、それはすべてのPHPファイルにあるべきですか、それともいくつかですか?


7
後の読者のために、これはより短く、より良く書くことができますdefined('ABSPATH') OR exit;
。– kaiser

またはさらに短い::defined('WPINC') ? : die();P
ティムエルサス

また、エラーログに未定義の関数に関するPHPエラーが表示されないようにするために、このようなコードを追加する価値があるかどうかも疑問に思います。ボットはこれらのファイルを直接ヒットすることがあり、WPブートストラップがロードされていないため「Call to undefined function query_posts()」のようなエラーが表示されます
Matt Keys

回答:


26

通常、それは必要ありません。しかし…少なくとも1つのエッジケースがあります:

  • テーマファイルがテンプレートパーツの場合、
  • そして、呼び出しコンテキスト(親ファイル)からのグローバル変数を使用しています。
  • そして register_globalson
  • そしてそれだけで任意のセキュリティチェックなしでこれらの変数を使用しています...

…攻撃者はこのファイルを呼び出し、不足している変数をGETまたはで設定しPOST、テーマファイルにそれらを出力させることができます。そして、そこにあるセキュリティ上の問題が。

ですから…最良のオプションは、あなたの例のようなコンテキストチェックではなく、良いコードです。グローバル変数を避け、印刷する前にその内容をチェックしてください。

場合によっては、誰かが私のコードを使用し、セキュリティを考慮せずにコードを変更すると思うときに、コンテキストチェックを追加します。痛くない。


テンプレートにPHP致命的なエラーを引き起こす関数呼び出しが少なくとも1つ含まれている場合、このシナリオはまだ可能ですか?
Chris_O

@Chris_O表示の順序に依存します。
FUXIA

ファイル呼び出し間でグローバル変数を使用しない別の理由に理にかなっており、完全に同意します。
Chris_O

1
後悔するよりも安全であることが常に最善です。あまりにも多くのセキュリティが傷つくことはありません、できますか?
ショーンバーグ

2
すべてを正しく行う場合は、不要なコードを使用しないでください。この質問は、コードの追跡を難しくする証拠です。
FUXIA
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.