WordPress Ajax Data Security

时间:2011-04-21 作者:Ashfame

我知道nonce可以检查意图,但如果我可以用它们来限制数据库读取,那就没有任何意义了?我的意思是,我正在使用AJAX从数据库中获取记录,但我不希望任何人通过其他方式获得该数据(向该数据库发布请求admin-ajax.php 第页)。

例如,在我的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调用?

Edit: @Bainernet感谢您的详细解释,非常感谢,但我的问题实际上是关于@Milo说了什么,我可以看到,除非我能为该请求创建一个唯一的nonce,否则我无法按照@goldenapples做任何事情。正当

我正在用Facebook JS SDK处理所有这些事情,所以所有必须做的事情都只使用AJAX(没有页面加载),以及我能想到的让用户登录的任何事情wp_signon() 任何人都可以在没有授权的情况下这样做。因此,对于一个实际使用该站点的用户来说,我没有任何唯一性,而一个试图读取一些数据而不是该站点的用户调用获取数据。无论我能做什么,让它登录或任何事情,都可以被其他人复制。有人能想到什么吗?

Update: 我想我已经找到了一个解决方法action 并使用PHP SDK从Facebook获取其他参数。但我仍然愿意就此提出建议或其他任何建议。

3 个回复
SO网友:Bainternet

您可以做一些事情来提高安全性:

首先,Ajax调用应该使用WordPress nonce,如您所说:

<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()\'s(FIRST CHECK) 然后使用该动作和动作挂钩调用自己的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\');
如果您希望登录的用户和未登录的访问者都访问此功能,请使用两个挂钩(第二个检查)。

然后,在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));

SO网友:Rarst

我不完全确定这有多安全,但WordPress Ajax处理程序是用户感知的(我猜请求仍然是请求,所以会检查Cookie,如果用户登录了,也会进行解释)。所以你可以像往常一样current_user_can() 签入它们。

SO网友:Milo

可能有人在发出此请求时登录了?您可以散列一些数据并在页面上创建一个唯一的每用户nonce,将其与ajax请求一起传递,并对照登录的用户进行检查。也许我误解了你在这里做什么。

结束