2012-07-29 70 views
0

我已经托管了一个站点,文件建议把文件放在文件夹public_html。 我在根文件夹中有三个文件index.php(查看页面),common.jsresult.php(php)。点击index.php(查看)文件中的按钮将触发一个ajax函数到result.php安全文件直接访问

的问题是每个人都可以直接访问该result.php ......

我试图使文件夹结构,所有的PHP文件(result.php)在后面的根文件夹。所以它不会直接从浏览器使用重写规则或其他任何方式进行访问。

请帮我解决这个问题...

+0

尝试添加文件之前,**的public_html/** – Julien 2012-07-29 16:09:42

回答

2

为了使文件只acccessible通过AJAX可以使用:

public static function isAjax() { 
    return (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH']=="XMLHttpRequest"); 
} 

它返回true或false。基本上,如果它返回true,那么让用户继续以其他方式停止它们。

谨慎的说法:并非所有的JS库/框架都设置了这个头文件,但大部分都是这样(JQuery,Mootools等),而不是所有的版本,所以在使用这个之前确保你有最新版本的库/框架。

此外,如果用户欺骗您的标题,那么没有真正的方法来阻止他们。

我倾向于使用它作为阻止AJAX页面公开显示的前兆。我还使用参数完整性检查和存储在会话中的随机散列(CSRF类型的东西)来检查用户是否正确地访问AJAX页面。

+0

这并不能保证请求是通过XMLHttpRequest发。它只保证客户端发送了一些头部,如果他试图欺骗请求,那么这意味着什么都没有意义。 – Vatev 2012-07-29 16:16:16

+0

@Vatev那么如果用户欺骗头文件,CSRF是另一个没有被这个问题覆盖的话题。这个标题是由大多数框架发送的,如果这个标题被设置,那么现在不是这样的日子是理解用户是否通过浏览器进入页面的第一步。因此,它满足了OP的问题。如果他想要防呆,那么他应该阅读CSRF。 – Sammaye 2012-07-29 16:18:58

+0

'问题是每个人都可以直接访问result.php' - 你的解决方案不能解决这个问题,并且让它看起来更糟。有人可能会认为它是有效的,并将其用于假定是安全的事情。 – Vatev 2012-07-29 16:22:39

0

您无法通过ajax访问文件,并且无法通过正确的浏览器请求访问文件,因为Ajax调用的功能与Web浏览器的功能相同。

1

您无法通过移动它来保护它,因为除了会话(或某种其他类型的令牌)以外,无法区分的请求是否由来自index.php的合法AJAX调用触发。
你需要使用PHP的会话(或等价的东西)至:

  1. 商店有什么用访问(在index.php中)。
  2. 检查他是否有访问它(result.php)
+0

如果他没有会话会怎么样?如果用户之间没有区别,他希望该页面对除了通过浏览器访问的用户以外的所有用户公开。这不会解决他的任何问题... – Sammaye 2012-07-29 16:21:42

+0

@Sammaye和Vatev:我没有会话,没有区分用户,我想公开页面的所有用户,除了AJAX PHP文件无法直接从浏览器访问... – 2012-07-29 16:27:20

+0

在这种情况下,请使用@Sammaye的答案,并且要注意,只有当客户按照规则进行游戏时才有效。 – Vatev 2012-07-29 16:29:27