gpt4 book ai didi

php - 强制在公共(public)目录中创建文件?

转载 作者:搜寻专家 更新时间:2023-10-31 21:15:22 24 4
gpt4 key购买 nike

这是一个想法。我正在尝试从 PHP 脚本创建文件。文件可以在服务器上的任何公共(public)位置创建(在公共(public)根目录或其子目录中)。最重要的是,我想编写这样的函数(它必须在 unix 和 windows 服务器上都有效)。

function create_file($path, $filename, $content, $overwrite=false) {
# body
...

}

参数:

  • $path - 文件路径(为空或以 / 结尾)
  • $filename - 任何有效的文件名(需要点+扩展名)
  • $content - 文件内容(任何内容)
  • $overwrite - 如果设置为true,现有文件将被覆盖(默认。false)。

结果:

函数返回 TRUE 并创建包含内容的文件,如果由于任何原因无法创建文件,则返回 FALSE

问题描述:

我希望此函数返回 true 并在路径 $pathfalse 上创建文件 $filename如果出于任何原因不可能。此外,如果文件已成功打开进行写入,则需要将 $content 放入其中。

参数$path 是公共(public)目录的相对路径,$filename 是任何有效的文件名。当然,如果路径指向公共(public)目录之外,我想避免创建文件。可以从子目录脚本调用函数,就像这个例子

# php script: /scripts/test.php
create_file('../data/', 'test.info', 'some contents');
# result file: /data/test.info

到目前为止我尝试了什么?

我试过使用 fopen() 来做到这一点和 fwrite()功能并且在某些服务器上有效,而在某些服务器上无效。我猜写权限有问题,chmod()但老实说,我对 chmod 属性不是很熟悉。我也无法检查 $path 是否指向服务器的公共(public)目录之外。

简而言之,我希望此函数创建文件并在文件不存在或文件存在且$owerwrite=true 时返回TRUE。否则,什么也不会发生,函数返回 FALSE

此外,我想知道无法在某些路径上创建文件的原因(理论上)。不正确的路径/文件名是我唯一的想法,我相信还有更多关于这个问题。

提前感谢您提供任何示例/示例/建议。

更新代码

到目前为止我有这段代码...

  function create_file($path, $filename, $content, $overwrite=false) {
$reldir = explode('/', trim(str_replace('\\', '/', dirname($_SERVER['PHP_SELF'])), '/'));
$dirdepth = sizeof($reldir);
$rpadd = $dirdepth > 0 ? '(\.\./){0,' . $dirdepth . '}' : '';
$ptpath = '#^/?' . $rpadd . '([a-z0-9]\w*/)*$#i';
$ptname = '/^[a-z]\w*\.[a-z0-9]+$/i';
if ($res = preg_match($ptpath, $path) && preg_match($ptname, $filename)) {
$res = false;
if ($overwrite === true || !file_exists($path.$filename)) {
if ($f = @fopen($path.$filename, 'w')) {
fwrite($f, $content);
fclose($f);
$res = true;
}
}
}
return $res;
}

最佳答案

一些建议:

  1. 设置 Web 服务器文档根目录的所有者:chown -R apache:apache/var/www(我想/var/www 是您的文档根目录,并且 Web 服务器 apache 与用户 apache 一起运行)。像这样设置文档根目录的权限,以使文档下的所有目录都具有权限 755(只有用户 apache 的所有者才能在文件夹/var/www 和子文件夹中写入)
  2. 阻止指向您的/var/www 文档根目录的路径:您遇到的问题称为 http://en.wikipedia.org/wiki/Directory_traversal_attack .如果 $path 类似于:/var/www/../../../etc/passwd 怎么办?basename php 函数可以帮助您识别这种恶意路径。看这个帖子:php directory traversal issue
  3. 检查一个文件是否已经存在:http://php.net/manual/en/function.file-exists.php

关于php - 强制在公共(public)目录中创建文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10053202/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com