Php 为什么不是';文件内容覆盖?

Php 为什么不是';文件内容覆盖?,php,javascript,Php,Javascript,我有一个用户可以使用的所见即所得编辑器页面。编辑之后,他们可以按下按钮,javascript应该将当前页面发布到save.php文件中,并用新信息刷新页面 有两个问题。首先,最初页面不会加载更新的文件。用户必须刷新页面才能看到它被更新(可能只需要额外的一秒钟来写入文件?)。第二个问题是,在第一次创建临时文件后,它无法被覆盖,因此页面在第一次刷新后不会更新。以下是我正在处理的代码片段: 所见即所得编辑器页面(editor.php)上的Javascript函数: save.php文件 $html =

我有一个用户可以使用的所见即所得编辑器页面。编辑之后,他们可以按下按钮,javascript应该将当前页面发布到save.php文件中,并用新信息刷新页面

有两个问题。首先,最初页面不会加载更新的文件。用户必须刷新页面才能看到它被更新(可能只需要额外的一秒钟来写入文件?)。第二个问题是,在第一次创建临时文件后,它无法被覆盖,因此页面在第一次刷新后不会更新。以下是我正在处理的代码片段:

所见即所得编辑器页面(editor.php)上的Javascript函数:

save.php文件

$html = $_POST['html'];
$username = $_POST['username']; 
file_put_contents('temp/' . $username . '.txt', $html);

为什么不使用
fopen
fwrite

只需使用:

$html = $_POST['html'];
$username = $_POST['username']; 
$file = "temp/" . $username . ".txt";

if (!file_exists($file)) {
  $files = fopen($file, "x+");
} else {
  $files = fopen($file, "w+");
}

if(fwrite($files, $html)) {
  echo "Success!";
} else {
  echo "Failure!";
}
对于php,为了使刷新在js中工作,请尝试将语句放入success函数中,如下所示:

function refresh(html,username,info) {
    $.post("save.php", { html: html, username: username }, 
            function (response) {
             window.location = 'editor.php?info=' + info;
             console.log(response);// for debugging :) 
           });
}

ajax请求是异步的,因此在重定向启动时可以进行写入操作。您必须侦听$.post操作的已完成exent以执行重定向。

由于浏览器在导航到下一页之前可能未发出post请求,请使用post的成功回调来执行重新定位:

function refresh(html,username,info) {
  $.post("save.php", { html: html, username: username }, function() {
    window.location = 'editor.php?info=' + info;
  });
}
正如其他人已经评论过的那样,直接使用表单帖子中的数据而不进行清理,这是一个非常糟糕的计划,会让您的服务器面临各种恶意攻击。看看其中的一些问题:


如果数据进入服务器正常,请确保目录“temp”上的访问权限允许web服务器用户进行写访问(如果您有权访问服务器的SSH,请运行
chmod go+w/path/to/temp
,否则大多数FTP程序也允许您设置文件权限)。

安全漏洞
username=../save.php%00
html=始终正确清理数据。如果您不知道如何创建,请阅读教程。创建文件时,该文件具有哪些权限?我不理解安全漏洞。正在创建的文件将是.txt,您将如何在该文件上执行PHP?创建文件后,该文件的权限为644,但即使我手动将其更改为777,它仍然不起作用。@James:ThiefMaster知道或假设(我无法确认)就文件名而言,文件系统函数不是二进制安全的(即解析将在第一个NUL字节停止)。因此,
%00
的工作原理与
-
在SQL注入攻击中的工作原理非常相似。为什么
fopen
的行为会与
文件内容
有任何不同?如果我们看不到的其余代码是正确的,那么
文件内容
在正确的代码下无法工作,尝试fopen似乎是合乎逻辑的,对我来说从来没有失败过。我也尝试过fopen/fwrite,但结果相同。谢谢你的成功功能。@Christopherkeney:尝试
fopen
似乎不符合逻辑。
function refresh(html,username,info) {
  $.post("save.php", { html: html, username: username }, function() {
    window.location = 'editor.php?info=' + info;
  });
}