htmlentities和htmlspecialchars ...如何在使用echo时始终使用它们?例如覆盖回声功能?

时间:2014-03-28 16:28:30

标签: php escaping

我有一个150页的应用程序,只需说2000输入字段,textareas和选择框。现在所有输入字段都调用数据上的原始函数echo。

e.g。

<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()来电

你的方法是什么?

红利问题: 有没有理由,不要在整个Web应用程序的所有回声上使用htmlspecialchars?

3 个答案:

答案 0 :(得分:0)

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

ob_start()缓冲应显示的所有内容(echos,php标记之外的任何代码,print_r,var_dump等)。

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

答案 1 :(得分:0)

使用输出缓冲的问题是您还将删除所有有效的 html 标签。

我使用以下函数:

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

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

答案 2 :(得分:-1)

首先让我告诉你,你的眼睛非常好。 Autoescaping是PHP世界中最近发现的。非常有价值的。

其次,你应该考虑后备模式,你需要原始输出或一些不同的格式(因为htmlspecialchars不是一个银弹,你知道)。

现在问题。

不幸的是,无法自动启动开箱即用,可能是本机PHP模板的最大缺点之一。因此,即使是最大的支持者,我强烈建议您使用已经具有此功能的 Twig

但如果您仍想使用本机PHP,那么您将需要两件事

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

    tpl::set('name', $variable, FLAGS);
    
  3. 您可以设置模板变量并灵活控制它们的转义。