file_put_contents后的头位置

时间:2016-08-24 12:12:16

标签: php redirect fwrite php-7

我尝试从文件中读取常量,并能够根据需要更改此常量。

因此,当需要写入此常量(对于此示例通过GET)时,我想重新加载页面以获得正确的值。

但是在重新加载之后,即使我的文件包含新值,似乎该常量仍然定义为旧值。

如果我在标题(位置)之前放置一个睡眠,一切正常。有没有睡眠的解决方案,为什么?

以下是示例文件:

<?php
  include_once 'toto.php';
  if (isset($_GET['test'])) {
    $file = "<?php const TOTO = '$_GET[test]'; ?>";
    file_put_contents('toto.php', $file);
    // sleep(3);
    header('Location: index.php');
    exit;
  }
  echo TOTO;
?>

我尝试用fopen + fwrite + fflush + fclose替换file_put_contents而没有更多成功。

3 个答案:

答案 0 :(得分:0)

上面的代码对我来说很好。

index.php包含哪些内容?

答案 1 :(得分:0)

概念破坏

constant的概念是在整个应用程序中它并没有改变它的价值。你违反了常数的原则。

不安全

此外,由于常量是通过用户输入定义的,并且写入文件,因此我们可以使用我们想要的任何恶意代码轻松劫持您的服务器。即:

http://localhost/index.php?test=42%27;eval($_GET[%27hack%27]);%3F>

然后我们可以向查询字符串追加我们想要执行的任何内容。

http://localhost/index.php?hack=echo%20shell_exec(%27cat%20%2Fetc%2Fpasswd%27)

中提琴,我们有你的/etc/passwd档案。从那里,我们可以获取您的/etc/shadow文件并劫持整个服务器。我们可以通过将命令传递给hack查询字符串参数,为您的服务器创建更多后门 - 几乎可以任何

修复

要修改您的脚本以使其不破坏此概念,或者您在将新值写入文件并阅读时没有竞争条件,请考虑使用cookie or a session (两者都是客户端唯一的;客户端可以编辑cookie,会话通常不会(会话ID是,但该会话ID绑定的值不是))。

<?php
  session_start();
  include_once 'toto.php'; //or put session_start(); at the top of this file
  if (isset($_GET['test'])) {
     $_SESSION['TOTO'] = $_GET['test']; //Do some sanitation here since it's user input.
     header('Location: index.php');
     exit;
  }

现在阅读本文,只需使用$_SESSION['TOTO'];

尽管如此,因为您已经提到过这应该是一个全局配置(即:整个应用程序和所有用户),然后使用ini filedatabase

答案 2 :(得分:-1)

您可以尝试输入此代码 -

<?php
include_once 'toto.php';
if (isset($_GET['test'])) {
    $file = "<?php const TOTO = '$_GET[test]'; ?>";
    if (file_put_contents('toto.php', $file)) {
        // sleep(3);
        header('Location: index.php');
        exit;
    }
}
echo TOTO;
?>

使用此代码,只有在将常量正确写入文件时才会调用标题函数。

此外,您的问题可能正在发生,因为在写入toto.php之前页面已被重定向。