2016-06-08 64 views
3

在我开始讨论这个问题之前,让我解释一下我们如何设置事物。Ajax内部的wordpress安全

我们有一个proxy.php文件,其中类代理已与在休息创建/编辑/获取WordPress的职位,领域等

然后调用函数的定义,我们有一个proxyhandler.php,其中Proxy类被初始化并充当proxy.php和JavaScript文件之间的句柄。

在JavaScript文件中,我们有一个ajax调用proxyhandler.php,我们发送我们的秘密和其他数据。

现在,问题出现在这里: 我们通过使用md5自定义字符串+时间戳记来定义秘密,通过wp_localize_script。我们通过ajax发送经过描述的字符串和时间戳记到代理处理程序,在那里我们使用先前的(硬编码的内部代理处理程序)字符串和时间戳记再次生成一个md5字符串,然后检查针对所生成的字符串发送的那个字符串。如果他们是一样的,我们会继续做任何要求的事情,如果他们不合适的话,我们只是回到秘密不匹配。

现在真正的问题来了 - 通过使用wp_localize_script,秘密的变量是全局的,任何人都可以通过开发工具使用它,并可以发送任何ajax请求到他们想要的代理处理器。

什么是正确的程序,使其更安全?我们已经这样想了: 我们不是使用wp_localize_script,而是将脚本放在一个php文件中,我们使用一个php变量定义秘密,然后简单地将秘密文件回显到ajax中。这是否可行?还是有其他方法?

回答

1

而不是发送在全球范围内的加密字符串,然后对证,你应该在你的AJAX请求使用nonce

var data = { 
    action: 'your_action', 
    whatever_data: who_know, 
    _ajax_nonce: <?= wp_create_nonce('your_ajax_nonce') ?> 
}; 

然后,使用check_ajax_refer()验证现时:

function your_callback_function() 
{ 
    // Make sure to verify nonce 
    check_ajax_refer('your_ajax_nonce'); 

    // If logged in user, make sure to check capabilities. 
    if (current_user_can($capability)) { 
     // Process data. 
    } else { 
     // Do something else. 
    } 
    ... 
} 

取决于AJAX 方法,您可以使用$_METHOD['whatever_data']检索who_know数据,而无需使用wp_localize_script()

还记得我们可以在用户只允许记录的过程AJAX数据:

// For logged in users 
add_action('wp_ajax_your_action', 'your_callback_function'); 

// Remove for none logged in users 
// add_action('wp_ajax_nopriv_your_action', 'your_callback_function'); 

的最后一件事是确保在您的wp-config.phpNONCE_KEYNONCE_SALT是安全的。

+0

但是每个人都可以看到_ajax_nonce,因为它是在HTML内部打印的,所以如果你知道如何从控制台手动调用ajax,你可以提供这个随机数并通过? (ajax不限于登录用户) – trainoasis

+0

@trainoasis这只是nonce动作名称。真正的是哈希和隐形。您可以查看[wp_verify_nonce()](https://developer.wordpress.org/reference/functions/wp_verify_nonce/#source-code)了解更多信息。 – MinhTri