2016-06-08 70 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