如何限制 Laravel 对 public 文件夹中特定路径的访问?

How to limit access to specific path in public folder for Laravel?

我想在我的 Laravel 应用程序中限制对 public/templates/sb-admin-2path 的访问。

添加此模板是设置步骤的一部分 antonioribeiro/tracker 包。现在 <MyDomain>/templates/sb-admin-2 未经任何身份验证将我带到模板。让任何用户在生产环境中访问此模板是没有意义的。如何限制访问权限,使用户无法访问模板?

谢谢

TL;DR;

不要。

public 这个词的真正意思应该是 public。无论放在那里,每个人都应该可以访问。另外,Laravel(服务器)将首先检查文件系统,如果没有找到文件,那么它将要求 PHP 解释请求。

但是...

...您可以通过将文件放在单独的目录中来伪造行为,然后通过 php 释放文件,例如:

首先,将public/templates/sb-admin-2重命名为public/xcscxcsx(例如)。这样任何时候任何人要求 templates 文件夹,都必须通过 Laravel.

其次,创建一个路由来检查 Auth 和 return 请求文件的内容,否则将拒绝访问。

Route::get('/templates/sb-admin-2/{path?}', function () {
    if(\Auth::check()) {
        // 21 = characters count of "templates/sb-admin-2"
        $newPath = substr(ltrim($_SERVER['REQUEST_URI'], '/'), 21);
        return \File::get(
            public_path('xcscxcsx/' . $newPath)
        );
    }
    return 'access denied';
})->where(['path' => '.*']);

问题:

  • 所有文件都可用。例如: /templates/sb-admin-2/.gitignore 将显示在屏幕上。
  • 任何知道 xcscxcsx 存在的人仍然会 访问文件。所以也许将它们放在 storage 文件夹中,然后 使用 storage_path 解析

如果您的网络服务器使用 Apache 2.4,您可以使用以下指令将您的 IP 列入白名单并防止其他人访问该目录:

<Directory /var/www/MyDomain/public/templates/sb-admin-2>
    Require ip 192.168.0.1
</Directory>

只需换入您的 IP 代替 192.168.0.1。您可以使用以下语法将多个 IP 地址添加到白名单:

Require ip 192.168.1.104 192.168.1.205

在此处阅读有关 Apache 2.4 访问控制的更多信息:https://httpd.apache.org/docs/2.4/howto/access.html