htmlspecialchars - 必须有更好的方法

时间:2011-10-18 22:05:46

标签: php htmlspecialchars

我的理解是所有变量都应该通过视图中的htmlspecialchars()输出。

是否有任何方法或方法可以执行此操作,而无需在每个视图中的每个相应行上指定函数?

我能想出的最好的方法是拥有如下的辅助函数: function html_escape($ var)

function h($var)
{
  if (is_array($var))
  {
    return array_map('h', $var);
  }
  else
  {
    return htmlspecialchars($var, ENT_QUOTES, 'UTF8');
  }
}

但是......这可能会变得非常繁琐!

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

您可以让函数h()输出转义数据,而不是返回它。因此,您可以编写<?php echo h($myvar); ?>而不是撰写<?php h($myvar); ?>。现在这比在不转换为实体的情况下回显变量短两个字符。

答案 1 :(得分:1)

这是一个重要的区别,请注意,所有变量必须通过htmlentities / htmlspecialchars运行,只有那些包含用户提供的内容,而且尚未根据规则集过滤防止包含任意代码。

您可以创建一个辅助函数来略微减少输入,或者通过控制器中的htmlentities / htmlspecialchars循环所有用户提供的输入,然后将它们移交给视图(尽管这可能效率较低,因为它是不太可能显示每个用户提供的输入)

答案 2 :(得分:0)

你所拥有的可能是你在最近的情况下最容易逃脱的。

就个人而言,我在我的变量上使用了一个小循环,如果我知道我将在我的html输出中使用任何$_GET变量,我运行它:

<?php
foreach($_GET as $key => $value) {
  $_GET[$key] = htmlspecialchars($value);
}
?>

然后立即启动我的html标签。

不是所有东西都需要被转义,除非用户对它有任何影响。

另外,你可以有一个名为escape.php的脚本,它对你使用的常见变量使用上面的方法,比如$ _GET,$ _POST,$ _COOKIE等,然后include('escape.php')在html输出中使用之前的脚本。

它完全取决于你的品味以及你的项目需要什么。