我正在构建一个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专家,所以任何人都可以告诉我这是否好,以及它是否会在某些情况下失败?
答案 0 :(得分:0)
AJAX已通过同源策略进行基于浏览器的保护。您根本不需要参考检查。
答案 1 :(得分:0)
您还可以使用.htaccess文件阻止来自任何外部主机的访问。
<Files ~ "^\yourajaxfilename.extension">
Order allow,deny
Deny from all
</Files>
答案 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攻击的唯一原因。