我想保护 pdf 文件不被直接链接,而是让我的登录用户能够访问它。我有一个链接,该链接当前指向发布表单的 javascript 函数: $('nameofdoc').setProperty('value',doc); document.getElementById('sendme').submit();
其中 sendme 是表单的名称,nameof doc 是我要显示的文档的索引。
这会转到一个 php 文件:
$docpath = $holdingArray[0].$holdingArray[1];
$file = $holdingArray[0]; //file name
$filename = $holdingArray[1]; //path to the file]
header( 'Location:'.$docpath ) ;
header('Content-type: application/pdf');
header('Content-Disposition: attachment; filename="'.$filename . '"');
readfile($filename)
加载文件并输出 pdf 时一切正常。我不能做的是保护目录不被直接链接——即 www.mydomain.com/pathToPdf/pdfname.pdf
我想过使用 .htaccess 来保护目录,但它位于共享主机上,所以我不确定安全性,而且无论如何,当我尝试过时,我无法让它工作。
任何帮助都会很棒,因为这是我尝试解决此问题的第四天。
谢谢
更新
我得到了很多帮助,谢谢你,但我还不够。
我有一个 .htaccess 文件,当从目录请求 pdf 时,它现在启动另一个 php 文件:
RewriteEngine on
RewriteRule ^(.*).(pdf)$ fileopen.php
当 fileopen.php 文件启动时,它无法打开 pdf
$path = $_SERVER['REQUEST_URI'];
$paths = explode('/', $path);
$lastIndex = count($paths) - 1;
$fileName = $paths[$lastIndex];
$file = basename($path);
$filepath = $path;
if (file_exists($file)) {
header( 'Location: http://www.mydomain.com'.$path ) ;
header("Content-type: application/pdf");
header("Content-Disposition: attachment; filename=".$file);
readfile($filepath);
}else{
echo "file not found using path ".$path." and file is ".$file;
}
输出是 使用路径/documents/6/Doc1.pdf 找不到文件,文件是 Doc1.pdf
但是文件确实存在并且在那个目录中 - 有什么想法吗??
好的,我很高兴地报告说 Jaroslav 确实帮助我解决了这个问题。他的方法很有效,但很难将所有目录内容排列起来。最后我花了几个小时尝试组合来让它工作,但他给出的原则很有效。谢谢
最佳答案
正如您所提到的,最好的方法是使用 htaccess 保护该文件夹。因此,您将所有 PDF 放在 pdf/文件夹中,并在同一个 pdf 文件夹中输出 .htaccess 文件:
RewriteEngine on
RewriteRule .* your-php-script.php
现在此文件夹中没有任何文件可以通过 url 访问。对该文件夹中每个文件的每个请求都将返回 your-php-script.php 脚本返回的内容。在 your-php-script.php 你做这样的事情:
//Check if user has right to access the file. If no, show access denied and exit the script.
$path = $_SERVER['REQUEST_URI'];
$paths = explode('/', path);
$lastIndex = count($paths) - 1;
$fileName = $paths[$lastIndex]; // Maybe add some code to detect subfolder if you have them
// Check if that file exists, if no show some error message
// Output headers here
readfile($filename);
现在,如果用户打开 domain.com/pdf/nsa-secrets.pdf,Apache 将运行 your-php-script.php。脚本将变量 $_SERVER['REQUEST_URI'] 设置为“domain.com/pdf/nsa-secrets.pdf”。您获取最后一部分(文件名)并将其输出给用户(或不输出)。
这将阻止任何人通过知道 URL 直接从 Internet 访问文件。如果有人可以直接访问您服务器上的文件,这不会阻止他们。另一方面,我认为任何共享主机都会阻止用户获取其他客户端的文件。唯一的方法是以某种方式破解服务器。但后来我们变得非常偏执,如果您可能遇到这种情况,您首先就不应该使用共享主机。
如果您无法使 htaccess 工作,您可以尝试混淆文件,这样外面的人就很难发现它们。例如,将文件从 mySecretData.pdf 更改为 djjsdmdkjeksm.pdf。这可能会有所帮助。
关于php - 保护PDF文档不被URL直接访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19124109/
从给定URL下载文件并立即将其上传到AmazonS3的更直接的方法是什么(+将有关文件的一些信息保存到数据库中,例如名称、大小等)?现在,我既不使用Paperclip,也不使用Carrierwave。谢谢 最佳答案 简单明了:require'open-uri'require's3'amazon=S3::Service.new(access_key_id:'KEY',secret_access_key:'KEY')bucket=amazon.buckets.find('image_storage')url='http://www.ex
我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A
我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.
我需要一个表,其中行实际上是2行表,一个嵌套表是..我怎样才能在Prawn中做到这一点?也许我需要延期..但哪一个? 最佳答案 现在支持子表:Prawn::Document.generate("subtable.pdf")do|pdf|subtable=pdf.make_table([["sub"],["table"]])pdf.table([[subtable,"original"]])end 关于ruby-on-rails-PrawnPDF:Ineedtogeneratenested
我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些
我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.
matlab打开matlab,用最简单的imread方法读取一个图像clcclearimg_h=imread('hua.jpg');返回一个数组(矩阵),往往是a*b*cunit8类型解释一下这个三维数组的意思,行数、数和层数,unit8:指数据类型,无符号八位整形,可理解为0~2^8的数三个层数分别代表RGB三个通道图像rgb最常用的是24-位实现方法,即RGB每个通道有256色阶(2^8)。基于这样的24-位RGB模型的色彩空间可以表现256×256×256≈1670万色当imshow传入了一个二维数组,它将以灰度方式绘制;可以把图像拆分为rgb三层,可以以灰度的方式观察它figure(1
如何使此根路径转到:“/dashboard”而不仅仅是http://example.com?root:to=>'dashboard#index',:constraints=>lambda{|req|!req.session[:user_id].blank?} 最佳答案 您可以通过以下方式实现:root:to=>redirect('/dashboard')match'/dashboard',:to=>"dashboard#index",:constraints=>lambda{|req|!req.session[:user_id].b
有什么区别:@attr[:field]=new_value和@attr.merge(:field=>new_value) 最佳答案 如果您使用的是merge!而不是merge,则没有区别。唯一的区别是您可以在合并参数中使用多个字段(意思是:另一个散列)。例子:h1={"a"=>100,"b"=>200}h2={"b"=>254,"c"=>300}h3=h1.merge(h2)putsh1#=>{"a"=>100,"b"=>200}putsh3#=>{"a"=>100,"b"=>254,"c"=>300}h1.merge!(h2)pu
我正在使用Dragonfly在Rails3.1应用程序上处理图像。我正在努力通过url将图像分配给模型。我有一个很好的表格:{:multipart=>true}do|f|%>RemovePicture?Dragonfly的文档指出:Dragonfly提供了一个直接从url分配的访问器:@album.cover_image_url='http://some.url/file.jpg'但是当我在控制台中尝试时:=>#ruby-1.9.2-p290>picture.image_url="http://i.imgur.com/QQiMz.jpg"=>"http://i.imgur.com/QQ