我用PHP调用的数据文件神秘地被更改了.用户是否覆盖了它


The data file I call with my PHP was mysteriously changed. Did a user overwrite it?

我对PHP功能很感兴趣,但我对PHP安全性知之甚少 - 当然,这是一件大坏事。我正在自学这种语言,但资源有时比有用的要少一点。

我刚刚做了这个愚蠢的小网站:

http://www.ineedaprompt.com/

你可以看到,在"再次!"按钮的正下方是一个计数器。它显示单击按钮的次数。每次单击该按钮时,我的JS都会对PHP文件(计数器.php)进行Ajax调用,该文件会更新此文件:

http://www.ineedaprompt.com/counter.txt

每 100 毫秒,我使用 Ajax 调用来使用计数器文件的内容更新该计数器字段的值。

计数器最近远远超过100,但随后突然回落到0并重新开始。外部人员覆盖该计数器.txt文件有多容易?我该如何预防?

注意:我的.htaccess文件中没有任何与PHP有关的内容,因为我不确定要放什么。

请原谅我的无知和TMI,谢谢!

编辑:你们的速度非常快。

这是计数器.php代码:

<?php
$counter = file_get_contents("counter.txt");
$counter++;
file_put_contents("counter.txt", $counter);
?>

。以及我的JS中单击按钮时激活的代码:

$("#button").click(function(){
    $.ajax("counter.php");
});

。以及我的 JS 中每 100 毫秒激活一次的代码:

window.setInterval(function(){
    $.get("counter.txt", function(result){
        $("#counter").html(result);
    });
}, 100);

计数器没有限制。它实际上只是一个带有单个数字的文本文件。

写入数据时需要锁定文件,因为操作系统无法同时处理多个读取和写入,我在下面的站点中使用了,现在我的问题也解决了。我希望它对您和其他人有所帮助。

if( $fl = fopen("counter.txt", "r+") && flock( $fl ,  LOCK_EX ) )
{
  //empty the file
  ftruncate($fl, 0); 
  //move file pointer to beginning
  fseek($fl, 0); 
  //write
  fwrite($fl, $content);
  fflush($fl);
  flock($fl, LOCK_UN); 
  fclose($fl); 
}

"counter.txt"文件的读取和写入可能同时发生,当文件为空时调用file_get_contents("counter.txt")时,它会返回一个空白字符串。

然后,当您递增时,$counter++;空白字符串,它变为"1"。并且"1"被写入文件。

您可以尝试锁定文件,这里有一个带有一些示例代码的 SO 答案:在保持锁定的同时读取和写入文件