将PHP脚本的执行限制为一个引用器


Restrict the execution of a PHP script to one referer

我正在构建一个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专家,所以谁能告诉我这是好还是不好,如果它会在某些条件下失败?

这个脚本要防止的是跨站点请求伪造CSRF。检查referer是针对这种攻击的两个主要防御之一。唯一的问题是,如果网站有任何用户生成的内容,那么他们可以添加一些东西,如:

<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攻击的唯一原因。

AJAX已经通过同源策略实现了基于浏览器的保护。您根本不需要推荐人检查

你也可以使用。htaccess文件来阻止外部主机的访问。

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

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

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

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