从"最佳实践"的角度来看,您认为使用PHP插入HTML的最佳方式是什么?目前我使用以下方法之一(主要是后者),但我很想知道你认为哪种方法最好.
[SOME MARKUP] [SOME OTHER MARKUP]
反对:
Kent Fredric.. 25
如果你打算以这种方式做事,你想要将你的逻辑和设计分开,这是真的.
但是你不需要使用Smarty来做这件事.
优先考虑的是心态.我看到人们在Smarty中做了令人震惊的事情,最终变成了人们在 Smarty中开发网站,然后一些明亮的火花将决定他们需要在Smarty中编写一个模板引擎(永远不要低估一个愚蠢想法的潜力).
如果您将代码分成两部分并强迫自己遵守标准,那么您将获得更好的性能.
PageLogic.php
foo = SomeValue; ob_start(); require("layout.php"); ob_end_flush();
layout.php中
foo[$i]; ?>
PHP是作为模板引擎编写的,因此在评估是否需要深入研究Smarty之前,至少应该尝试将其用于其设计任务.
此外,如果您决定使用模板引擎,请尝试在默认情况下获取一个转义HTML 并且"选择退出"而不是"选择加入".你会为自己节省很多XSS的麻烦.Smarty在这方面很弱,因此,有很多内容天真的模板写在其中.
{if $cond} {$dangerous_value} {else} {$equally_dangerous_value} {/if}
一般是Smarty模板如何去.问题是$ dangerous_value可以是任意的HTML,这只会导致更糟糕的编码实践,到处都是无法追踪的意大利面条代码.
您考虑的任何模板语言都应该迎合这种担忧.例如:
{$code_gets_escaped} {{$code_gets_escaped_as_a_uri}} {{{$dangerous_bare_code}}}
通过这种方式,您可以在模板中轻松辨别出潜在的利用门道,而不是作为DEFAULT行为的利用门户.
如果你打算以这种方式做事,你想要将你的逻辑和设计分开,这是真的.
但是你不需要使用Smarty来做这件事.
优先考虑的是心态.我看到人们在Smarty中做了令人震惊的事情,最终变成了人们在 Smarty中开发网站,然后一些明亮的火花将决定他们需要在Smarty中编写一个模板引擎(永远不要低估一个愚蠢想法的潜力).
如果您将代码分成两部分并强迫自己遵守标准,那么您将获得更好的性能.
PageLogic.php
foo = SomeValue; ob_start(); require("layout.php"); ob_end_flush();
layout.php中
foo[$i]; ?>
PHP是作为模板引擎编写的,因此在评估是否需要深入研究Smarty之前,至少应该尝试将其用于其设计任务.
此外,如果您决定使用模板引擎,请尝试在默认情况下获取一个转义HTML 并且"选择退出"而不是"选择加入".你会为自己节省很多XSS的麻烦.Smarty在这方面很弱,因此,有很多内容天真的模板写在其中.
{if $cond} {$dangerous_value} {else} {$equally_dangerous_value} {/if}
一般是Smarty模板如何去.问题是$ dangerous_value可以是任意的HTML,这只会导致更糟糕的编码实践,到处都是无法追踪的意大利面条代码.
您考虑的任何模板语言都应该迎合这种担忧.例如:
{$code_gets_escaped} {{$code_gets_escaped_as_a_uri}} {{{$dangerous_bare_code}}}
通过这种方式,您可以在模板中轻松辨别出潜在的利用门道,而不是作为DEFAULT行为的利用门户.
-1对于典型的歇斯底里'使用[我最喜欢的模板系统]来代替!帖子.每个PHP帖子,即使本机PHP答案是单行的,也总是退化到这里,正如每个单行JavaScript问题最终都充满了'使用[我最喜欢的框架]而不是!'.这让人很难堪.
说真的,我们知道将业务逻辑和表示问题分开.你可以在任何模板系统中做到这一点 - 或者不这样做 - 无论是PHP,Smarty还是完全不同的东西.没有一堆思考,没有模板系统可以神奇地区分你的顾虑.
(事实上,一个过于严格的模板系统最终可能会导致您必须编写纯粹表现性的辅助代码,使您的业务逻辑变得混乱.这不是一个胜利!)
为了回答所提出的问题,第一个例子没问题,但由于压痕不好而很难阅读.请参阅monzee的示例以获得更易读的方式; 您可以使用:notation或{} s,无论您喜欢哪种,但可读性的重要一点是将HTML和PHP保持为单个"格式良好"的缩进层次结构.
最后的请求:记住htmlspecialchars().每次纯文本需要进入网页时,必须使用它,或者它是全部的XSS.我知道这个问题与此没有直接关系,但每当我们发布包含<?php echo($ title)?>的示例代码或没有转义的框架等效时,我们都鼓励继续安全灾难区域大多数PHP应用程序已成为.
最重要的考虑因素是将逻辑与表示分开 - 较少的耦合将使未来的变化更加直接.
你甚至可能想考虑使用像smarty这样的模板系统.