【问题标题】:Files are being temporarily uploaded to /root/tmp instead of /tmp文件暂时上传到 /root/tmp 而不是 /tmp
【发布时间】:2012-03-05 13:01:56
【问题描述】:

我有一个简单的上传表单,这里是开始和结束标签:

<form action="post.php" method="post" enctype="multipart/form-data">
</form>

我在提交时收到 500 内部服务器错误。并且 apache 日志显示以下条目(主机名和 ip 已编辑):

[Tue Feb 14 00:08:32 2012] [error] [client xxx.xxx.xxx.xxx] ModSecurity: Input filter: Failed to create temporary file: /root/tmp/20120214-000832-TznsTkPj2kkAAE5LYREAAAAB-request_body-xqZDkt [hostname "xxxxxxxxxx.com"] [uri "/app/221/product/post.php"] [unique_id "TznsTkPj2kkAAE5LYREAAAAB"]
[Tue Feb 14 00:08:37 2012] [error] [client xxx.xxx.xxx.xxx] ModSecurity: Input filter: Failed to delete temporary file: /root/tmp/20120214-000832-TznsTkPj2kkAAE5LYREAAAAB-request_body-xqZDkt [hostname "xxxxxxxxxx.com"] [uri "/app/221/product/post.php"] [unique_id "TznsTkPj2kkAAE5LYREAAAAB"]

我已经搜索了代码,在任何地方都没有提到rootupload_tmp_dir。所有代码文件都属于应用程序用户和组。在php.ini 中,upload_tmp_dir 最初没有设置,我现在将其设置为/tmp,但这也没有解决问题。

知道它为什么要上传到/root/tmp吗?

【问题讨论】:

  • 在php.ini中设置正确的路径,然后重启appache。
  • 你的 path.ini 文件是指相对路径还是绝对路径?你的 apache 是由 root 运行的吗?
  • @Tim:它设置为/tmp - 这是绝对的,对吗?此外,apache 以nobody 用户身份运行。
  • 您是否尝试在处理上传之前仔细检查该值? var_dump(ini_get('upload_tmp_dir'));Looks like 全局 php.ini 是唯一可以设置该值的地方。
  • @quickshiftin string(5) "/tmp/"

标签: php apache configuration upload


【解决方案1】:

看来您应该检查您的 ModSecurity settings,尤其是 SecUploadDir 设置。

文件上传支持

ModSecurity 能够拦截通过 POST 上传的文件 请求和多部分/表单数据编码或(从 1.9 开始)通过 PUT 请求。

因为在 PHP 中只有一个地方可以设置该值,并且在运行时已经过验证,而且我们知道您从日志输出中运行了 ModSecurity,似乎就是这样。

每个 OP 的注释:

如果不设置 SecUploadDir 参数,ModSecurity 不会 忽略它。所以我们做了以下修改:SecUploadDir /tmp SecTmpDir /tmp 现在可以完美运行了。

我偶然发现的另一件事是,您可以尝试在这种情况下完全禁用 mod 安全性,看看是否可以消除问题。然后,您可以快速将问题缩小到 mod 安全性:

https://serverfault.com/questions/57210/disable-modsecurity-for-a-specific-directory

【讨论】:

  • grep SecUploadDir /etc/httpd/conf/*grep SecUploadDir /etc/httpd/conf/modsec2/* 没有任何结果。好主意……
  • grep root /etc/httpd/conf/* | grep -vE '(SecRule|author)' 也没有显示任何有用的信息。
  • open_basedir 设置了吗?你也可以通过 php.ini 中的upload_tmp_dir = ./tmp/ 来规避它;网络服务器用户应该能够将文件写入其主目录。
  • open_basedir 未设置。如果我暂时找不到任何其他解决方案,我会尝试./tmp/ 解决方案。
  • 原来是 ModSecurity。如果不设置SecUploadDir 参数,ModSecurity 不会忽略它。所以我们进行了以下更改:SecUploadDir /tmpSecTmpDir /tmp 现在它可以完美运行了。如果可能,请更新您的答案。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-18
  • 2019-09-05
  • 1970-01-01
  • 1970-01-01
  • 2012-12-15
  • 2014-10-13
  • 2014-05-16
相关资源
最近更新 更多