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

时间:2011-10-31 12:28:41

标签: 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
}

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

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

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

感谢。

4 个答案:

答案 0 :(得分: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";

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");
}

答案 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");