问题描述

我意识到随机检查意图,但是如果我可以使用它们来限制数据库读取,那么这个意思是不会有意义的?我的意思是,我使用 AJAX 从数据库中获取记录,但是我不希望任何人通过其他方式 (对 admin-ajax.php 页面的 POST 请求) 拥有该数据。

例如,在我的 AJAX 处理程序中,我有很多工作 (我发送 $myid 以及 AJAX 调用中的动作):

$myid = 5575;
$query = "SELECT `id` FROM table WHERE `user_id` = $myid;";
$data = $wpdb->get_col( $query );
echo json_encode($data);
die();

我通过 AJAX 调用这些数据,我如何保护它免受恶意用户的攻击,可以尝试对该页面进行直接 POST 调用?

感谢您的详细解释,感谢,但我的问题是真正的 @Milo 说,我可以看到,除非我可以创建一个独特的随机数请求,我不能按照 @goldenapples 做任何事情。对?

我正在使用 Facebook JS SDK 处理所有这些东西,所以必须完成的一切只有 AJAX(没有页面加载),无论我想到使用户登录 wp_signon()还是任何东西,任何人都可以做到这一点,没有权威。所以,在实际使用该网站的用户中,我没有任何唯一性,而该用户试图读取某些数据,而不是该网站进行拨号以获取数据。无论我做什么来使其登录或任何东西,这可以由其他人复制。有人会想到什么吗?

更新:我想我已经找到一个解决方法,只需通过 action 调用它,并从 Facebook 使用 PHP SDK 获取其他参数。但是,我仍然对此提出建议或任何其他建议。

最佳解决方案

您可以采取一些措施来增强安全性:

首先,Ajax 称它为自己应该用一个 WordPress 的随便,如你所说:

<script type="text/javascript" >
    jQuery(document).ready(function($) {
        var data = {
            action: 'ACTION_NAME',
            Whatever_data: 1234,
            _ajax_nonce: <?php echo wp_create_nonce( 'my_ajax_nonce' ); ?>
        };
        $.post(ajaxurl, data, function(response) {
            alert('Got this from the server: ' + response);
        });
    });
</script>

在上面的代码中,action_ajax_nonce 都是需要验证调用 admin-ajax.php 的两个属性,在前几行代码中检查一个操作是否被发送到服务器,如果没有,那么 die()的第一次检查) 然后使用这个动作你有一个动作挂钩你称之为自己的 ajax 函数:

//if you want only logged in users to access this function use this hook
add_action('wp_ajax_ACTION_NAME', 'my_AJAX_processing_function');

//if you want none logged in users to access this function use this hook
add_action('wp_ajax_nopriv_ACTION_NAME', 'my_AJAX_processing_function');

如果您希望登录的用户和没有登录的访问者访问此功能,则使用两个挂钩 (SECOND CHECK) 。

那么在你的 ajax 功能你应该做的第一件事是检查 ajax 引荐人 (第三检查):

function my_AJAX_processing_function(){
   check_ajax_referer('my_ajax_nonce');
   //do stuff here
}

接下来当使用用户输入在数据库上运行查询时,应该使用 $wpdb->prepare 进行转义和验证,而不是:

$query = "SELECT `id` FROM table WHERE `user_id` = $myid;";
$data = $wpdb->get_col( $query )

使用:

$data = $wpdb->query( $wpdb->prepare("SELECT `id` FROM table WHERE `user_id` = %d",$myid));

次佳解决方案

我不完全确定这是多么的安全,但是 WordPress 的 Ajax 处理程序是 user-aware(我猜请求仍然是请求,所以 cookies 被检查,如果用户登录,这是占了) 。所以你可以通常使用 current_user_can()来检查它们。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。