将PHP脚本的执行限制为一个referer

时间:2011-09-02 23:35:45

标签: php ajax

我正在构建一个ajax / PHP脚本,我想出了一些东西来保护ajax文件免受外部访问,我的意思是限制从另一个服务器(和域)执行脚本。我正在使用JQuery $ajax发布到PHP文件。

这是PHP文件:

 <?php
 $config["url"]="mysite.com";
 if (isset($_SERVER["HTTP_REFERER"])) {
     $url = parse_url($_SERVER["HTTP_REFERER"]);

     if ($url["host"] != $config["url"]) {
         echo "You don't have access to this file.";
         exit;
     } else { 
         //Run The script
     }
 }
 ?>

这个脚本基本上做的是它匹配Referer和域。如果脚本不匹配,脚本将退出,如果匹配则运行。因此,脚本只能从mysite.com而不是从其他地方执行。

我不是PHP / Javascript专家,所以任何人都可以告诉我这是否好,以及它是否会在某些情况下失败?

4 个答案:

答案 0 :(得分:0)

AJAX已通过同源策略进行基于浏览器的保护。您根本不需要参考检查。

答案 1 :(得分:0)

您还可以使用.htaccess文件阻止来自任何外部主机的访问。

<Files ~ "^\yourajaxfilename.extension">
Order allow,deny
Deny from all
</Files>

有关详细信息http://www.htpasswdgenerator.com/apache/htaccess.html

答案 2 :(得分:0)

请记住,人们可以在浏览器中加载页面,然后使用大多数浏览器中内置的Javascript控制台加载您的ajax页面,提供他们想要的任何获取/发布数据。还有其他方法伪造推荐人。

基本上,您的方法将对非技术用户起作用,但您仍需要验证所有传入的数据,以确保它不会导致您的脚本执行您不希望它执行的操作。

答案 3 :(得分:0)

此脚本正在防范的是跨站请求伪造 CSRF 。检查引用者是抵御此攻击的两个主要防御之一。唯一的问题是,如果网站有任何用户生成的内容,那么他​​们可以添加如下内容:

<img src="/src/to/your/ajax?params=something_evil" />

仍将执行它。 第二种最常见的预防方法是为ajax使用CSRF令牌。 这里有两个资源可供阅读以了解有关此攻击的更多信息:

说明:https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF

预防:https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet

修改

稍微澄清一下,可能会对这个主题产生混淆。

任何用户都可以伪造引用标头,但这是无关紧要的。它无关紧要的原因是,如果他们能够伪造引用者,他们就可以轻松地提出合法的请求。

这里的重要部分是确保他们无法伪造任何其他用户的请求。这是唯一重要的方面,也是检查引用者和防止CSRF攻击的唯一原因。