0

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

是否有任何方法或方法可以做到这一点,而不必在每个视图的每个适当行上指定函数?

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

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

但是……这可能会变得非常乏味!

有任何想法吗?

4

3 回答 3

2

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

于 2011-10-18T22:14:07.637 回答
1

需要注意的一个重要区别是,并非所有变量都必须通过 htmlentities/htmlspecialchars 运行,只是那些无论如何都包含用户提供的内容、尚未针对规则集进行过滤以防止任意代码包含的变量。

你可以创建一个辅助函数来稍微减少打字,或者在你的控制器中通过 htmlentities/htmlspecialchars 循环所有用户提供的输入,然后再将它们传递给视图(不过,这可能会降低效率,因为它不太可能每一块将显示用户提供的输入)

于 2011-10-18T22:11:05.680 回答
0

你所拥有的可能是你在各种情况下最接近轻松逃脱的地方。

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

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

然后立即开始我的html标签。

除非用户对其有任何影响,否则并非所有内容都需要转义。

此外,您可以有一个名为 的脚本escape.php,它在您使用的常用变量上使用上述方法,如 $_GET、$_POST、$_COOKIE 等,然后include('escape.php')在您的脚本中使用它,然后在 html 输出中使用。

整个过程在很大程度上取决于您的品味以及您的项目需要什么。

于 2011-10-18T22:15:25.883 回答