我有这个网站是用silverstripe构建的,我只有成员的会员页面。
一切正常,直到我在其中一个成员的页面上放置一些pdf链接,然后谷歌搜索实际上可以选择那些pdf文件,每个人最终都能够看到这些pdf文件而不是成员。
我注意到它在会员页面上时,你必须登录,网址是www.mysite.com/members/
但是,当我点击该页面上的其中一个链接时,网址将变为www.mysite / assets / Uploads / members / books / myfirstbook.pdf
只要有人谷歌搜索该书的名称,例如myfirstbook和mysite name,就会显示会员页面上的pdf链接,您可以点击它并查看pdf内容。
如何阻止非成员查看这些pdf文件?我试过robot.txt和安全文件模型,但它们没有用。请帮忙。谢谢!
答案 0 :(得分: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]
然后我只使用该控制器来处理表单和文件。
在您的情况下,您可以使用该控制器来测试访问者是否已登录,如果没有将他/她重定向到登录页面,拒绝访问或其他...
与你的问题不完全相同,但我很容易看到这个改编了吗?
修改强>
如果能够更好地了解它并基于上述情况,这似乎有效:
SilverStripe 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...
}
}
}
这是一个非常快速的解决方案,可能会更好一些,但应该给你一个良好的开端_
答案 1 :(得分:0)
robot.txt需要一些时间才能应用。但是,它并没有真正保护任何东西,它只是从搜索引擎的索引中删除它。
您尝试过哪个安全文件模块? https://github.com/hamishcampbell/silverstripe-securefiles “它不起作用”的具体问题是什么?
这仅适用于SilverStripe 2.x.你需要3.x的解决方案吗?