【问题标题】:Secure Ajax call安全的 Ajax 调用
【发布时间】:2017-02-11 06:05:34
【问题描述】:

我有一个带有服务器端处理的数据表,但我不知道如何保护 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 )
);

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

【问题讨论】:

    标签: php jquery ajax datatables


    【解决方案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”

    【讨论】:

    • 感谢@ivant87 的主页页面我使用 user_id 设置了一个名为 user 的会话变量,并在包含的页面中检查变量 $IncludeCheck 是否在 home.php 页面中声明的值是相同,然后我才显示页面(所有页面都包含在主页中并使用 ?page=PAGE1 调用)
    【解决方案2】:

    您可以简单地检查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 脚本的第一行。

    【讨论】:

    • 正是我想要的,简单而实用。非常感谢!
    • @RaduRadu, HTTP_REFERER 可以很容易地被更改,这将是攻击者在数据挖掘时首先会更改的内容。
    • @Gyrocode.com - 这样的声明确实需要一些概念证明:) HTTP_REFERER 不能从浏览器中更改,例如通过发送带有 AJAX 的伪造标头。您可以通过使用 CURL 或类似方法“欺骗”HTTP_REFERER,即创建一个专门用于在套接字上运行的特定目的的脚本,但“攻击者”仍然需要知道他需要包含HTTP_REFERER 和当然接受哪个值。
    • Referer spoofingthis thead。攻击者创建专用脚本,无需猜测 - referrer 字段将匹配原始页面 URL。
    • 正确的解决方案是使用令牌,请参阅Cross-site request forgery - Prevention,这是 OP 一开始就想到的。
    猜你喜欢
    • 2013-07-15
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-15
    相关资源
    最近更新 更多