2013-06-22 70 views
0

我有一个ajax.php文件,我的所有ajax调用都指向一个额外的当前调用脚本需要执行的参数。我的问题是,我想限制某些脚本仅由特定页面执行,例如sendComment.php应该只能从www.mysite.com/user/{any user}调用。执行之前的Ajax验证页面

我所做的是把这个代码在每个脚本的顶部,我想限制:

if(strstr($_SERVER['HTTP_REFERRER'],'mysite.com/{page_allowed_to_exec_script}'){ 
    Then do stuff here 
} 

但是我来有什么要注意的是,并不是所有的浏览器都支持HTTP_REFERRER(我可能有拼写错误,我正在通过记忆来写这篇文章),而且也不是跨浏览器,它也是一个痛苦的屁股,不得不在所有文件中对这些东西进行硬编码,并且当它变得更大时来改变的东西..我正在寻找一种方式,我可能会拥有所有能够执行它们的页面的数组中的所有脚本,并在开始时执行ajax.php文件中的检查。

有没有人有任何想法这可以实现?

+1

一般来说,您不限制可以访问服务器端资源的*页*,限制可以访问它的*用户*。身份验证cookie等事情仍然通过AJAX请求发送,因此您可以像限制任何其他页面请求一样限制用户访问。真的没有理由限制请求来自哪个页面。 – David

+0

不,我限制页面,而不是用户。我刚刚举了一个用户页面的例子。同样的脚本'sendComment.php'不应该能够从其他地方调用,比如说'www.mysite.com/home'例如 –

+0

这就是我的观点,你是在倒退。限制页面不正确。特别是因为在服务器上确实没有可靠的方法来了解客户端上当前的“页面”,如果有的话。你的AJAX服务应该只是API调用,不需要关心他们被调用的方式或内容,除了任何必要的用户认证和授权之外。 – David

回答

1

即使所有的浏览器都不能发送“引用者”,因为某种“代理”,“防火墙”或“安全”套件剥离了它甚至改变了它。所以你可以信任它。

如果您控制引荐页面,您可以使用会话,cookie或URL传递信息,如果您觉得这是至关重要的。如果这绝对是至关重要的,那么唯一的选择就是会话。其他两个可以很容易地删除。

+0

这就是我最初的想法,但我希望不必使用会话。我在整个项目中都避免了这一点:< –