web-dev-qa-db-ja.com

WordPressはプラグインファイルの直接アクセスを制限する

私はWordPressプラグインを開発していますが、その前に、すでに開発されたいくつかのプラグインのコードを確認しました。私は次の行によってプラグイン開発者がプラグインコードを開始する直接を制限するための一般的なアプローチを見ました

//  If accessed directly, abort
if ( ! defined( 'WPINC' ) ) {
    die;
}

これはプラグインインデックスファイルにあります。私の質問は、プラグインをインストールするときに、これが最初に実行されるファイルなので、以前に定義されていて、ファイルの実行が中止されないことです。

1
Mehar

質問1。なので、前に定義されている箇所
答え:

これはWordPressコアで定義されています。

ここでクイックオンライン 参照 またはローカル参照については、WordPressのルートにある次のファイルを見てください:wp-settings.php。そのファイル(の18行目前後)に以下のコードが表示されています。

define( 'WPINC', 'wp-includes' );


質問2。そしてそれはファイルの実行を中止しません
答え:

その使用(つまりと言う目標は、直接アクセスからプラグインを保護することです)
、外部からあなたのコードへの不正アクセスを防止します
この保護を実現する2つの方法があります。開発者の中にはWPINCを使う人とABSPATHを使う人がいます

  • if (!defined('ABSPATH')) exit;(またはexitdie("No cheating!")または他のテキストに置き換える)
  • if ( ! defined( 'WPINC' ) ) die;(または上記と同じ方法でexitを使用)

どちらも以下のように定義されています。

  • define( 'ABSPATH', dirname(dirname(__FILE__)) . '/' );
  • define( 'WPINC', 'wp-includes' );

dirnamegeneric PHP)は単にフルパスからディレクトリを返します。
wp-includesは一目瞭然です。


どちらを使用するかは自由に決めることができます。私は個人的には本当の正しい方法はないと思います、どちらも同じ目的を持っています。私はABSPATHだけを使いますが、それはあなたの個人的な好み次第です。
ヘッダ部分のすぐ下、または少なくともプラグインの最上部近くに追加することを忘れないでください。

3
Charles

WPINCはプラグインがロードされる前にWPで定義されています。そのため、すでに定義されているという事実は、プラグインが直接要求ではなくWPによってロードされていることを示しています。

1
BillK

これも使えます。これは Akismet Anti-Spam プラグインで定義されています。

// Make sure we don't expose any info if called directly
if ( !function_exists( 'add_action' ) ) {
    echo 'Hi there!  I\'m just a plugin, not much I can do when called directly.';
    exit;
}
0
Razon K.