1

我在 silverstripe 中建立了这个网站,我只有会员的会员页面。

一切正常,直到我在其中一个成员的页面上放置了一些 pdf 链接,然后谷歌搜索实际上可以选择这些 pdf 文件,并且每个人最终都能够在没有成为会员的情况下看到这些 pdf 文件。

我注意到当它在会员页面上时,您必须登录,网址是 www.mysite.com/members/
但是当我单击该页面上的一个链接时,网址变为 www.mysite/assets/Uploads /members/books/myfirstbook.pdf

只要有人谷歌搜索该书的名称,例如myfirstbook 和mysite name,就会出现会员页面上的pdf 链接,您可以点击它查看pdf 内容。

如何阻止非会员查看这些 pdf 文件?我尝试了robot.txt 和安全文件模型,它们没有用。请帮忙。谢谢!

4

2 回答 2

4

我和一位客户有过类似的事情(有点)。他们希望访问者在下载一些可能在任何页面上的文件之前填写一份包含一些信息的表格。

基本上我所做的是在 AssetAdmin 下创建一个名为的文件夹FilteredDownload,该文件夹中的任何位置都将通过过滤(表单等...)

我有这个规则.htaccess(可以编辑......)将任何对这些文件的任何请求重定向到Downloader_Controller

RewriteCond %{REQUEST_URI} /assets/FilteredDownload [NC]
RewriteCond %{REQUEST_URI} !/assets_temp [NC]
RewriteCond %{REQUEST_FILENAME} \.(pdf|zip|rar|7z|doc|docx|xls|xlsx|ppt|pptx)$ [NC]
RewriteRule .* downloader?file=%{REQUEST_FILENAME}&%{QUERY_STRING} [L,NC]

然后我只是使用该控制器来提供表单和文件。

在您的情况下,您可以使用该控制器来测试访问者是否已登录,如果没有将他/她重定向到登录页面,拒绝访问或其他...

与您的问题不完全相同,但我可以很容易地看到这已适应?


编辑

更好地查看它并基于上述内容,这似乎有效:

银条 3+

将此添加到.htaccess

RewriteCond %{REQUEST_URI} /assets/MembersOnly [NC]
RewriteCond %{REQUEST_FILENAME} \.(pdf|zip|rar|7z|doc|docx|xls|xlsx|ppt|pptx)$ [NC]
RewriteRule .* filedownloadpermission?file=%{REQUEST_FILENAME}&%{QUERY_STRING} [L,NC]

因此,在下载之前上传的每个文件/assets/MembersOnly都将首先通过其请求。/filedownloadpermission

在 中定义Director规则config.yml

---
Name: myroutes
After: framework/routes#coreroutes
---
Director:
  rules:
    'filedownloadpermission/$Action/$ID/$Name': 'FileDownloadPermission_controller'

然后我们的控制器FileDownloadPermission_controller.php将在提供文件之前检查权限:

<?php

class FileDownloadPermission_controller extends ContentController
{
    private static $allowed_actions = array (
    );

    public function init() {
        parent::init();

        if( !$member = Member::currentUser() )
        {
                  Security::permissionFailure();
        }    
    }

    public function index()
    {
        $file = $this->request->getVar('file');
        $fileAssetPath = substr($file, stripos($file, 'assets'));    
                $fileObj = File::get()->filter(array('Filename' => $fileAssetPath))->first();

                if ( $fileObj )
                {
                   $data = file_get_contents( $fileObj->getFullPath() );
                   $name = $fileObj->getFilename();
                   $response = SS_HTTPRequest::send_file($data, $name);
                   return $response;
                }
                else {
                   //Return 404 or whatever...
                }
    }
}

这实际上是为 SilverStripe 3.1 编写的,但可以很容易地适应 2.4:

  • $allowed_actions应该public
  • Director_config.php改为添加规则
  • 更新File::get()...DataObject::get...

所以这给了我们SilverStripe 2.4+

_config.php

Director::AddRules(100, array('filedownloadpermission/$Action/$ID/$OtherID' => 'FileDownloadPermission_controller'));

和我们的控制器FileDownloadPermission_controller.php

<?php

class FileDownloadPermission_controller extends ContentController
{
    static $allowed_actions = array (
    );

    public function init() {
        parent::init();

        if( !$member = Member::currentUser() )
        {
                  Security::permissionFailure();
        }    
    }

    public function index()
    {
        $file = $this->request->getVar('file');
        $fileAssetPath = substr($file, stripos($file, 'assets')); 
                $fileObj = DataObject::get(
                                 "File",
                                 "Filename = '".$fileAssetPath."'",
                                 null, null, "1");

                if ( $fileObj )
                {
                    $fileObj = $fileObj->shift();

                    $data = file_get_contents( $fileObj->getFullPath() );
                    $name = $fileObj->getFilename();
                    $response = SS_HTTPRequest::send_file($data, $name);
                    return $response;
                }
                else {
                    //Return 404 or whatever...
                }
    }
}

这是一个非常快速的解决方案,可能会更好一些,但应该会给你一个好的开始_

于 2013-05-24T18:38:56.147 回答
0

robots.txt 需要一些时间才能应用。然而,它并没有真正保护任何东西,它只是将它从搜索引擎的索引中删除。

您尝试过哪个安全文件模块?https://github.com/hamishcampbell/silverstripe-securefiles “它不起作用”的具体问题是什么?

这仅适用于 SilverStripe 2.x。您需要 3.x 的解决方案吗?

于 2013-05-24T13:22:25.863 回答