我试图找到一种方法来过滤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
感谢。
答案 0 :(得分:7)
由于AJAX调用始终来自浏览器,因此请求不是来自您自己的服务器,而是来自客户端计算机。即使您设置了自定义标头,也可以在客户端轻松操作这些标头。
如果您的目标是仅允许自己的脚本访问包含ajax内容的脚本,我建议您生成一个仅对某个请求的URL和指定时间有效的令牌字符串。
$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";
$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");
}
答案 1 :(得分:4)
您的Ajax与应用程序层一样安全。 Ajax只是访问服务器端代码的客户端代码。由于任何人都可以通过修改请求标头来模拟任何语言中的Ajax调用,因此可能无法以您希望的方式保护它。大多数ajaxified框架还包括HTTP_X_REQUESTED_WITH,但它不是100%可靠。
只需确保您的服务器代码安全即可。如果您真的想让服务器代码知道它正在接收ajax调用,请在请求中使用参数。
答案 2 :(得分:1)
假设AJAX可以请求的任何内容也将被直接访问,您将处于一个更安全的地方。你真的应该考虑为什么你只想要通过AJAX首先访问某些东西。 HTTP_X_REQUESTED_WITH标头不可靠且易于欺骗,因此无论如何都不提供真正的安全性。
答案 3 :(得分:0)
我认为为了更安全一点,你可以在编码之后解密你的秘密字符串。然后回声比PHP中的解码字符串然后复制它。 然后在$ valid变量
上$valid = (base64_decode($_REQUEST["signed"]) === "blahblahblah that you copied from php");