Php 安全Ajax调用
我有一个带有服务器端处理的数据表,但我不知道如何保护ajax调用,因为如果任何人访问ajax php文件,都可以读取所有内容 这是我的jquery: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
$(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调用)