問題描述

我意識到隨機檢查意圖,但是如果我可以使用它們來限制數據庫讀取,那麼這個意思是不會有意義的?我的意思是,我使用 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。