PHP:帮助保护/过滤ajax调用
我正试图找到一种过滤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 } 我的梦想是只让服务器
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");