【问题标题】:PHP bufferring output help. Generating a pre-named html pagePHP 缓冲输出帮助。生成一个预先命名的 html 页面
【发布时间】:2017-07-20 02:20:49
【问题描述】:

我正在尝试使用 php 输出缓冲功能在用户表单提交后创建一个新的 html 页面。

我在这里进行了研究,并在另一个线程上找到了有关此答案的帮助....https://stackoverflow.com/a/3775302/7637995

该建议确实对我有用,可以为我的服务器生成一个 html 页面。

但是,我需要更进一步,到目前为止,还没有找到方法。

正如我所说...使用该答案中提供的代码,并嵌入到我的 PHP 页面中...通过设置html页面的“名称”到“Mydocument”就像这样......

    <?php ob_start(); ?> 
    /* My 'Form Page' Content Here */ 
    <?php echo ''; 
    file_put_contents('Mydocument.html', ob_get_contents()); 
    ?>. 

但是...不必提前命名“一次性”目标 html 页面,而是每次都对其进行硬编码...我想知道是否可以自动拥有表单本身每次提交表单时为新的目标 html 页面生成一个名称。也许基于来自文本表单字段之一的输入数据。

例如,在表单中...我有一个名为“banner”的字段。输入该字段的文本最终成为 html 页面上文章的标题。

所以...我想知道“横幅”字段中的数据是否也可用于为目标 html 页面自动生成“名称”。

因此,我不必为目标 html 页面编写一个“名称”,例如; 'Mydocument.html'(或其他)...表单会在提交时自动为该 html 页面本身创建一个名称。

例如...如果我的标题(输入到表单的“横幅”字段中)是

“巨大的小行星撞击地球”

当 PHP 代码生成时,它可能看起来像这样......

    <?php ob_start(); ?> 
    /* My 'Form Page' Content Here */ 
    <?php echo '';      
      file_put_contents('Giant%Asteroid%To%Hit%Earth.html'
      , ob_get_contents()); 
    ?>. 

如果有人能帮我解决这个问题……将不胜感激。

【问题讨论】:

  • 只需让“表单页面”设置一个 PHP 变量,并将其用作file_put_contents...的第一个参数...但建议您清理您的输入!否则,有恶意的人可以制作标题来覆盖您服务器上的任意文件,并可能运行任意代码。
  • 首先直接回答这个问题:当然这样的事情是可能的。您只需使用将名称作为值保存的字符串变量,而不是您当前使用的硬编码名称。您如何构建该名称值以及取决于您的数据。您只需确保正确转义任何用户输入(客户端数据),以防止对有趣名称产生安全隐患。
  • 然而,整个问题看起来好像您并不真正了解如何以动态方式生成网页,例如通过 php.ini 生成网页。为什么要创建一个 html 文件?做什么的?为什么不将数据保存在数据库中并在请求时动态生成 html 文档?这为您省去了编写文件、清理文件和防止名称冲突的所有麻烦......
  • 谢谢大家。 arkascha ..你是对的。我意识到我很可能以错误的方式解决这个问题。我可以调用的数据库最终是我需要走的路。但正如您可能已经注意到的那样,我还没有达到我需要的编码水平。我很惊讶我能走到这一步。感谢您的回复和输入。暂时,直到我了解更多关于数据库等的知识……我将首先尝试下面的 symcbean 提供的 sn-p。我会尽快提供一些反馈。再次感谢。

标签: php buffering


【解决方案1】:
<?php 
  ob_start(); 
  $headline=str_replace('.', '_', basename($_REQUEST['banner']));
?> 
/* My 'Form Page' Content Here */ 
<?php echo '';      
  file_put_contents($headline . '.html'
  , ob_get_contents()); 

您应该在这里注意几件事:basename 函数修复了很多安全问题。而且我已经删除了多余的关闭“?>”

【讨论】:

  • 我可以建议用preg_replace('#[^_0-9a-zA-Z]#', '_', $_REQUEST['banner']); 代替basename() 吗? basename() 不处理反斜杠,它可能在 Windows 上被滥用以写入任何路径,也不处理空字节,它可以在早期版本的 PHP 中用于删除附加到字符串的任何内容,这样你就可以结束了,例如.php\x00.html 后缀,将被解释为 .php 并允许执行任意 PHP 代码。
  • @arkascha - 没有。你没有理解问题所在。虽然,公平地说,你提醒我即使 basename() 也不能解决所有问题(realpath 不能解决任何问题)。
  • @arkascha 我不明白这会有什么用。安全方面,basename() 不允许您写入任意位置,而realpath() 允许。在功能方面,realpath() 将在尚未创建的文件上返回一个空字符串。
  • @Siguza:我希望没有人还在运行这么旧版本的 php,但即使是当前版本的 php,取决于网络服务器配置,也可能被控制文件名的一部分的人欺骗:symcbean.blogspot.co.uk/2016/06/…
  • 发布一个新问题,显示您正在运行的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-22
  • 2011-02-14
  • 1970-01-01
  • 1970-01-01
  • 2014-02-01
相关资源
最近更新 更多