[解決済み] check_ajax_referer() は実際どのように動作するのでしょうか?
質問
賢いWordpressの人の意見 プラグイン開発者は、ページからワードプレスブログ (admin-ajax.php) に戻る各 AJAX リクエストに nonce を採用する必要がある、ということです。
これは、(1)サーバー側で非通知を生成する。
$nonce = wp_create_nonce ('my-nonce');
...(2) AJAX リクエストを送信する Javascript コードが、その nonce を利用できるようにする。たとえば、次のようにすることができます。
function myplg_emit_scriptblock() {
$nonce = wp_create_nonce('myplg-nonce');
echo "<script type='text/javascript'>\n" .
" var WpPlgSettings = {\n" .
" ajaxurl : '" . admin_url( 'admin-ajax.php' ) . "',\n" .
" nonce : '" . $nonce . "'\n" .
" };\n" .
"</script>\n";
}
add_action('wp_print_scripts','myplg_emit_scriptblock');
...そして、(3) javascriptのajaxロジックがそのグローバル変数を参照します。
var url = WpPlgSettings.ajaxurl +
"?action=my-wp-plg-action&" +
"nonce=" + WpPlgSettings .nonce +
"docid=" + id;
$.ajax({type: "GET",
url: url,
headers : { "Accept" : 'application/json' },
dataType: "json",
cache: false,
error: function (xhr, textStatus, errorThrown) {
...
},
success: function (data, textStatus, xhr) {
...
}
});
...そして最後に(4)サーバーサイドのロジックで受信したnonceをチェックします。
add_action( 'wp_ajax_nopriv_skydrv-hotlink', 'myplg_handle_ajax_request' );
add_action( 'wp_ajax_skydrv-hotlink', 'myplg_handle_ajax_request' );
function myplg_handle_ajax_request() {
check_ajax_referer( 'myplg-nonce', 'nonce' ); // <<=-----
if (isset($_GET['docid'])) {
$docid = $_GET['docid'];
$response = myplg_generate_the_response($docid);
header( "Content-Type: application/json" );
echo json_encode( $response ) ;
}
else {
$response = array("error" => "you must specify a docid parameter.");
echo json_encode( $response ) ;
}
exit;
}
しかし、実際にはどのようにチェックするのでしょうか?
解決方法は?
AJAXの手順の一部修正 という疑問が湧いてきました。そして、それは単純なことで、チェックするのは 関数コード :
function check_ajax_referer( $action = -1, $query_arg = false, $die = true ) {
if ( $query_arg )
$nonce = $_REQUEST[$query_arg];
else
$nonce = isset($_REQUEST['_ajax_nonce']) ? $_REQUEST['_ajax_nonce'] : $_REQUEST['_wpnonce'];
$result = wp_verify_nonce( $nonce, $action );
if ( $die && false == $result ) {
if ( defined( 'DOING_AJAX' ) && DOING_AJAX )
wp_die( -1 );
else
die( '-1' );
}
do_action('check_ajax_referer', $action, $result);
return $result;
}
もし
wp_verify_nonce
は
false
を送信していません。
false
の中に
$die
を実行します。
wp_die( -1 );
.
サンプルコードでは
check_ajax_referer()
を実行すると、実行が中断され
-1
を AJAX 呼び出しに追加します。エラーを自分で処理したい場合は、パラメータ
$die
を使い、自分の好きなように
$do_check
:
$do_check = check_ajax_referer( 'myplg-nonce', 'nonce', false );
なお、WordPressでAJAXを処理する正しい方法とは
登録
,
待ち行列
と
ローカライズ
を使用して、JavaScript ファイルを
wp_enqueue_scripts
の代わりに
wp_print_scripts
.
<サブ
参照
wp_print_styles() ではなく、wp_enqueue_scripts() を使用します。
.
関連
-
[解決済み] エラー「SCRIPT7002」の解決方法について。XMLHttpRequest: IEで「ネットワークエラー 0x80070005, アクセスは拒否されました。
-
AjaxにおけるbeforeSend関数の使用について
-
Captcha機能とlayUIの検証
-
[解決済み] なぜGoogleはJSONレスポンスにwhile(1);を前置するのでしょうか?
-
[解決済み] Microsoft JSONの日付はどのようにフォーマットするのですか?
-
[解決済み] JSONまたは部分的なhtmlを返すASP.NET MVCコントローラのアクション
-
[解決済み] FirefoxでjQuery $.ajax(), $.post がREQUEST_METHODとして "OPTIONS "を送信する問題
-
Extjs4.1 Ext.gridで作成したpropertyGridの内容を動的に更新する。
-
[解決済み】プリフライトCORSリクエストの導入の動機は何ですか?
-
[解決済み】jQuery.ajaxのcontinueレスポンスの処理。"success:" vs ".done"?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] AJAXはRest apiなのか
-
(フロントエンド)警告。メインスレッドでの XMLHttpRequest の同期は非推奨です。
-
リソースの読み込みに失敗しました:サーバーはステータス 400 (Bad Request) で応答しました。
-
onclickイベントの値を渡して、ajaxリクエストの実行に移る
-
AJAXクロスドメイン問題(3つの解決策)
-
[解決済み] Firefox または Chrome ブラウザから HTTP POST リクエストを手動で送信する方法
-
[解決済み】プリフライトCORSリクエストの導入の動機は何ですか?
-
[解決済み] HTTPリクエストがステータスコード0を返すのはどういう意味ですか?
-
[解決済み] ajax更新/レンダーのためのコンポーネントのクライアントIDを見つける方法?bar "から "foo "を参照する式でコンポーネントを見つけることができません。
-
[解決済み] WebサーバーからブラウザにデータをPUSHする方法はありますか?