it-swarm.com.ru

Безопасен ли обычный метод запроса 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>

Когда щелкают по одной из этих ссылок, я хочу отправить 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.

Я мог бы использовать другие опции, кроме идентификатора постов, для добавления/обновления представлений, но мне интересно, безопасен ли этот способ, или я должен использовать admin-ajax.php.

Посты - это пользовательские посты из базы данных, а не посты WordPress.

2
Dan

OMG ... Нет, нет, нет !!! Никогда так не делай ...

Зачем? Есть много причин...

  1. Вы не сможете ничего сделать с пользователями в вашем views.php - что если вам придется считать только просмотры анонимных (не авторизованных) пользователей?

  2. Что если table_prefix установлено в ''? Ваша таблица posts вызовет конфликты ...

  3. Что делать, если есть некоторые плагины, которые работают с подключением к БД? Ваш скрипт подключится к неправильной БД или вызовет другие конфликты.

  4. Что, если по соображениям безопасности ваш скрипт не будет запущен?

  5. Есть много других причин, почему вы не должны делать это таким образом ...

Есть причина для того, чтобы иметь лучшие практики и стандарты. И жизнь всех разработчиков намного проще и приятнее, если все пишут код в соответствии с этими стандартами и практиками ... Таким образом, легко отлаживать все AJAX вызовы и т.д. ...

Так что да, вам определенно следует использовать admin-ajax.php и wp_localize_script, $wpdb, правильное экранирование SQL и так далее ...

Какая разница? функция ajax не будет видна пользователям?

Да, это будет видно. Но ... это не будет стандартный вызов AJAX - так что будет сложнее понять ...

Давайте сделаем небольшой эксперимент ... Давайте посмотрим на эти два кода:

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 и так далее. Этот код также учитывает все фильтры и действия - поэтому он не будет генерировать конфликты с другими плагинами ...

С другой стороны, второй код - просто беспорядок ... Он включает в себя какой-то другой файл, использует странное соединение с БД (да, это Propel). Даже трудно догадаться, это та же БД или какая-то другая, и как именно она работает. И это полностью игнорирует любые другие плагины ...

Так что да - все увидят, что ваш код отправляет странное AJAX и ​​какой файл отвечает за его обработку. Проблема в том, что отладка вашего странного/нестандартного кода будет занимать гораздо больше времени ... И гораздо более вероятно, что ваш код создаст проблемы и конфликты ...

3
Krzysiek Dróżdż