【问题标题】:htmlentities and htmlspecialchars... how to always use them when using echo? e.g. overwrite echo function?htmlentities 和 htmlspecialchars... 使用 echo 时如何始终使用它们?例如覆盖回声功能?
【发布时间】:2014-03-28 16:28:29
【问题描述】:

我有一个应用程序,比如说 150 页,让我们说 2000 个输入字段、文本区域和选择框。现在所有输入字段都调用原始函数 echo 对数据。

例如

<input type="text" name="in_county" value="<? echo $citiesRow["county"]; ?>">

而实际上所有函数都应该调用类似

<input type="text" name="in_county" value="<? echo htmlspecialchars($citiesRow["county"] , ENT_COMPAT , "ISO-8859-1"); ?>">

现在我可以访问所有 150 个页面并更改/替换所有 2000 个字段

现在好了,在整个项目中这样做很糟糕,对吧? 我想,我可以以某种方式(?)覆盖 echo 函数并保持良好状态。或者搜索用mysaveechofunction()替换所有echo调用

你的方法是什么?

奖金问题: 是否有理由不在整个 Web 应用程序的所有回声上使用 htmlspecialchars?

【问题讨论】:

  • 不可能“覆盖回声”,因为echo 不是函数,而是语言结构。我会采用您的第二种方法并将其替换为自定义函数。
  • 第二个选项.... 在编写它们时应该在第一个地方完成
  • echo 不保留用于打印到 HTML 页面。如果可以“覆盖”它以在每次使用时自动转义 HTML,那将是一场灾难并破坏各种数据。另外,当然,你永远不能用它来打印 HTML 代码......

标签: php escaping


【解决方案1】:

您可以在代码的开头使用ob_start(),在结尾使用ob_get_clean()

ob_start() 缓冲应该显示的所有内容(回声、php 标签之外的任何代码、print_r、var_dump 等)。

ob_get_clean() 结束缓冲并返回缓冲的所有内容,将其保存在变量中并根据需要进行操作。

【讨论】:

    【解决方案2】:

    使用输出缓冲的问题是你也会删除所有有效的 html 标签。

    我使用以下函数:

    function _O($str) { return htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); }
    

    在输出所有用户提交的字符串时使用它。

    【讨论】:

      【解决方案3】:

      首先让我告诉你,你的眼睛非常好。自动转义是 PHP 世界中最近的发现。而且非常有价值。

      其次,您应该考虑回退模式,您需要原始输出或一些不同的格式(因为 htmlspecialchars 不是灵丹妙药,您知道)。

      现在解决您的问题。

      不幸的是,无法自动转义开箱即用可能是原生 PHP 模板的最大缺点之一。所以,即使是他们最大的支持者,我还是强烈建议你使用 Twig,它已经有这个功能了。

      但如果你仍然想使用原生 PHP,那么你需要两件事

      1. 仅将标量和常规数组传递到模板的严格规则。根本没有延迟加载模型!
      2. 您将需要简单的模板处理程序,它允许您为模板设置变量并使用此数据集呈现它。所以,有一个像这样的司空见惯的方法

        tpl::set('name', $variable, FLAGS);
        

      您可以设置模板变量并灵活控制它们的转义。

      【讨论】:

      • +1 用于提及树枝。第二部分,我完全没看懂
      猜你喜欢
      • 2017-09-05
      • 2016-10-19
      • 1970-01-01
      • 1970-01-01
      • 2020-09-30
      • 1970-01-01
      • 2015-12-27
      • 1970-01-01
      • 2018-05-03
      相关资源
      最近更新 更多