【问题标题】:PHP : POST-- How to replace defined KEY from ARRAY in a filePHP:POST--如何从文件中的ARRAY替换定义的KEY
【发布时间】:2011-02-16 22:05:19
【问题描述】:

我有点迷茫,因为我是 PHP 的“绿色”。

请教我如何解决这个问题:

on 'POST' --> 从文件中替换指定的数组键:

(错误:)

<?php
    $newData = $_POST["sendData"]; 

    if(isset($_POST['sendData'])){

        $file = fopen('fileToOpen.php', 'a');

        foreach($file as $key => $val) 
        {
            $data[$key] = explode("|", $val);
        }

        for($k = 0; $k < sizeof($file); $k++)
        {
            unset($data[$k][3]);
        }

        $data[$k][3] = "$newData";
        fwrite($file, $data[$k][3]);
        fclose ($file);

    }
?>

这是错误的,因为它继续写:

data1|data2|data3|oldDatanewData

而不是重写:

data1|data2|data3|新数据

还有其他技术可以实现类似的效果吗?也许是file_put_contents?我错过了implode吗?

谢谢!

【问题讨论】:

  • 第一个想法:将user-submitted data 写入.php 文件只是要求被黑客入侵。
  • fopen 返回资源,资源不能与 foreach 一起使用。提高你的 error_reporting!
  • @jnpcl 感谢您的关注,这是一个 Admin 选项,因为我已经使用 md5 编写了安全登录等等...这是必须写入 fl.fi 的管理员选择。数据库,最近要重用。 :)
  • @roXon:即便如此,使用不同的文件扩展名并阻止非脚本访问文件可能更聪明。 场景:您的管理员登录 cookie 被劫持,即使您的服务器/主机/ftp 登录不同,攻击者现在也有办法写入您服务器上的.php 文件。
  • @jnpcl 有趣。我对劫持不屑一顾。但是我在服务器上创建了一个临时文件。在管理员登录时(如果输入的用户名和密码正确),管理员 IP 存储 (md5) 到文件中。所以没有设置cookies。这是个好方法吗?

标签: php post flat-file


【解决方案1】:

不知道你在问什么,但也许你只需要序列化和反序列化数组。

$data_array = unserialize(file_get_contents('fileToOpen.php'));
$data_array[$key_you_want_to_change] = $new_data;
file_put_contents('fileToOpen.php', serialize($data_array));

【讨论】:

  • 我不认为提交者的文件是serialize() 格式,但file_get_contents/file_put_contents 部分是对的。
  • @aaz & @marines 正确,我想用 '|' 来爆炸入键。现在找到了第三个键:用发布的数据替换它(覆盖它)!
  • 我假设 roXon 会在读取之前将序列化数组保存在文件中。 :)
  • 好点。 @roXon,serialize()/unserialize() 如果您可以选择格式,则更健壮。如果没有,只需将其替换为implode('|', ...)/explode('|', ...)
  • @aaz @marines 它有效!!! explode('|') / implode('|', ...) 就像你说的!谢谢大家!我做错了:$data_array[3] = explode( file_get_contents('|', $fileName)); 正确:$data_array[3] = explode('|', file_get_contents($fileName)); !!! :)
【解决方案2】:

$newData = $_POST['sendData'];

 if(isset($_POST['sendData'])){

 $file = "fileToOpen.php";

$oldData = file_get_contents($file);

$oldData = eregi_replace("\n","",$oldData);

$FullDataArray = explode("?",$oldData); $oldDataArray = explode("|",$FullDataArray[1]);

$oldDataArray[3] = $newData;

$newDataString .= "

foreach($oldDataArray as $key=>$val) {

$newDataString .= $val;

if($key!="3") {

$newDataString .= "|";
}

}

$fh = fopen($file, 'w');

fwrite($fh,$newDataString);

fclose($fh);

}

?>

【讨论】:

  • 这会从文件中删除整行。 :( 我只需要覆盖第三个 arr。:| 我正在尝试修改上面的代码,但仍然没有成功。
猜你喜欢
  • 1970-01-01
  • 2021-09-18
  • 1970-01-01
  • 2016-09-20
  • 1970-01-01
  • 2012-01-28
  • 1970-01-01
  • 2017-08-13
  • 2017-11-03
相关资源
最近更新 更多