2011-09-04 78 views
2

最简单地说,我利用我的整个客户的网站出于各种目的外部PHP脚本,如获取搜索结果,更新内容等如何防止外部PHP脚本的“手动执行”

我把这些脚本目录:

www.domain.com/scripts/scriptname01.php 
www.domain.com/scripts/scriptname02.php 
www.domain.com/scripts/scriptname03.php 

等。

我使用jQuery AJAX调用通常执行。

我想要做的是找到一段代码,它将检测(从内部)这些脚本是通过AJAX或手动通过URL从用户执行的文件执行。

这是否可能?

我已经绝对无处不在搜索,并尝试使用$ _SERVER []数组做的各种方法,但仍然没有成功。

+1

当您说URL和用户时,您的意思是一个典型的用户,他的技能不超出试验浏览器地址栏的含义,或者您的意思是一个更了解HTTP的用户,以及使用它? –

回答

3

我想要做的是找到一段代码,它会检测(从内部)这些脚本是通过AJAX或手动通过URL从用户执行的文件执行。

这是否可能?

不,没有100%的可靠性。您无法阻止客户端模拟Ajax调用。

虽然有一些标题可以测试,即X-Requested-With。他们会阻止不成熟的用户直接调用您的Ajax URL。请参阅Detect Ajax calling URL

+0

感谢您的帮助,我尽可能多地想(不是100%可靠)。它不是与安全的重大问题,因为我已经轰炸,我校对与MySQL有注射等,但任何其他方法,以防止黑客总是有用的脚本。 –

2

大多数AJAX框架将发送一个X-Requested-With:标头。假设你在Apache上运行,你可以使用apache_request_headers()函数来检索标题并检查它/解析它。

即便如此,没有任何东西可以阻止某人手动设置此标头 - 没有真正的100%万无一失的方法来检测此问题,但检查此标头可能与您获得的结果差不多。

根据您需要保护的内容以及为什么,您可能会考虑要求某种形式的身份验证,和/或使用独特的散列/ PHP会话,但这仍然可以由任何了解Javascript的人反向设计。

随着事情的想法,你可以验证,如果您服务的要求会得到一定程度的确定性(虽然不多,没有如果有人刻意cirumvent系统)之前,验证所有这些:

  • 唯一性的散列在会话中值,并要求其将通过AJAX调用返回给你(在cookie或请求参数),这样可以在服务器端对它们进行比较,以验证它们是否匹配
  • 检查X-Requested-With:头设置和值是切合实际
  • 检查User-Agent:标题与开始会话的标题相同

您检查的内容越多,攻击者就会越有可能在无法正确使用前感到无聊并放弃。同样,时间越长/更多的系统资源,将采取为每个请求服务...

1

还有就是防止用户没有100%可靠的方法,如果他知道你请求的地址,从调用脚本。

这就是为什么你必须每个请求脚本验证。如果您的脚本只能由经过身份验证的用户调用,请在脚本中再次检查身份验证。对待它,因为你会对待传入的用户输入 - 验证和消毒一切。

在编辑:同样可以说对于用户可以通过URL访问任何脚本。例如,请考虑profile.php?userid=3