【问题标题】:Only allow script from server to access files只允许来自服务器的脚本访问文件
【发布时间】:2012-07-13 09:09:39
【问题描述】:

仅允许脚本运行或从 Web 服务器上的 PHP 文件获取请求。

  • 例如。你的网络服务器上有一个文件http://example.com/libs/comment.php
  • 只允许其他 PHP 或 JS 文件从该文件获取请求(意味着运行该文件并执行所需的结果)
  • 如果任何用户尝试直接访问此文件,他/她将收到错误或 404 任何其他消息

这里的comment.php 只是一个例子。 libs 文件夹包含大量文件,以上适用于所有文件。我的偏好是使用 .htacces 方法或像 666,777 等文件夹的模式重写。 我知道这不是一个真正的问题,只是为了提高安全性使网站几乎安全。

【问题讨论】:

  • 我猜 serverfault.com 上的人可以比我们更好地帮助你...
  • @rsplak 哎呀。其他的可以试试。感谢您的信息

标签: php security .htaccess


【解决方案1】:

嗯,最简单的方法是在前端控制器中定义一个常量(大概是 index.php):

define('SECURE', true);

然后,在任何包含文件的开头对其进行测试:

!defined('SECURE') and exit;

这将阻止任何客户端访问(包括从页面调用资产、通过 JavaScript 或 src 属性;真正的一切

按照其他答案的建议,最好为安全做出其他规定。

【讨论】:

  • 这可能有点复杂。如果您有要使用的会话
  • @BasicBridge 会话如何增加复杂性?
  • 虽然这可行,但对我来说,必须编辑每个文件听起来并不是“最简单的方法”。
  • @MvG 真的吗?递归目录搜索和替换:(?-m)^<\?php<?php !defined('SECURE') and exit;。或者,您可以匹配\A而不是(?-m)^)。这些表达式将仅匹配第一个 <?php。这一切都取决于您的编码风格,并且一如既往,您的里程可能会有所不同。
【解决方案2】:

您已经在问题中提到了.htaccess。只需在您的 libs 目录中创建这样一个文件并输入以下指令:

Order allow, deny
Deny from all

有关OrderDeny 指令的详细信息,请参阅manual

请注意,错误将是 403 Forbidden 而不是 404 Not Found

请注意,这将拒绝所有通过 HTTP 访问您的 libs 目录中的文件。您的其他 PHP 文件可以includerequire 这些文件,因为这是纯粹的服务器端操作。如果您出于某种原因需要一个 PHP 脚本通过 HTTP 执行另一个,那么您可以将 oder 更改为 deny, allow 并添加一行 Allow from 127.0.0.1 以允许本地请求继续进行。但我怀疑您是否会让您的 PHP 脚本通过 HTTP 相互通信。

如果您需要客户端的 JavaScript 文档不访问这些文件,那么这是无法合理地完成的:客户端兄弟可以做的任何事情,客户端都可以在不执行您的代码的情况下完成,至少无需执行所有代码你故意的。 how to restrict access to a PHP file 上有一个问题,其中讨论了一些防止轻易破坏的步骤,但这些都不会阻止坚定的黑客使用您的脚本。

【讨论】:

    【解决方案3】:

    如果浏览器可以通过<script><style>访问它,那么用户也可以。

    如果您只想让服务器访问它,请将其从public 目录中拉出,使其无法通过网络访问。

    【讨论】:

    • 我同意你的观点,但不可能将所有文件都移出服务器目录。
    • 虽然你说的是真的,但是我看不出php文件和<script>或者<style>标签有什么关系。
    • @MvG:他希望 JavaScript 文件能够访问它,但用户不能。这是不可能的。
    • @Truth,感谢您的评论;看来我完全错过了关于“或 JS”的部分。
    【解决方案4】:

    您可以在包含所述文件之前定义一个常量。比如:

    <?php
        define('MY_CONSTANT', 1);
        include_once('libs/comment.php');
        ...
    

    然后在comment.php里面你可以这样写:

    <?php
        if(!defined('MY_CONSTANT')) {
           header("Status: 404 Not Found");
        }
        ...
    

    您或多或少会产生与您描述的效果相同的效果。

    【讨论】:

      【解决方案5】:

      我遇到了同样的问题,从 php 调用中得到响应,例如 http://example.com/libs/myphp.php?arg=value,而从我读到的内容来看,几乎不可能隐藏。所以我决定实施一种不同的方法。在 php 文件中创建一个函数,将该文件包含在脚本中,调用该函数并将结果分配给 javascript 中的一个变量。这样一来,一切都对客户隐藏。

      您将拥有myphp.php

      `<?php  
      myFunction($param){
        // do your task
        return $result;
      }
      ?>`
      

      然后在你的页面中,index.php

      <?php
      require_once( "myphp.php");
      $param = //whatever params
      $my_var = myFunction($param);    
      ?>
      <html>
      <head>
      </head>
      <body>
      <div id="myDiv"></div>
      </body>
      </html>
      <script type="text/javascript">
      var myVar = <?php echo $my_var; ?>;  
      // or
      var myArray = <?php echo json_encode($my_var); ?>;
      document.getElementById("myDiv").innerHTML = myVar; 
      </script>
      

      【讨论】:

        【解决方案6】:

        如果您正在寻找只能由服务器执行的锁定文件。 最简单的方法是更改​​整个文件夹或文件的权限。

        例如,您想使用文件夹图像中的一些图像 您可以将图像文件夹权限设置为 700 这意味着只有服务器用户可以读写或执行文件。 其他访问者和公共用户在尝试访问时会收到 404 错误。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-02-05
          • 2014-07-03
          • 2014-01-28
          • 1970-01-01
          相关资源
          最近更新 更多