草庐IT

PHP 从 /var 文件夹下载文件,没有相对路径

codeneng 2023-03-28 原文

PHP download file from /var folder without relative paths

我想从 Web 根目录上方的文件夹中下载文件。假设我想得到这个文件:

1
/var/pdfs/test.pdf

我的代码是:

1
2
3
4
5
6
7
8
9
10
$name ="test.pdf";
$url ="/var/pdfs/" . $name;
if (file_exists($url)) {
    header("Content-Type: application/pdf");
    header("Content-Transfer-Encoding: Binary");
    header("Content-disposition: attachment; filename='" . basename($url) ."'");
    readfile($url);
} else {
    echo"Not found: $url";
}

问题是我总是得到 Not found: $url 回声。

我的文件有读取权限:

1
2
3
4
5
thecrafter@vps136166:/var/pdfs$ ls -la
total 6484
drwxr--r--  2 thecrafter root          4096 Jul  7 00:19 .
drwxr-xr-x 13 root       root          4096 Jul  7 00:16 ..
-rw-r--r--  1 thecrafter thecrafter 6629018 Jul  7 00:18 test.pdf

还有目录:

1
2
thecrafter@vps136166:/var$ ls -la | grep pdfs
drwxr--r--  2 thecrafter root  4096 Jul  7 00:19 pdfs

我错过了什么吗?问题出在哪里?

编辑 1

Krzysztof Duszczyk 指出,如果我授予 pdfs 目录的执行权限,问题就解决了。事实上,我给了它 755 并且它正在工作。任何想法为什么会发生这种情况?

  • pdfs 文件夹有读取权限吗?
  • 恕我直言,有同样的问题,检查一下。 stackoverflow.com/a/17896538/6557808
  • @KrzysztofDuszczyk 是的,我编辑了我的问题。
  • 嗯,当我重现问题时,向 pdfs 文件夹添加执行权限会有所帮助。真的不知道为什么:)
  • @KrzysztofDuszczyk Wtf。你说得对!它在工作。好吧,现在我很困惑。
  • 我也想知道为什么会这样。除了 forums.opensuse.org/showthread.php/...
  • 您使用的是什么操作系统,是否启用了 SELinux?我复制了您的情况,并且 file_exists 对于权限为 755 的目录中权限为 644 的文件返回 true。在 Linux 上,PHP 只是调用函数 access() 来确定文件可访问性,因此操作系统中的某些内容表示除非还设置了执行,否则无法访问该文件。
  • @drew010 我正在运行 Debian 8.5 ,不,我没有 SELinux。
  • ubuntu 14.04 在这里。当文件的权限为 644,文件夹的权限为 755 时,问题是文件夹具有 644 权限。
  • 请参阅此答案的要点 3。基本上在目录上执行是允许用户进入目录并列出/读取内容的。
  • @drew010 哇,有趣!我不知道谢谢!能否请您将其写在答案中以便我接受?


问题(不是在这种情况下,但我把它留给别人帮助)

如果您知道该文件确实存在于磁盘上,则您的 file_exists() 可能会被旨在保护 /var/pdfs/ 中的文件免遭未经授权访问的安全措施阻止。这来自 file_exists 上的文档:

Warning: This function returns FALSE for files inaccessible due to
safe mode restrictions. However these files still can be included if
they are located in safe_mode_include_dir.

解决方案(同样不是在这种情况下,但可以帮助类似的症状)

您想将目录添加到 safe_mode_include_dir 设置。在 php.ini 中找到设置,取消注释,然后添加目录:

1
safe_mode_include_dir = /var/pdfs/

如果这仍然不起作用,您可能还需要将目录添加到您的 PHP 包含路径中,方法是在 php.ini 中设置 include_path,或者在脚本顶部使用以下行:

1
2
$path = '/var/pdfs'
set_include_path(get_include_path() . PATH_SEPARATOR . $path);

请注意,PHP 删除了 5.4 版本的 safe mode 设置,因此如果您最近安装了 PHP,您的问题可能在其他地方。

  • 我尝试在我的 php 脚本之上添加 ini_set("safe_mode_include_dir","/var/pdfs/"); 。我没有工作,所以我尝试了您的第二个解决方案,但它也没有工作。
  • 我想你误会了。我不建议您使用 ini_set 来更改 safe_mode_include_dir。我建议您直接在 php.ini 中进行更改。第二个建议是对第一个建议的补充(不是替代方案),因此无论哪种方式,您都需要先更改 php.ini
  • 好的。我打开了我的 /etc/php5/apache2/php.ini 但没有 safe_mode_include_dir 选项。甚至没有注释掉。我应该附加它吗?
  • 首先,您需要知道它是 PHP 启动时实际加载的 php.ini (关于其他地方如何进行的大量讨论),因为该文件通常有多个副本。获得正确的文件后,如果不存在,请添加设置。然后,您必须重新启动 Apache 才能使更改生效。顺便问一下,您运行的是什么版本的 PHP?
  • 我正在运行 PHP 5.6.20-0+deb8u1。我将它附加到 php.ini 但仍然没有。
  • 显然,当我向 pdfs 文件夹添加执行权限(归功于 Krzysztof Duszczyk)时,它正在工作。任何想法为什么?
  • 行。 PHP 5.6.20 不再使用 safe mode (从 5.4 开始删除)。您可以撤消您的编辑。其他事情可能正在发生。

有关PHP 从 /var 文件夹下载文件,没有相对路径的更多相关文章

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  3. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  4. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  5. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  6. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  7. ruby - 难道Lua没有和Ruby的method_missing相媲美的东西吗? - 2

    我好像记得Lua有类似Ruby的method_missing的东西。还是我记错了? 最佳答案 表的metatable的__index和__newindex可以用于与Ruby的method_missing相同的效果。 关于ruby-难道Lua没有和Ruby的method_missing相媲美的东西吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/7732154/

  8. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  9. ruby-on-rails - rails 目前在重启后没有安装 - 2

    我有一个奇怪的问题:我在rvm上安装了ruby​​onrails。一切正常,我可以创建项目。但是在我输入“railsnew”时重新启动后,我有“程序'rails'当前未安装。”。SystemUbuntu12.04ruby-v"1.9.3p194"gemlistactionmailer(3.2.5)actionpack(3.2.5)activemodel(3.2.5)activerecord(3.2.5)activeresource(3.2.5)activesupport(3.2.5)arel(3.0.2)builder(3.0.0)bundler(1.1.4)coffee-rails(

  10. Ruby 写入和读取对象到文件 - 2

    好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信

随机推荐