【问题标题】:Secure files from direct access保护文件免受直接访问
【发布时间】:2012-07-29 16:03:49
【问题描述】:

我托管了一个站点,文件建议将文件放在文件夹public_html 下。 我在根文件夹中有三个文件index.php(查看页面)、common.jsresult.php(php)。单击index.php(view) 文件中的按钮时,将触发result.php 的ajax 函数。

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

我试图制作文件夹结构,所有 php 文件(result.php)都在根目录后面的文件夹中。所以它不会使用重写规则或其他任何东西直接从浏览器访问。

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

【问题讨论】:

  • 尝试在public_html/之前添加文件

标签: php security .htaccess


【解决方案1】:

要使文件只能通过 ajax 访问,您可以使用:

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

它返回真或假。基本上,如果它返回 true,则让用户继续,否则停止它们。

注意事项:并非所有 JS 库/框架实际上都设置了此标头,但大多数(JQuery、Mootools 等)都设置了此标头,而且并非所有版本都设置了此标头,因此请确保在使用此标头之前您拥有最新版本的库/框架。

另外,如果用户欺骗了您的标题,那么就没有真正的方法可以阻止它们。

我倾向于将此作为阻止 AJAX 页面公开可见的前兆。我还使用参数完整性检查和存储在会话中的随机哈希(CSRF 类型的东西)来检查用户是否合法地访问 AJAX 页面。

【讨论】:

  • 这并不保证请求是通过 XMLHttpRequest 发出的。它只保证客户端发送了一些标头,如果他试图欺骗请求,这将毫无意义。
  • @Vatev 那么如果用户欺骗标题怎么办,CSRF 是这个问题未涵盖的另一个主题。大多数框架都会发送此标头,如果设置了此标头,那么现在不是这样,这是了解用户是否通过浏览器进入页面的第一步。因此,它满足了 OP 的问题。如果他想要万无一失的保护,那么他应该阅读 CSRF。
  • '问题是每个人都可以直接访问 result.php' - 你的解决方案没有解决这个问题,更糟糕的是它看起来确实如此。有人可能会认为它有效,并将其用于被认为是安全的东西。
  • @Vatev Ha 用户的问题已更改为其他含义。标题和内容原文如下:“保护 php 文件,防止直接从浏览器访问”
【解决方案2】:

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

  1. 存储用户有权访问的内容(在 index.php 中)。
  2. 在 (result.php) 中检查他是否可以访问它

【讨论】:

  • 如果他没有会话怎么办?如果没有用户之间的区别,他希望页面对所有用户公开,除了那些通过浏览器访问的用户。这不会解决他的任何问题......
  • @Sammaye 和 Vatev:我没有会话,不区分用户,我希望页面对所有用户公开,除了 ajax php 文件不能直接从浏览器访问...
  • 在这种情况下,请使用@Sammaye 的答案,并警告它只有在客户遵守规则时才有效。
  • 如果我使用session,客户端的不公平活动可以停止吗?在这里使用会话更好吗?
  • @JustinJohn 不。因为 AJAX 调用在 HTML 中是静态的(所以没有办法真正动态地改变它的绑定,除非你制作一个超级复杂的脚本来做到这一点)唯一真正的方法就是如果他们欺骗标题,接受用户将能够进入 AJAX 页面。有时候,只是有些事情你仍然无法停止......
【解决方案3】:

您不能通过 ajax 访问文件,然后无法通过正确的浏览器请求访问文件,因为 Ajax 调用的行为与网络浏览器相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-23
    • 1970-01-01
    • 2020-02-25
    • 2013-01-03
    • 2012-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多