PHP:帮助保护/过滤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内容的脚本,我建议生成一个仅对某个请求的URL和指定时间有效的令牌字符串。

快速而肮脏的例子:

请求AJAX资源的脚本:

 $secret ="ABC1232"; $item = array( "time"=>time(), "token_id"=>"" ); $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 !== ""){ die("Invalid token - page url"); } $secret ="ABC1232"; $valid = ($_REQUEST["signed"] === base64_encode(hash_hmac("sha256",json_encode($item),$secret)); if(!$valid){ die("Invalid token"); } 

您的Ajax与应用程序层一样安全。 Ajax只是访问服务器端代码的客户端代码。 由于任何人都可以通过修改请求标头来模拟任何语言中的Ajax调用,因此可能无法以您希望的方式保护它。 大多数ajaxified框架还包括HTTP_X_REQUESTED_WITH,但它不是100%可靠。

只需保护您的服务器代码和您的好处。 如果您真的想让服务器代码知道它正在接收ajax调用,请在请求中使用参数。

假设AJAX可以请求的任何内容也将被直接访问,您将处于一个更安全的地方。 你真的应该考虑为什么你首先想要通过AJAX访问某些东西。 HTTP_X_REQUESTED_WITH标头不可靠且容易欺骗,因此无论如何它都不提供真正的安全性。

我认为为了更安全一点,你可以在编码之后解密你的秘密字符串。 然后回声比PHP中的解码字符串然后复制它。 然后在$ valid变量上

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