常规的AJAX请求方法安全吗?还是应该使用admin-ajax.php?

时间:2018-07-15 作者:Dan

在主页上,我有一些链接:

<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>
单击其中一个链接时,我想向php文件发送一个ajax请求,以更新数据库以增加该帖子的视图列。

$(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
在视图中。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帖子

1 个回复
SO网友:Krzysiek Dróżdż

天哪。。。不,不,不!!!永远不要这样做。。。

为什么?有很多原因。。。

您将无法对中的用户执行任何操作views.php - 如果您必须只统计匿名(未登录)用户的视图,该怎么办?

如果table_prefix 是否设置为“”?你的posts 表将导致冲突。。。

如果有一些插件在DB连接上运行会怎么样?您的脚本将连接到错误的数据库或导致其他冲突。

如果出于安全原因,您的脚本无法运行,怎么办?

还有很多其他原因,为什么你不应该这样做。。。

有理由制定最佳实践和标准。如果每个人都按照这些标准和实践进行编码,那么所有开发人员的生活就会变得更加轻松和美好。。。这样可以很容易地调试所有AJAX调用,等等。。。

所以是的,你绝对应该使用admin-ajax.phpwp_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 函数确实如此,依此类推。此代码还尊重所有过滤器和操作,因此不会与其他插件产生冲突。。。

另一方面,第二个代码就是一团糟。。。它包括一些其他文件,它使用一些奇怪的DB连接(是的,它是Propel)。甚至很难猜测它是同一个DB还是其他DB,以及它究竟是如何工作的。它完全忽略了任何其他插件。。。

所以,是的,每个人都会看到您的代码发送了一些奇怪的AJAX以及负责处理它的文件。问题是调试奇怪/自定义代码将花费更多的时间。。。您的代码很可能会产生问题和冲突。。。

结束

相关推荐

Xmlrpc.php返回405响应代码

我希望有人能帮上忙。一周前,我们在主页上的排名大幅下降。当我转到谷歌搜索控制台时,在删除前2天报告了一个新错误。第一个是xmlrpc。php返回405错误和wp admin/admin ajax。php返回400错误。我现在正在考虑修复错误,但我在另一个网站上看到的一个建议是用新下载的wordpress中的xmlrpc替换xmlrpc。我的问题是,这会把网站搞砸吗?如果您有任何关于避免其他错误的建议,我们也将不胜感激。谢谢这一切似乎都是在插件更新(工具集类型)时发生的,但网站是用它构建的,因此我无法禁用该