sourcebroker/restrictfe

此扩展阻止对前端访问,并允许仅向某些定义的例外显示,例如请求来自授权的后端用户、具有特定的IP、头部、域名、语言或GET/POST变量。适用于保护您的预发布和生产实例。

安装次数: 46,775

依赖项: 0

建议者: 0

安全: 0

星标: 12

关注者: 4

分支: 2

开放性问题: 0

类型:typo3-cms-extension

10.1.0 2023-04-16 19:49 UTC

README

https://poser.pugx.org/sourcebroker/restrictfe/d/monthly https://poser.pugx.org/sourcebroker/restrictfe/v/stable https://poser.pugx.org/sourcebroker/restrictfe/license

它是做什么的?

此扩展阻止对前端访问,并允许仅向某些定义的例外显示,例如请求来自授权的后端用户、具有特定的IP、头部、域名、语言或GET/POST变量。适用于保护您的预发布和生产实例。

这对我的用途有何帮助?

无论您何时想保护整个网站或部分网站不被公开,它都会很有用。请参阅以下示例,了解预发布和生产实例。

对于预发布实例

如果您有预发布实例,并且想保护前端内容不受公众访问,但同时允许授权后端用户查看前端,允许您的VPN IP查看前端,允许外部蜘蛛爬取前端,允许某些支付系统向您的应用端点发送确认链接,允许Google Page Speed进行测试等,那么您会发现restrictfe很有用。

  • 允许授权后端用户查看前端,
  • 允许VPN IP查看前端,
  • 允许外部蜘蛛爬取前端,
  • 允许某些支付系统向您的应用端点发送确认链接,
  • 允许Google Page Speed进行测试,
  • 等等。

对于生产实例

如果您有已经上线但某些网站部分需要隐藏给普通前端用户的生产实例,同时必须允许已登录的后端用户编辑隐藏部分的内容,那么您会发现restrictfe很有用。

最好的例子是多语言网站。假设有一个只有一种语言(比如英语)的生产实例。几个月后,网站所有者决定添加新的语言——比如中文。翻译将在实时进行,这是一个漫长的过程——可能需要几周时间。在这个过程中,客户必须检查前端的内容,但同时翻译后的网站必须对普通用户不可访问。解决方案是使用restrictfe,并将其设置为除了sysLanguageUid=1(新语言的uid)之外的所有前端都可以显示。在这种情况下,即使某些前端用户通过在URL地址中强制L参数来切换到新语言,他们也会看到警告“登录以查看此页面的内容”。警告的内容可以通过设置Fluid模板的路径来更改,这样您就可以在请求受限制的内容时显示您喜欢的任何内容。

安装

只需使用composer或通过扩展管理器下载。

composer require sourcebroker/restrictfe

请注意,安装后,restrictfe默认阻止所有对前端的流量。这是设计上的,因为如果您添加新的预发布实例,它们将被默认阻止,因此没有忘记保护它们的风险,有人会看到新的预发布实例或谷歌会索引它。当然,您必须记住使用简单的一行来解锁生产实例:

$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['restrictfe']['exceptions'] = ['*' => true];

请将此配置放入仅包含在实时实例中的文件中!

注意! 当 $_SERVER['REMOTE_ADDR'] == 127.0.0.1 时,restrictfe 保护功能将不工作,因此如果您正在本地实例上工作,restrictfe 将被禁用。如果您想在本地实例上进行测试并启用它,请在 typo3conf/AdditionalConfiguration.php 或某些扩展 ext_localconf.php 中插入以下行:$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['restrictfe']['exceptions']['ip'] = '__UNSET';

文档

例外

如前所述,restrictfe 阻挡所有对前端的所有流量,我们必须设置例外情况以允许查看前端。这些例外条件写入 $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['restrictfe']['exceptions'] 数组。默认情况下,第一级条件通过逻辑 OR 连接,但您可以通过创建 AND 数组键和条件内部来连接它们。您可以在数组内部嵌套 OR/AND 条件。条件的值可以是字符串或数组。如果是数组,则进行 OR 操作。某些条件可以被否定。在这种情况下,内部的条件进行 AND 操作。

此条件检查的结果用于决定是否阻止前端。如果是真的,则不阻止前端。

条件

后端用户

  • 参数 启用(布尔值)
  • 备注

    • 如果启用,则前端将对授权的后端用户可见。只需要单个授权,并且用户可以注销,因为特殊的 cookie 将允许他查看前端。这也意味着 BE 用户可以从后端注销,但仍能查看前端——这对于缓存问题的良好测试至关重要。
    • 对于后端用户,您可以在后端用户记录中检查“登录后清除 BE 会话”。这将使 BE 用户在授权后立即从后端注销。如果您只想创建一种“预览”类型的 BE 用户,这将很有用。此用户不需要访问任何 BE 模块,也不需要读取/写入任何表的权限。
    • 如前所述,在 BE 用户授权后,将设置一个特殊的 cookie,允许在 BE 用户注销后访问前端。您可以通过设置 $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['restrictfe']['cookie'] 数组来设置此 cookie 的每个方面。例如,您可以将 cookie 设置为多个子域,这意味着用户只需要授权一次即可访问所有受保护的子域。使用 htaccess 密码,用户需要独立地对每个子域进行授权。例如:$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['restrictfe']['cookie']['domain'] = '.example.com';
  • 示例

    $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['restrictfe']['exceptions'] = [
        backendUser' => true
    ];
    

域名

  • 参数 域名(字符串)
  • 备注 您可以使用 !domain 否定此条件。
  • 示例 允许前端访问除域名 sub.example.com 之外的所有流量
    $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['restrictfe']['exceptions'] = [
       '!domain' => ['sub.example.com']
    ];
    

GET

  • 参数 "getName=getValue" 对(字符串)
  • 备注 您可以使用 !get 否定此条件。
  • 示例 仅允许请求中包含 GET 参数 secret=999 时访问前端。
    $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['restrictfe']['exceptions'] = [
     'get' => 'secret=999'
    ];
    

头部

  • 参数 "headerName=headerValue" 对(字符串)
  • 备注 您可以使用 !header 否定此条件。
  • 示例 仅允许请求中包含 HTTP 标头 MYHEADER=99 时访问前端。
    $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['restrictfe']['exceptions'] = [
       'header' => 'MYHEADER=99'
    ];
    

IP

  • 参数 单个 IP 与掩码(字符串)、逗号分隔的 IP 与掩码列表(字符串)、IP 与掩码的数组(字符串数组)
  • 备注 在后台使用 GeneralUtility::cmpIP(),因此您可以使用 * 和掩码来指定 IP,例如 12.12.45.* 或 13.55.0.0/16。您可以使用 !ip 否定此条件。
  • 示例 仅允许 IP 11.11.11.11 或 22.22.22.22 或 33.33.33.33 访问前端。
    $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['restrictfe']['exceptions'] = [
      'ip' => [
             '11.11.11.11',  // ip of developers VPN
             '22.22.22.22'   // ip of client VPN
             '33.33.33.33'   // payment system confirm request
           ]
      ];
    

    阻止来自 IP 范围 34.34.0.0/16 的前端访问

    $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['restrictfe']['exceptions'] = [
        '!ip' => [
            '34.34.0.0/16', // some not trusted network
        ]
    ];
    

POST

  • 参数 "getName=getValue" 对(字符串)
  • 备注 您可以使用 !post 否定此条件。
  • 示例 仅允许请求中包含 POST 参数 secret=999 时访问前端。
    $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['restrictfe']['exceptions'] = [
       'post' => 'secret=999'
    ];
    

请求URI

  • 参数 域名之后的 uri 部分,不带前导斜杠(字符串)
  • 备注 您可以使用 !requestUri 否定此条件。该参数仅在文本开头进行搜索。
  • 示例 仅允许以 api/ 开头的请求被处理。
    $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['restrictfe']['exceptions'] = [
       'requestUri' => ['api/', 'api2/']
    ];
    

系统语言UID

  • 参数 TYPO3 中的语言 uid(整数)
  • 注意 您可以使用 !sysLanguageUid 来取消此条件。
  • 示例 允许前端访问除了uid为1的语言之外的所有内容。在需要添加和翻译新语言的生产实例上很有用。
    $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['restrictfe']['exceptions'] = ['!sysLanguageUid' => 1];
    

配置示例

一些最实用的实际配置示例

必须具有sysLanguageUid=1的生产实例不可公开

$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['restrictfe']['exceptions'] = [
        '!sysLanguageUid' => 1,
];

必须具有域名"sub.example.com"的生产实例不可公开

$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['restrictfe']['exceptions'] = [
        '!domain' => 'sub.example.com',
];

需要为Google Page Speed Insights解锁前端的预发布实例

$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['restrictfe']['exceptions'] = [
       'get' => 'secret=91009123',
];

当然,您提供给谷歌进行测试的URL是:https://www.example.com/?secret=91009123

需要为IP=11.11.11.11解锁前端的预发布实例

$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['restrictfe']['exceptions'] = [
      'ip' => '11.11.11.11',
];

AND条件的示例

ip和header是进行AND操作。ip和header内部的数组值是进行OR操作。

$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['restrictfe']['exceptions'] = [
        'AND' => [
             'ip' => [
                '66.249.64.0/19'
                '66.249.44.0/19'
                ],
             'header' => [
                'HTTP_USER_AGENT=Google Page Speed Insights'
                'HTTP_USER_AGENT=Google Page Speed'
               ],
             ]
        ]
];

默认配置

默认情况下,以下配置会被应用。您可以使用$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['restrictfe']来更改此数组中的每个元素。

[
  'templatePath' => ExtensionManagementUtility::siteRelPath('restrictfe').'Resources/Private/Templates/Restricted.html',
  'cookie'       => [
      'expire'   => time() + 86400 * 30,
      'path'     => '/',
      'domain'   => null,
      'secure' => ((int)$GLOBALS['TYPO3_CONF_VARS']['SYS']['cookieSecure'] === 1 || GeneralUtility::getIndpEnv('TYPO3_SSL')),
      'httponly' => $GLOBALS['TYPO3_CONF_VARS']['SYS']['cookieHttpOnly'],
  ],
  'exceptions' => [
      'backendUser' => true,
      'ip'          => '127.0.0.1',
  ],
];

常见问题解答

  • 扩展不工作。前端没有被完全阻止。哪里出错了? 请确保您从BE登录并且cookie "restrictfe"已被删除。请记住,如果$_SERVER['REMOTE_ADDR'] == 127.0.0.1,则restrictfe保护不工作,因此如果您在本地实例上工作,则restrictfe被禁用。要在本地实例上启用它,请插入以下行:$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['restrictfe']['exceptions']['ip'] = '__UNSET';
  • 我已经从BE登出,但前端仍然没有被阻止,为什么? 从3.0.0版本开始,在第一次成功登录后,会设置一个cookie(名称为tx_restrictfe)。如果该cookie存在,则用户不需要再次进行授权。因此,删除该cookie,然后您的前端应该再次被阻止。

已知问题

无。

待办事项列表

  1. 为条件添加用户函数
  2. 为所有条件如 '~domain' 添加 pregmatch
  3. 添加检测浏览器语言以在“您必须登录才能查看网站”警告屏幕上显示正确语言的支持。
  4. 为条件数组编写单元测试。

变更日志

https://github.com/sourcebroker/restrictfe/blob/master/CHANGELOG.rst