web-dev-qa-db-ja.com

私が書いたらそれはどれくらい悪いですか AJAX wp-load.phpを使用して関数?

私の質問です:私がAJAX関数を書くとき、私はそれを別のファイルを使って書くことができます。そのファイルにwp-load.phpをインクルードし、WPコア関数を使用することができます。私はこれが間違っていることを知っています。あなたはそれがどれほど悪いのか教えてもらえますか?これは大きなセキュリティ上のリスクですか?どのようなセキュリティ上のリスクとデメリットがありますか?

6
Dhanuka Nuwan

それは非常に悪いことであり、そして大きなセキュリティホールです、あなたはこれらの問題に直面しなければならないでしょう:

  • あなたのエンドポイントは 常に になります、あなたのプラグインが無効になっていても、あるいはあなたがテーマを切り替えても
  • エンドポイントは、意図したサイトだけでなく、マルチサイトインストールのすべてのサイトでアクティブになるため、意図しない場所でエンドポイントが使用される可能性があります。
  • ファイルは壊れやすく、プラグインフォルダを移動したり、プラグインをmu-pluginsに置くと、エンドポイントで500の致命的なエラーが発生します。
  • あなたはすべての認証と検証を自分で実装する必要があります。
  • キャッシングプラグインはあなたのエンドポイントと対話することができず、一般的なリクエストの処理速度が遅くなります
  • エンドポイントはを受け入れることができ、それはを返すことができます

テーマやプラグインの中のスタンドアロンエンドポイントはセキュリティ上のリスクである、AJAXハンドラ、あるいは画像のためのスタンドアロンファイルでさえあると言っても過言ではありません。開発者は、そのセキュリティの評判のためにそれを却下しました)

あなたはWP AJAX AP​​Iを使うことができましたが、もっと良いのですが、自分自身で認証チェックやサニタイズチェックを実装する必要があり、ちょっとした癖があります。また、標準のエンドポイントと同様に、構造体も提供しません(標準のエンドポイントでは、受信したものを返すことができます(まったく返された場合)。

代わりに、REST AP​​Iをregister_rest_routeと一緒に使用してください。使用がより簡単で、気まぐれが少なく、認証も処理されます。それはまたあなたにもっと親切なURLと名前空間を与えます、例えば:

function tomjn_rest_test() {
        return "moomins";
}
add_action( 'rest_api_init', function () {
        register_rest_route( 'tomjn/v1', '/test/', array(
                'methods' => 'GET',
                'callback' => 'tomjn_rest_test'
        ) );
} );

あなたはこれを見ることができます:

https://tomjn.com/wp-json/tomjn/v1/test

これで私はいろいろなことができます。

  • ユーザーがログインしている必要があること、およびユーザーがこれを実行できるようにするために必要なものを指定する
  • 引数を指定します
    • それぞれの引数に対して型と消毒剤を別々に指定する
    • 必要かどうかを指定
  • エンドポイントが読み書き用か、その両方かを指定します。

これらはすべて、コア用に書かれたコードによって処理されます。もちろん、それぞれをWP AJAXハンドラに手作業で自分で実装することもできますが、これはもっと簡潔でテスト済みです(そしてWPにはほとんどありません_コミュニティはこれを正しく行うのに十分な経験を積んでいます)、例えば上記のエンドポイントを管理者だけが利用できるようにするには

register_rest_route( 'tomjn/v1', '/test/', array(
    'methods' => 'GET',
    'callback' => 'tomjn_rest_test',
    'permission_callback' => function( $req ) {
        return current_user_can('manage_options');
    }
) );

おまけとして、HTMLではなくデータを返す、標準のHTTP GET PUT POSTなどを使う、検証可能なJSONレスポンスを返すなど、特定のベストプラクティスをはるかに使いやすくします。

エンドポイントが常にアクティブであることについて何がそれほど悪いのでしょうか。

先ほど、内部のプラグインが無効になっていても、ネイティブエンドポイントはアクティブであると述べました。無効にする唯一の方法は、内部チェックを使用するか、ファイルを削除することです。なぜこれが悪いのでしょうか。

これの核心は、ある状況では適切かもしれないが別の状況ではそうでないかもしれないということです。

たとえば、シナリオ1

管理者は、ユーザーがページを更新せずにフロントエンドにログインして登録できるようにするプラグインをインストールします。これを行うために、プラグインにはユーザーを作成するためのエンドポイントがあります。しかし、管理者は登録が彼らが望んでいたものではないことに気付き、ログインするだけで、プラグインを無効にします。ファイルはまだ存在します、そしてユーザーはまだ新しいユーザーを作成するためにエンドポイントをロードすることができます。

シナリオ2:

コンタクトフォームを介してブログの管理者にEメールを送信するために、マルチサイトインストールでプラグインが使用されています。これはすべて予想通りに機能していますが、この機能に関心のない他のブログがこのサイトにあります。ブログに使用されているドメインを変更することにより、攻撃者はネットワーク上の他のブログのコンテキストでcontactフォームによって使用されているエンドポイントをロードし、adminロールを持っている人に電子メールを送信して電子メールを送信できます。マルチサイトインストールの任意の場所

シナリオ3:

プラグインには、ユーザーが自分のEメールを変更できる便利なデバッグ機能がありますが、セキュリティー上の理由から、この機能はオフにしています。ただし、電子メール変更フォームを処理するエンドポイントはスタンドアロンファイルです。フォームの作成方法を知っている人ならだれでも電子メールを変更できます。

8
Tom J Nowell

カスタムファイルエンドポイントを作成する主な欠点は、ファイルが を認識しないことです。ここで、 wp-load.phpは一般的な場合です。あなたが in WP環境であるときはいつでも、あなたは提供されたコンテキストを持っています。あなたが任意のWPファイルからどこでPHP coreを見つけようとしているのであれば、それはそこにすべての可能な設定のために働くつもりはないでしょう。

それでこのテクニックの最大の欠点はそれが公共の拡張で distributed になることができないということです。

7
Rarst