题
我正在写一PHP应用程序,有一个"控制面板",写入一个首选项文件的某些变量。在每 POST
, 如果文件不存在,它是创建。如果它确实存在的,它是 unlinked
和一个新的文件 touched
与同一文件和新的变量。该文件包含在另一个页面上显示的内容基础上的变量。
$file = "phpsettings.php";
if (!file_exists($file)) {
touch($file);
$handle = fopen ($file, 'r+');
$str = "<?php \$pref1 = \"$mypref\"; ?>";
} else {
unlink($file);
touch($file);
$handle = fopen ($file, 'r+');
$str = "<?php \$pref1 = \"$mypref\"; ?>";
}
fwrite ($handle, $str);
fclose ($handle);
这是一个安全的方式编写的喜好,提供这种文件将复盖很多次,每一天吗?什么是一个很好的方式,既提醒用户的这个控制面板如果文件不是正确保存,在这种情况下,这将是一个良好的应急计划以避免破坏这页的首选项文件包含短期的定义默认设置的变量,以填补如果 !(file_exists)
?
解决方案
如果存储设置在一个阵列,可以serialize()他们写入文本的文件,而不是编写原php to php文件,包括它。
如果你没有消毒你的输入对于那些偏好,并说$mypref1表示人的名称,没有什么阻止他们从填补这一形式领域:
\"; echo \"PWNED
和你的导致PHP将成为
<?php \$pref1 = \"$mypref\"; echo \"PWNED\"; ?>
所以首先,你的喜好存储在一个阵列和使用serialize()更安全:
$prefs = array('mypref1' => 'somethingorother');
$handle = fopen ($file, 'w');
fwrite($handle, serialize($prefs));
fclose($h);
// example code demonstrating unserialization
$prefs2 = unserialize(file_get_contents($file));
var_dump($prefs == $prefs2); // should output "(bool) true"
在你问题,你还说,如果文件不存在,这是取消链接。你可以简单地截断为零的长度通过"w"作为第二个参数fopen-你不需要手动删除。这应该设置mtime无论如何,无需呼叫摸().
如果价值观写入该文件的偏好,当然每一个偏好可以默认,除非有数以百计?array_merge会让你重写在每一个关键依据,那么如果你做事情是这样的:
// array of defaults
$prefs = array(
'mypref1' => 'pants',
'mypref2' => 'socks',
);
if (file_exists($file)) {
// if this fails, an E_NOTICE is raised. are you checking your server error
// logs regularly?
if ($userprefs = unserialize(file_get_contents($file))) {
$prefs = array_merge($prefs, $userprefs);
}
}
如果问题是,有很多,你不希望有初始化他们全部,你可以有一个get_preference方法,它只是包装isset呼吁的首选项阵列。
function get_preference($name, &$prefs) {
if (isset($pref[$name]))
return $pref[$name];
return null;
}
var_dump(get_preference('mypref1', $prefs));
超越了所有的问题,这就提出了虽然,现实是,在不太可能发生的事件的东西 做 去错fopen,它应被视为一个严重的失败,无论如何,这些用户,你很可能会有使用这个要素是要接触你这漂亮的该死的快速如果出现错误。
其他提示
它始终是最好存储用户国家中的一届会议和只有坚持这一状态的需要的时候。
为什么不只是使用的截断能力的fopen()?我相信,而不是"r+",只需要通过"w+"...然后如果文件是存在的,它将被截断,如果没有你只会创建一个新的文件。这样的代码变为:
$file = "phpsettings.php";
$handle = fopen( $file, 'w+' );
$str = "<?php \$pref1 = \"$mypref\"; ?>";
fwrite ($handle, $str);
fclose ($handle);