2016-10-03 47 views
1

我有一個數據表與服務器端處理,但我不知道如何保護ajax調用,因爲如果有人去ajax PHP文件可以讀取所有的內容。安全的Ajax調用

這是我的jquery:

$(document).ready(function() { 
    $('#netflow').DataTable({ 
     aaSorting: [[ 5, "desc" ]], 
     responsive: { 
     details: { 
      renderer: function (api, rowIdx) { 
      var data = api.cells(rowIdx, ':hidden').eq(0).map(function (cell) { 
       var header = $(api.column(cell.column).header()); 
       return '<p style="color:#00A">'+header.text()+' : '+api.cell(cell).data()+'</p>'; // changing details mark up. 
      }).toArray().join(''); 

      return data ? $('<table/>').append(data) : false; 
      } 
     } 
     }, 
     processing: true, 
     serverSide: true, 
     ajax: "/adm/includes/netflow_processing.php", 
    }); 
    var oTable = $('#netflow').dataTable(); 
    var table = $('#netflow').DataTable(); 
    $('#netflow_filter input').unbind(); 
    $('#netflow_filter input').bind('keyup', function(e) { 
     if(e.keyCode == 13) { 
       oTable.fnFilter(this.value); 
     } 
    }); 
    // Añadir filtro para cad acelda 
    $('#netflow tfoot th').each(function (i) { 
     $(this).html('<input type="text"/style = "width: 100%; " placeholder="Filtra...">'); 
    }); 
    // Aplicar filtro al introducir en cada celda 
    table.columns().eq(0).each(function (colIdx) { 
     $('input', table.column(colIdx).footer()).on('keyup change', function() { 
      table 
       .column(colIdx) 
       .search(this.value) 
       .draw(); 
     }); 
    }); 
}); 

這是AJAX腳本:

<?php 

$table = 'netflow'; 
$primaryKey = 'id'; 

$columns = array(
     array('db' => 'flow_src', 'dt' => 0), 
     array('db' => 'flow_dst', 'dt' => 1), 
     array('db' => 'flow_proto', 'dt' => 2), 
     array('db' => 'out_packets', 'dt' => 3), 
     array('db' => 'in_packets', 'dt' => 4), 
     array('db' => 'flow_start', 'dt' => 5) 
); 

$sql_details = array(
    'user' => '6g43tfr3', 
    'pass' => 'XXXXXXXXX', 
    'db' => 'DBNAME', 
    'host' => 'bbdd.localdomain' 
); 

require('ssp.class.php'); 

echo json_encode(
    SSP::simple($_GET, $sql_details, $table, $primaryKey, $columns) 
); 

我怎樣才能讓一個哈希/令牌請求?

回答

1

你可以簡單地檢查HTTP_REFERERHTTP_REFERER被瀏覽器覆蓋,無法更改,這意味着您無法僞造請求,因爲它是從您的腳本中調用的。因此,如果該頁面(引薦)在法律上可以訪問你的腳本的名稱是

http://example.com/page42

(檢查你的腳本由呼應出$_SERVER['HTTP_REFERER']稱呼)再加入

<? 
if ($_SERVER['HTTP_REFERER'] != 'http://example.com/page42') { 
    header('HTTP/1.0 403 Forbidden'); 
    die('You are not allowed to access this script.');  
} 
... 

作爲您的/adm/includes/netflow_processing.php腳本的第一行。

+0

正是我想要的,簡單而實用。非常感謝你!。 –

+1

@RaduRadu,'HTTP_REFERER'可以很容易地被修改,例如當數據挖掘時攻擊者會首先改變。 –

+0

@ Gyrocode.com - 這樣的聲明確實需要一些概念驗證:) HTTP_REFERER不能在瀏覽器中更改,例如通過發送帶有AJAX的僞造標頭。你可以使用CURL或類似的方式來「欺騙」HTTP_REFERER,也就是通過創建一個專門用於在套接字上運行的特定腳本的腳本,但是「攻擊者」仍然需要知道他需要包含HTTP_REFERER,將被接受。 – davidkonrad

1

首先,我看不到任何檢查,用戶登錄或其他檢查。您可以創建具有級別的用戶。管理員用戶,普通用戶並給他訪問代碼。你可以使用這個僞代碼。

$access = false; 
$user == isAdmin() { 
$access = true; 
} 

if($access == false) return redirect; 

其次,你可以做一些AJAX檢查。

if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') { 
    /* special ajax here */ 

} 

並在此作用域可以進行額外的檢查(登錄,訪問級別等),但沒有100%的方式,如果請求是通過AJAX做檢測。即使有人發送帶有

頭 「X-請求 - 由於:XMLHttpRequest的」

+0

謝謝@ ivant87主頁面頁面我設置了一個會話變量user_id,並在包含的頁面中檢查變量$ IncludeCheck如果在home.php頁面中聲明的值是相同的,那麼只有我顯示頁面(所有頁面都包含在主頁中,並用?page = PAGE1調用) –