安全的Ajax调用

时间:2016-10-03 10:10:07

标签: php jquery ajax datatables

我有一个带服务器端处理的dataTable,但我不知道如何保护ajax调用,因为如果有人去了ajax php文件就可以读取所有内容。

这是我的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 )
);

如何发出哈希/令牌请求?

2 个答案:

答案 0 :(得分: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-Requested-With:XMLHttpRequest”

答案 1 :(得分:1)

您只需查看HTTP_REFERER即可。 HTTP_REFERER被浏览器覆盖,无法更改,这意味着您无法伪造请求,因为它是从您的脚本中调用的。因此,如果合法访问您的脚本的页面名称(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脚本的第一行。