PHP:帮助安全/过滤ajax调用

Rog*_*ger 0 php security ajax jquery

我试图找到一种方法来过滤ajax调用,以便为我的应用程序添加一个很好的安全层.代码是否有任何意义?

function is_ajax(){//Help Secure Ajax Calls
    if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH']=='XMLHttpRequest') return;
    else die;//no ajax
}
Run Code Online (Sandbox Code Playgroud)

我的梦想只是让我的服务器(htm或php)中的文件通过ajax访问另一个php文件.

我想知道下面的代码是否会做得更好:

if(strpos($_SERVER['REQUEST_URI'],'http://')) die;//Help Secure From URL Include Attacks
Run Code Online (Sandbox Code Playgroud)

谢谢.

rmo*_*ero 7

由于AJAX调用始终来自浏览器,因此请求不是来自您自己的服务器,而是来自客户端计算机.即使您设置了自定义标头,也可以在客户端轻松操作这些标头.

如果您的目标是仅允许自己的脚本访问包含ajax内容的脚本,我建议生成一个仅对某个请求的URL和指定时间有效的令牌字符串.

快速而肮脏的例子:

请求AJAX资源的脚本:

$secret ="ABC1232";

$item = array(
  "time"=>time(),
  "token_id"=>"<page_url>"
);

$signed = base64_encode(hash_hmac("sha256",json_encode($item),$secret));
$item = base64_encode(json_encode($item));

$ajax_url = "myscript.php?signed=$signed&item=$item";
Run Code Online (Sandbox Code Playgroud)

AJAX资源,检查令牌是否有效

$item = json_decode(base64_decode($_REQUEST["item"]));

$timeout = 3600;

if($item->time < (time()-$timeout)){
  die("Invalid token - timeout");
}

if($item->token_id !== "<page_url>"){
  die("Invalid token - page url");
}

$secret ="ABC1232";
$valid = ($_REQUEST["signed"] === base64_encode(hash_hmac("sha256",json_encode($item),$secret));

if(!$valid){
  die("Invalid token");
}
Run Code Online (Sandbox Code Playgroud)