首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >常规的ajax请求方法是安全的还是我应该使用admin-ajax.php?

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

WordPress Development用户
提问于 2018-07-15 17:23:43
回答 1查看 373关注 0票数 2

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

代码语言:javascript
复制
first link
second link
third link

当单击其中一个链接时,我希望向php文件发送一个ajax请求,以更新数据库以增加该帖子的视图列。

代码语言:javascript
复制
$(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中:

代码语言:javascript
复制
//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.

我可以使用除post id之外的其他选项来添加/更新视图,但我想知道这种方式是否安全,还是应该使用admin-ajax.php。

这些帖子是来自数据库的自定义帖子,而不是WordPress posts

EN

回答 1

WordPress Development用户

发布于 2018-07-15 17:32:31

天哪..。不!千万别这样..。

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

  1. 您将无法对您的views.php中的用户做任何事情--如果您必须只计算匿名(而不是登录)用户的视图怎么办?
  2. 如果table_prefix设置为“”怎么办?您的posts表将导致冲突..。
  3. 如果有一些插件运行在DB连接上呢?您的脚本将连接到错误的DB或引发其他冲突。
  4. 如果出于安全原因,您的脚本将无法运行?
  5. 还有很多其他的原因,为什么你不应该这样做.

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

因此,您肯定应该使用admin-ajax.phpwp_localize_script,以及$wpdb,以及适当的SQL转义,等等.

有什么区别?ajax函数不会对用户可见吗?

是的,它是看得见的。但是..。它不会是标准的AJAX调用-所以很难理解.

我们来做个简单的实验..。让我们来看看这两个代码:

1.

代码语言:javascript
复制
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.

代码语言:javascript
复制
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连接(是的,它是推进的)。甚至很难猜测它是同一个DB还是其他DB,以及它到底是如何工作的。它完全忽略了其他插件..。

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

票数 3
EN
页面原文内容由WordPress Development提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://wordpress.stackexchange.com/questions/308635

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档