我正在构建一个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数据。还有其他方法可以伪造推荐人。
基本上,您的方法将适用于非技术用户,但您仍然需要验证所有传入的数据,以确保它不会导致脚本执行您不希望它执行的操作。