web-dev-qa-db-ja.com

通常のajaxリクエストメソッドは安全ですか、それともadmin-ajax.phpを使うべきですか?

ホームページに私はいくつかのリンクがあります:

<a class="link" data-id="1">first link</a>
<a class="link" data-id="2">second link</a>
<a class="link" data-id="3">third link</a>

これらのリンクの1つをクリックしたら、データベースを更新してその投稿のビュー列を増やすために、ajaxリクエストをphpファイルに送信します。

$(document).ready(function(){
    $(document).on('click', '.link', function(e){

        var post_id = $(this).data('id');

        $.ajax({ 
            url: "views.php",
            type: 'POST',
            data: {id: post_id},
            success: function(){
                alert("done");
        }}); // ajax

    }); // on click

}); // ready

Views.php:

//Check if the id is posted.
if( isset($_POST['id']) ){

    //Assigning the id to a variable.
    $id = $_POST['id'];

    //Check if the id is an integer.
    $pattern = '/[0-9]/';
    if( preg_match($pattern, $id) ){

        //Check that the user didn't visit that post before.
        $post_cookie = 'p_' . $id;
        if( !isset($_COOKIE[$post_cookie]) ){

            //Insert or update if the post id exists.
            $query = $conn->prepare('INSERT INTO posts (id, views) VALUES (:id, 1) ON DUPLICATE KEY UPDATE views = views+1');
            $query->bindValue(':id', $id, PDO::PARAM_INT);
            $query->execute();

            //Set a cookie with the post id to indicate that the post is viewed.
            setcookie( $post_cookie, '1');

        }// No cookie with that name (the user didn't visit that post).
    } // id matches the pattern.
} // id is posted.

ビューを追加/更新するためにposts id以外の他のオプションを使用することもできますが、その方法が安全であるかどうか、またはadmin-ajax.phpを使用する必要があるかどうか疑問に思います。

投稿は、WordPress投稿ではなく、Databaseからのカスタム投稿です。

2
Dan

OMG ...いいえ、いいえ、いいえ!!!このようにしないでください...

どうして?多くの理由があります...

  1. views.phpのユーザーに対しては何もできません-匿名(ログインしていない)ユーザーによるビューのみをカウントする必要がある場合はどうなりますか?

  2. table_prefixが ''に設定されている場合はどうなりますか? postsテーブルは競合を引き起こします...

  3. DB接続で動作するプラグインがある場合はどうなりますか?スクリプトは間違ったDBに接続するか、他の競合を引き起こします。

  4. セキュリティ上の理由でスクリプトを実行できない場合はどうでしょうか?

  5. 他にも多くの理由があります。なぜこのようにしないのか...

ベストプラクティスと標準を持つ理由があります。そして、すべての開発者の生活は、誰もがこれらの標準と慣行に従ってコーディングしている場合、はるかに簡単で素晴らしいです...このように、すべてのAJAX呼び出しなどを簡単にデバッグできます...

はい、間違いなくadmin-ajax.phpwp_localize_script、および$wpdb、および適切なSQLエスケープなどを使用する必要があります...

違いは何ですか? ajax関数はユーザーに表示されませんか?

はい、表示されます。しかし...これは標準のAJAX呼び出しではないため、理解するのが難しくなります...

簡単な実験をしてみましょう...これらの2つのコードを見てみましょう。

1。

add_action( 'wp_ajax_get_post_status', 'ajax_get_post_status_callback' );
function ajax_get_post_status_callback() {
    $id = $_POST['id'];
    $post = get_post( $id );

    if ( $post ) {
        echo $post->post_status;
        die;
    }

    echo 0;
    die;
}

2。

include "ustawienia-polaczenia.php";
$i = $_POST['id'];
$wiersz = PostsQuery()::create()->filterById( array($i) )->find();
if ( $wiersz ) {
    echo $wiersz->post_status;
    die;
}

echo 0;
die;

どちらが読みやすいですか?私は最初のものを賭けた。どうして? WPコア関数を使用しており、誰もがその仕組みを知っているためです。 get_post関数が何をするかなどを知っています(または簡単に確認できます)。このコードは、すべてのフィルターとアクションも尊重します-したがって、他のプラグインとの競合は発生しません...

一方、2番目のコードはごちゃごちゃです...他のファイルが含まれており、奇妙なDB接続を使用しています(はい、Propelです)。同じDBであるか、他のDBであるか、およびどのように正確に機能するかを推測することはさらに困難です。そして、他のプラグインを完全に無視します...

そうです-あなたのコードが奇妙なAJAXを送信し、どのファイルがそれを処理するのかを誰もが知るでしょう。問題は、奇妙な/カスタムコードのデバッグに多くの時間がかかることです...そして、コードが問題や競合を引き起こす可能性がはるかに高くなります...

3