2011-09-02 41 views
1

我正在构建一个ajax/PHP脚本,我想出了一些方法来保护外部访问的ajax文件,我的意思是限制脚本的执行从另一个服务器(和域)。我正在使用JQuery $ajax发布到PHP文件。限制一个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 
    } 
} 
?> 

基本上这是什么脚本做的是,它引用站点和域相匹配。如果脚本不匹配,该脚本将退出,如果有脚本则会运行。所以脚本只能从mysite.com执行,而不能从别处执行。

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

+0

http://codereview.stackexchange.com/ –

+0

使用会话... – dqhendricks

回答

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

+0

非常感谢您的帮助。 – Kbr89

+0

这显然是错误的。我对CSRF的保护知之甚少,但即使在我的知识水平有限的情况下,我也会说检查引荐者肯定不是一种有效的保护手段。我从来没有研究过如何伪造引用者,但我知道如何去做甚至没有尝试,所以我假设其他更专注和更坚定的用户将能够做他们想做的任何事情......无论如何,长时间的评论减少总之,这个答案必须是错误的。 – Layke

+0

+1链接很有用。 – Herbert

0

AJAX通过同源策略已经具有基于浏览器的保护。根本不需要引用检查。

+0

如果有人复制我的jquery ajax脚本,然后从另一个网站使用它,PHP脚本不会执行? – Kbr89

+0

@小偷是对的,但我没有看到任何伤害是彻底的。安全是关于冗余的。 +1我可以建议你将标题改为“跨域的AJAX安全性”或类似的内容吗?我认为对于需要类似问题帮助的人来说,这会更具描述性。只是一个建议。 :) – Herbert

+0

@ThiefMaster假设它通过AJAX请求。但是你仍然可以向服务器端发出请求 – Yahel

0

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

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

详情http://www.htpasswdgenerator.com/apache/htaccess.html

+0

非常感谢您的帮助。 – Kbr89

+0

这将检查用户的ip,而不是引用者。所以除非你有一个非常有限的用户基础,静态ips这不是真的可用。 – ThiefMaster

+0

基本上拒绝所有将阻止访问所有外部来源及其要求的内容。 –

0

请记住,人们可以在浏览器中加载一个页面,然后使用内置于大多数浏览器的JavaScript控制台来加载你的Ajax网页,提供任何GET/POST数据,他们想。还有其他方法来伪造引荐来源。

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

+0

非常感谢您的帮助。 – Kbr89

相关问题