1

我在这里做一个小实验。我有一个测试文件,我用它来运行一些代码,而不必实际登录我的应用程序。

无论如何,我今天有一个想法,我可以让页面自动编辑,让我更快地完成某些琐碎的任务,因为我什至不需要为它们打开文本编辑器。

主要是按原样工作,但我遇到了一件奇怪的事情;我希望有人碰巧有经验,或者可以阐明一些情况。

我不会发布整个文件的代码,只是相关的东西。这是基本思想:

索引.php:

<?php
if(isset($_POST['file'])) {
  // rewrite ourself
  $test_page = fopen('index.php', 'w');
  fwrite($test_page, $_POST['file']);
  fclose($test_page);
  header('Refresh: 0; ' . $_SERVER['PHP_SELF']);
  exit();
  die(); // we should never get this far...
}
?>
<?php <!-- All the tester stuff goes here --> ?>
<?php <!-- Nothing fancy just a bunch of function calls --> ?>
<!doctype html>
<html lang="en">
  <head>
  </head>
  <body>
    <div>
      <!-- a dump of the functions called in the tester area -->
    </div>
    <div>
      <form method='post'>
        <textarea name='file'>
<?php
$self = fopen('index.php', 'r');
while(!feof($self)) {
  echo fgets($self);
}
fclose($self);
?>
        </textarea>
        <input type="submit" value="Edit/Refresh">
      </form>
    </div>
  </body>
</html>

现在一切都很好,除了最后 5 个 HTML 标记没有写入文件;或者更准确地说,最后 5 个 HTML 标记没有被写入,textarea所以当需要保存时,在提交之后,它们显然没有被附加。到目前为止,我的理论是,一旦标签由 PHP 输出,它显然会关闭文本区域......所以我需要找到一种方法来获取文本区域内的关闭标签。我通过查看页面的来源验证了这一点,所以我认为它是正确的。

所以我想我只需要一种方法来“逃离”他们......

我知道这在安全性方面不是一件好事,但这只是我使用的一个本地页面(除了坐在我电脑前的人之外,任何人都无法使用它)。所以我们不需要讨论它显然可能存在的安全问题......

所有想法表示赞赏!:)

4

3 回答 3

3

解决问题的最简单方法是更换:

echo fgets($self);

和:

echo htmlspecialchars(fgets($self));

这样您仍然可以在文本框中看到特殊字符,但它们不会呈现为 html。

于 2012-07-31T21:47:24.080 回答
0

这是一个非常糟糕的主意,因为如果出现任何问题,它就会爆炸并且永远不会再工作,如果你没有备份,它就会永远消失。

这就是为什么人们使用 php 脚本之类的东西来动态生成网页而不修改底层文件的原因。我建议您只需添加一些存储到磁盘某处的设置。

于 2012-07-31T21:36:13.660 回答
0

您可以搜索并替换结束文本区域标签。再次调用它时与之相反。有一些函数可以替换所有 html 代码,但如果你只想做结束标记,我建议使用 str_replace() 或 str_ireplace() 自定义一个。

于 2012-07-31T21:51:33.010 回答