PHP:帮助保护/过滤ajax调用

PHP:帮助保护/过滤ajax调用,php,jquery,ajax,security,Php,Jquery,Ajax,Security,我正试图找到一种过滤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 } 我的梦想是只让服务器

我正试图找到一种过滤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
}
我的梦想是只让服务器中的一个文件(htm或php)通过ajax访问另一个php文件

我不知道下面的代码是否会更好:

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

谢谢。

您的Ajax与您的应用程序层一样安全。Ajax只是客户端代码访问服务器端代码。可能没有办法以您想要的方式保护它,因为任何人都可以通过修改请求头从任何语言中模拟Ajax调用。还有一件事,大多数ajaxified框架确实包含HTTP_X_请求,但它不是100%可靠的


只需保护您的服务器代码和良好的运行状态。如果您真的希望至少让服务器代码知道它正在接收ajax调用,请在请求中使用一个参数。

假设ajax可以请求的任何内容也将被直接访问,您将处于更安全的位置。你真的应该考虑为什么你只希望首先通过Ajax访问一些东西。HTTP_X_REQUESTED_和header是不可靠的,很容易被欺骗,因此它没有提供真正的安全性。

由于AJAX调用总是从浏览器发出,因此请求不是来自您自己的服务器,而是来自客户机。即使您设置了自定义标题,也可以在客户端轻松地对其进行操作

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

快速和肮脏的例子: 请求AJAX资源的脚本:
$secret=“abc232”;
$item=数组(
“时间”=>time(),
“令牌id=>”
);
$signed=base64_encode(hash_hmac(“sha256”,json_encode($item),$secret));
$item=base64_编码(json_编码($item));
$ajax_url=“myscript.php?signed=$signed&item=$item”;
AJAX资源,检查令牌是否有效
$item=json_解码(base64_解码($_请求[“item”]);
$timeout=3600;
如果($item->time<(time()-$timeout)){
die(“无效令牌-超时”);
}
如果($item->token\u id!==“”){
die(“无效令牌-页面url”);
}
$secret=“abc232”;
$valid=($_请求[“已签名”]==base64_编码(hash_hmac(“sha256”,json_编码($item),$secret));
如果(!$有效){
死亡(“无效代币”);
}

我认为为了安全起见,您可以在编码后解码您的秘密字符串。然后在php中回显比解码后的字符串,然后复制它。 然后在命令行上输入$valid变量

$valid = (base64_decode($_REQUEST["signed"]) === "blahblahblah that you copied from php");

抱歉,我有点困惑…我能不能至少测试一下请求是否来自一个文件,它实际上在服务器内部?请求不是来自文件,而是来自客户端。文件中引用的任何URL都可以被客户端直接引用。您可能需要从不同的角度来看待安全性,比如用户授权URL/请求。
$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");
}
$valid = (base64_decode($_REQUEST["signed"]) === "blahblahblah that you copied from php");