Php 安全Ajax调用

Php 安全Ajax调用,php,jquery,ajax,datatables,Php,Jquery,Ajax,Datatables,我有一个带有服务器端处理的数据表,但我不知道如何保护ajax调用,因为如果任何人访问ajax php文件,都可以读取所有内容 这是我的jquery: $(document).ready(function() { $('#netflow').DataTable( { aaSorting: [[ 5, "desc" ]], responsive: { details: { renderer: function ( api

我有一个带有服务器端处理的数据表,但我不知道如何保护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();
        } );
    } );
} );
$(文档).ready(函数(){
$('#netflow')。数据表({
A排序:[[5,“描述”]],
响应:{
详情:{
渲染器:函数(api,rowIdx){
var data=api.cells(rowIdx,':hidden').eq(0).map(函数(单元格){
var header=$(api.column(cell.column.header());
返回“

”+header.text()+”:“+api.cell(cell.data()+”

”;//更改详细标记。 }).toArray().join(“”); 返回数据?$('')。追加(数据):false; } } }, 处理:对, 服务器端:是的, ajax:“/adm/includes/netflow_processing.php”, } ); var-oTable=$('#netflow').dataTable(); var table=$('#netflow').DataTable(); $('#netflow_filter input').unbind(); $('#netflow_filter input')。绑定('keyup',函数(e){ 如果(e.keyCode==13){ 可旋转的.fnFilter(此.value); } }); //Añadir filtro para cad acelda $('#netflow tfoot th')。每个(函数(i){ $(this.html(“”); } ); //适用于卡达塞尔达的过滤器 table.columns().eq(0).each(函数(colIdx){ $('input',table.column(colIdx).footer()).on('keyup change',function(){ 桌子 .列(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 )
);

首先,我看不到任何用户是否已登录的检查,或者其他检查。您可以创建具有级别的用户。管理员用户,普通用户,并给他访问代码。您可以使用这个伪代码

$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-request-With:XMLHttpRequest”


您只需检查
HTTP\u REFERER
<代码>HTTP_REFERER
被浏览器覆盖,无法更改,这意味着您不能伪造从脚本中调用的请求。所以,若合法访问脚本的页面(referer)的名称是

(通过回显
$\u SERVER['HTTP\u REFERER']
检查脚本的调用内容),然后添加


正是我想要的,简单实用。非常感谢你@RaduRadu,
HTTP\u REFERER
可以很容易地修改,这将是攻击者在数据挖掘时首先要更改的内容,例如。@Gyrocode.com-这样的声明确实需要一些概念证明:)HTTP\u REFERER不能在浏览器中更改,例如通过使用AJAX发送伪造的头。您可以使用CURL或类似工具“欺骗”HTTP_REFERER,即创建一个专用脚本,仅用于在套接字上运行的特定目的,但“攻击者”仍需要知道他需要包括HTTP_REFERER和将接受的值。请参阅或。攻击者将创建专用脚本,无需猜测-引用者字段将匹配原始页面URL。正确的解决方案是使用令牌,请参阅,这是OP首先想到的。感谢@ivant87的主页页面,我用user_id设置了一个名为user的会话变量,在包含的页面中,我检查变量$IncludeCheck,如果home.php页面中声明的值相同,然后才显示页面(所有页面都包含在主页中,并使用?page=PAGE1调用)