2016-10-03 4 views
1

私はサーバー側の処理でdataTableを持っていますが、誰かがajax PHPファイルにアクセスするとすべてのコンテンツを読むことができるので、ajaxコールを保護する方法がわかりません。セキュア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_REFERERをチェックすることができます。 HTTP_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で偽のヘッダーを送信するなどして変更することはできません。 HTTP_REFERERをCURLなどで "偽装"することができます。つまり、ソケットで実行されている特定の目的専用の専用スクリプトを作成することにより、 "攻撃者"はHTTP_REFERERを含める必要があることを知る必要があります。受理されます。 – davidkonrad

1

まず、ユーザーがログに記録されているかどうかは確認できません。レベルを持つユーザーを作成できます。管理者ユーザー、通常のユーザーと彼にアクセスコードを与える。この擬似コードを使用することができます。

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

if($access == false) return redirect; 

第2に、AJAX requirestのチェックを行うことができます。

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

} 

そして、これであなたは(などのログイン、アクセスレベル、のための)追加のチェックを行うことができますスコープ、しかし要求がAJAX経由して行われたかどうかを検出するために何が100%の方法はありません。誰かが

でヘッダを送信した場合でも、 "X-要求-付:XMLHttpRequestの"

+0

メインページのページのための@ ivant87私はuser_idでuserというセッション変数を設定し、インクルードされたページではhome.phpページで宣言された値が同じで唯一の場合は変数$ IncludeCheckをチェックしますページを表示する(すべてのページはホームページに含まれており、?page = PAGE1で呼び出されます) –