我的理解是所有变量都应该通过视图中的htmlspecialchars()输出。
是否有任何方法或方法可以执行此操作,而无需在每个视图中的每个相应行上指定函数?
我能想出的最好的方法是拥有如下的辅助函数: function html_escape($ var)
function h($var)
{
if (is_array($var))
{
return array_map('h', $var);
}
else
{
return htmlspecialchars($var, ENT_QUOTES, 'UTF8');
}
}
但是......这可能会变得非常繁琐!
有什么想法吗?
答案 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输出中使用之前的脚本。
它完全取决于你的品味以及你的项目需要什么。