web-dev-qa-db-ja.com

_wpnonceと_wp_http_refererがURLに表示されないようにする方法

検索フィールドを持ち、WP_List_Tableを使用するプラグインを開発しようとしています。このプラグインは厳密にはバックエンド用であり、データベース内のユーザーを検索し、それらを追加のプラグインからの他のメタと一緒に返します。

ユーザーを検索すると、_wpnonceと_wp_http_refererの隠し入力フィールドがURLストリングに追加されます。 _wpnonceはそれほど大きな問題ではありませんが、_wp_http_refererは問題です。

プラグインを使用している人が複数の検索を続けている場合、_wp_http_referer文字列がURL内で非常に長くなり、エラーになります。Request-URI Too Large要求されたURLの長さがこのサーバーの制限を超えています。

では、検索ボタンがクリックされるたびに、隠し値がURLに表示されないようにするか、_wp_http_refererをリセットする方法を教えてください。

2
Ken

この問題は、いくつかの問題が原因で発生します。

1)WP_List_Table::search_box()は、wp_nonce_field()を使用してデフォルトの_wpnonceおよび_wp_http_refererフィールドを上書きする機能を提供せずに「私はもう一回だけフィールドに感謝します」と言って挿入する。

WP_List_Table::print_column_headers()は現在のGETおよびorderbyパラメータについてのみWP_List_Tableをチェックし、そのヘッダリンクを構築するために$_GETを使用するため、$_SERVER['REQUEST_URI']をサブクラス化するときは、フォーム送信の方法としてorderを使用する必要があります。フォームメソッドとしてGETを使用しない場合は、列をソートするときに検索パラメータを失います。

Request-URI Too Large The requested URL's length exceeds the capacity limit for this serverエラーを回避する方法は2つあります。

A)すべてのnonceチェック関数は_wp_http_refererリクエストフィールドまたは参照元の適切なヘッダーへのフォールバックのいずれかを使用できるため、処理の早い段階で_wp_http_refererクエリ引数を削除できます。

したがって、この問題を解決する簡単な方法は、あなたのWP_List_Tableサブクラスのprepare_items()関数に以下の非常に早い段階で追加することです。

$_SERVER['REQUEST_URI'] = remove_query_arg( '_wp_http_referer', $_SERVER['REQUEST_URI'] );

B)間違いなくもっと安全で確実な方法は、prepare_items()が期待通りに機能するように、いったんそれらをコンパイルしたら、POSTフォーム投稿メソッドに切り替えてWP_List_Table::print_column_headers()$_SERVER['REQUEST_URI']をあなたが気にするすべてのパラメータで更新することです。

$options = array(
    'blog_id'     => $blog_id,
    's'           => $search,
    'record_type' => $record_type,
    'orderby'     => $orderby,
    'order'       => $order,
);

// Update the current URI with the new options.
$_SERVER['REQUEST_URI'] = add_query_arg( $options, $_SERVER['REQUEST_URI'] );
3
ianmjones