我有一个带服务器端处理的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 )
);
如何发出哈希/令牌请求?
答案 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)是
(通过回显$_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
脚本的第一行。