问题描述
我意识到随机检查意图,但是如果我可以使用它们来限制数据库读取,那么这个意思是不会有意义的?我的意思是,我使用 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。