web-dev-qa-db-ja.com

ナンスとは何ですか?また、WordPressでAjaxを使用する方法は?

WordPressでAjaxを適切な方法で使用する方法を学習しようとしています。これは私が学んだことです:

ステップ1: Ajaxファイルを作成し、wp_enqueue_scriptを使用して登録します。

function wpdocs_theme_name_scripts() {
    wp_enqueue_script( 'script-name', get_stylesheet_directory_uri() . '/js/ajxfile.js', array(), '1.0.0', true );
}
add_action( 'wp_enqueue_scripts', 'wpdocs_theme_name_scripts' );

ステップ2: ajxfile.jsで次のようにajaxを使用します。

$( document ).ready(function() {

$('#id').on('click',function (e){       
    alert("Its Working");
    var up = 1;
    var id = $( "#id" ).data( "user_id" );
    $.ajax({
            type: "POST",
                url: "runcode.php",
                data: {up:up, id:id},
                success:
                    function(result){
                alert("result");
                        }
        });
});

});

ステップ3:ページにHTMLを追加する:

  <a href="#" id="id" data-user_id="<?php echo $user_id = get_current_user_id(); ?>" 
  data-post_id="<?php echo $post_id = get_the_ID(); ?>">
         <i class="fa fa-thumbs-up" aria-hidden="true"></i>
  </a>

誰かがリンクをクリックするたびに、その「正常に機能しています」という警告が正常に送信されます。次に、そのデータを取得して、ユーザーメタに追加したいと思います。しかし、それは私を混乱させます。そして、そのナンスは何ですか?誰でも私を正しい方向に導くことができますか?

1
Ramesh Pardhi

わかった! WordPressは最高です。また、knif3r、ありがとうございます、あなたの提案は私を大いに助けます。私の言葉で説明しようとしています。私が間違っている場合、私を修正してください。

ノンスとは?

Nonceは、攻撃やミスを防ぐためのセキュリティハッシュのようなものです。 ajaxリクエストがWebサイトから来ているかどうかを確認するための一意の識別子を作成します。 WordPress語で

ナンスは、悪意のあるまたはその他の特定のタイプの誤用からURLおよびフォームを保護するのに役立つ「1回使用される番号」です。 WordPress nonceは数字ではありませんが、数字と文字で構成されるハッシュです。また、一度しか使用されませんが、有効期限が切れるまでの「存続期間」は限られています。

使用方法

  1. まず、wp_enqueue_script()を使用してjsファイルを適切に追加する必要があります。このようなもの:

    function wpdocs_theme_name_scripts() {
        wp_enqueue_script( 'script-name', get_stylesheet_directory_uri().
            '/js/ajxfile.js', array(), '1.0.0', true );
    }
    add_action( 'wp_enqueue_scripts', 'wpdocs_theme_name_scripts' );
    

ajxfile.jsという名前でscript-nameファイルを登録します。これで、ワードプレスのすべてのページにロードされました。

  1. 次に、wp_localize_script()を使用して変数を宣言する必要があります。ここで、関数で使用するnonceを追加します。

    function wpdocs_theme_name_scripts() {
        wp_enqueue_script( 'script-name', get_stylesheet_directory_uri() . 
            '/js/ajxfile.js', array(), '1.0.0', true );
        wp_localize_script('script-name', 'ajax_var', array(
            'url' => admin_url('admin-ajax.php'),
            'nonce' => wp_create_nonce('ajax-nonce')
        ));
    }
    

スクリプトを正常に登録およびローカライズしました。

  1. 次に、関数をスクリプトにバインドします。だから私はこれを使った

    add_action('wp_ajax_nopriv_script-name', 'script_name');    
    add_action('wp_ajax_script-name', 'script_name');
    

関数をwordpressフックにバインドするために、wp_ajax_nopriv_wp_ajax_を使用しています。 2番目のフックはユーザーがログインしたときに起動され、最初のフックはログインしていないときに起動されます。

  1. 私たちの機能はこのようになります

    function script_name() {
        // Check for nonce security
        $nonce = $_POST['nonce'];
    
        if ( ! wp_verify_nonce( $nonce, 'ajax-nonce' ) )
            die ( 'Busted!');
    }
    

この関数は、ajaxデータがnonceの非表示データを他のパラメーターとともに送信しているかどうかを確認します。そうでない場合は、エラーが発生します。これは、Ajax攻撃を防ぐのに本当に役立ちます。 Nonceデータは非表示の値であり、他のパラメーターで送信する必要があります。

動作しているかどうかを確認する方法?

  • 'nonce' => wp_create_nonce('ajax-nonce')からwpdocs_theme_name_scripts()を削除し、リンクをクリックします。エラーが表示されます。
  • 次に、機能からセキュリティチェックを削除し、リンクをクリックします。それが動作します。

これは、nonceデータがない場合、nonceのセキュリティチェックを使用した関数が機能しないことを示しています。隠されているため、他の誰も使用できません。そして、誰もそれを知らない場合、そのajaxを何回実行しても、私たちの機能はそれらに応答しません。

英語が下手で説明が下手で申し訳ありません。助けようとしています。私が何かを見逃しているのか、何か間違ったことをしているのか教えてください。

6
Ramesh Pardhi