php框架如何保护动作脚本/数据服务文件?

php框架如何保护动作脚本/数据服务文件?,php,apache,model-view-controller,Php,Apache,Model View Controller,我想知道框架是如何阻止用户直接访问action/dataservice脚本的 例如,我们转到www.test.com/test.html模板test.html调用测试动作.php。是什么阻止用户访问此操作脚本直接驻留的目录 例如www.test.com/index/actions/test\u action.php 如何配置服务器权限,以便只能通过test.html访问test\u action.php 如果我被困在共享托管服务器上的docroot中 如果我正在运行show ~即我的apach

我想知道框架是如何阻止用户直接访问action/dataservice脚本的

例如,我们转到
www.test.com/test.html
模板
test.html
调用
测试动作.php
。是什么阻止用户访问此操作脚本直接驻留的目录

例如
www.test.com/index/actions/test\u action.php

如何配置服务器权限,以便只能通过
test.html
访问
test\u action.php

  • 如果我被困在共享托管服务器上的docroot中
  • 如果我正在运行show ~即我的apache服务器

如果您什么也不做,并且test_action.php在您的docroot下,用户可以访问它。如果这是不可接受的,有几种方法可以解决这个问题(请注意,如果您的服务器正确安装/配置了PHP,他们将不会看到源代码,只看到源代码的输出)

如果不允许用户直接查看该脚本的输出,则可以选择以下几种方法之一:

  • 将所有受保护的脚本放在HTTP服务器的docroot之外,然后使用../includes或类似工具引用它们
  • 文件拒绝对.php的请求(在传递时将其切断)
  • 创建一个名为
    entry.php
    的文件,该文件声明一个全局常量,然后首先从所有有效的入口点包含该文件,然后在每个受保护的脚本中检查该常量是否存在(IIRC,这是CodeIgniter所做的)

  • 一般情况下,建议使用#1。如果这不好,那么#2是非常有效的,而#3在我看来只是俗气而已。

    如果你什么都不做,并且test#action.php在你的docroot下,用户可以访问它。如果这是不可接受的,有几种方法可以解决这个问题(请注意,如果您的服务器正确安装/配置了PHP,他们将不会看到源代码,只看到源代码的输出)

    如果不允许用户直接查看该脚本的输出,则可以选择以下几种方法之一:

  • 将所有受保护的脚本放在HTTP服务器的docroot之外,然后使用../includes或类似工具引用它们
  • 文件拒绝对.php的请求(在传递时将其切断)
  • 创建一个名为
    entry.php
    的文件,该文件声明一个全局常量,然后首先从所有有效的入口点包含该文件,然后在每个受保护的脚本中检查该常量是否存在(IIRC,这是CodeIgniter所做的)

  • 一般情况下,建议使用#1。如果这不好,那么#2非常有效,而#3在我看来只是俗气而已。

    既然您问php框架如何处理这个问题,那么有两种常见的方法:

    • 正确的方法

      将所有代码保留在
      文档的根目录之外
      。基本上,您有一个
      /public
      文件夹,其中只包含
      index.php
      ,然后包含
      include'../application/init.php
      '

      所有其他php文件都放在
      DOCUMENT\u ROOT
      之外,无法直接访问

    • 愚蠢的方式

      它们在
      index.php
      文件中定义了一个常量,其余所有文件都以:

        defined('SOMETHING') or die('No direct script access.');
      
      如果服务器上的php扩展出错,这显然会失败。最终,您的php源代码将对所有人可见


    顺便说一句,我不建议使用任何特定于apache的方法来处理这个问题,因为您无法确定您的框架将在哪个Web服务器上使用。NginX和Lighttpd都变得非常流行。IIS总是存在的。

    既然您问php框架如何处理这个问题,有两种常见的方法:

    • 正确的方法

      将所有代码保留在
      文档的根目录之外
      。基本上,您有一个
      /public
      文件夹,其中只包含
      index.php
      ,然后包含
      include'../application/init.php
      '

      所有其他php文件都放在
      DOCUMENT\u ROOT
      之外,无法直接访问

    • 愚蠢的方式

      它们在
      index.php
      文件中定义了一个常量,其余所有文件都以:

        defined('SOMETHING') or die('No direct script access.');
      
      如果服务器上的php扩展出错,这显然会失败。最终,您的php源代码将对所有人可见


    顺便说一句,我不建议使用任何特定于apache的方法来处理这个问题,因为您无法确定您的框架将在哪个Web服务器上使用。NginX和Lighttpd都变得非常流行。还有IIS。

    请查看编辑。我只需要多一点关于共享托管案例的信息。@DanKanze,如果您使用的是共享托管,那么源代码的安全性取决于托管本身的安全性。此外,没有任何规则阻止共享主机实现第1点中描述的设置。在一个好的共享主机中,您至少有
    /logs
    /www
    文件夹。。不应阻止您添加更多文件夹。请查看编辑。我只需要多一点关于共享托管案例的信息。@DanKanze,如果您使用的是共享托管,那么源代码的安全性取决于托管本身的安全性。此外,没有任何规则阻止共享主机实现第1点中描述的设置。在一个好的共享主机中,您至少有
    /logs
    /www
    文件夹。。不应阻止您添加更多文件夹。请查看编辑。我只需要多一点关于共享主机案例的信息。只要您的主机允许,这里的选项2和3在共享情况下可用。htaccess可以拥有此控件,它应该拥有此控件(即,如果没有,则获得新的hos