我正在使用php开发一个Web应用程序,并根据我的需求创建了一个小框架。该框架的一部分是模板引擎,我可以在其中将值列表提供给html模板。
在这些模板中,我非常依赖
之类的结构<?= $value ?>
在约定的情况下,$ value不能包含应该如此处理的html标记。有了这个,我想我应该能够使用
对我的应用程序进行xss证明<?= htmlspecialchars($value) ?>
或
<?= htmlentities($value) ?>
在适当的地方。
但是,因为我要求$ value不能包含任何html标记,所以我注意到我可以要求每次出现都被转义,而不会丢失功能。
当然,只是总是明确地调用'htmlspecialchars'似乎是一个荒谬的写入开销量,因此我想知道是否有办法使这个调用隐式?
以这种方式,
<?= $value ?>
总是等同于
<?= htmlspecialchars($value) ?>
感谢。
答案 0 :(得分:1)
覆盖默认的php功能可能不是一个好主意,因为迟早的外国代码可能会进入你的项目,不符合你的机会。
我会采用另一种方式将调用添加到htmltentities
作为模板引擎的默认函数。你如何为它分配变量?例如,我曾经写过一个小模板引擎,基本上使用this->view->assign('name',$var)
调用将变量传递给模板,并在我处理的指定变量之前在代码部分中进行转义(您还可以添加方法{{1它真正传递原始内容而不转义。
当然,如果你传递数组,你将不得不处理它们recursiveley,也处理键。如果你传递对象,一切都可能变得更加困难,因为你可能不想在这里自动替换值并事先克隆它们可能会变得昂贵。您仍然必须知道您传递到模板中的内容,但它可以帮助您避免最常见的错误。也许您应该看看像Smarty3或Twig这样的现代模板引擎如何解决这些问题。