我尝试从文件中读取常量,并能够根据需要更改此常量。
因此,当需要写入此常量(对于此示例通过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而没有更多成功。
答案 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 file或database。
答案 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之前页面已被重定向。