文件被临时上传到/root/tmp而不是/tmp。

3

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

<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中设置正确的路径,然后重新启动Apache。 - user557846
你的 path.ini 文件是引用相对路径还是绝对路径?你的 Apache 是否由“root”用户运行? - Tim
@Tim:它设置为“/tmp” - 这是绝对路径,正确吗?此外,Apache 以“nobody”用户身份运行。 - HyderA
1
你有尝试在上传之前双重检查数值吗?var_dump(ini_get('upload_tmp_dir'));文档来看,全局的php.ini是唯一可以设置该值的地方。 - quickshiftin
@quickshiftin 字符串(5) "/tmp/" - HyderA
1个回答

3
看起来你应该检查你的ModSecurity设置,特别是SecUploadDir设置。
文件上传支持
ModSecurity能够拦截通过POST请求和multipart/form-data编码或(自1.9版以来)通过PUT请求上传的文件。
由于在PHP中只有一个地方可以设置该值,并且已在运行时验证,加上我们知道您从日志输出中运行了ModSecurity,似乎那就是问题所在。
OP的注意事项:
如果不设置SecUploadDir参数,ModSecurity不会忽略它。因此,我们进行了以下更改:SecUploadDir /tmp SecTmpDir /tmp,现在它完美地工作了。
在这种情况下,我偶然发现的另一件事是尝试完全禁用mod security,看看是否消除了问题。然后你可以迅速缩小问题范围到mod security。

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


在/etc/httpd/conf/*中运行grep SecUploadDir命令和在/etc/httpd/conf/modsec2/*中运行grep SecUploadDir命令都没有返回结果。不过想法很好... - HyderA
grep root /etc/httpd/conf/* | grep -vE '(SecRule|author)' 也没有显示任何有用的东西。 - HyderA
开启了 open_basedir 吗?您也可以通过在 php.ini 中设置 upload_tmp_dir = ./tmp/ 来规避它;Web服务器用户应该能够将文件写入其主目录。 - quickshiftin
open_basedir未设置。如果我在一段时间内找不到其他解决方案,我将尝试./tmp/解决方案。 - HyderA
结果是ModSecurity的问题。如果你没有设置 SecUploadDir 参数,ModSecurity就不会忽略它。所以我们进行了以下更改:SecUploadDir /tmpSecTmpDir /tmp,现在它完美地工作了。如有可能,请更新您的回答。谢谢! - HyderA
哈,我甚至要建议完全禁用它,以查看在没有显式设置SecUploadDir的情况下是否仍然存在问题。我会更新我的答案。 - quickshiftin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接