Security 在Smarty模板中将字符串替换为html标记

Security 在Smarty模板中将字符串替换为html标记,security,replace,smarty,xss,Security,Replace,Smarty,Xss,我想用Smarty模板中的html标记替换搜索查询,但我遇到了一个问题 当我在Smartyreplace()函数中使用html标记时,我得到一个错误 这是我用html标记替换搜索查询的代码 {$tools[x].tool_title|replace:$q:'<b>$q</b>'} {$tools[x].tool_title | replace:$q:'$q'} 您需要使用双引号(使用变量值-否则将被视为原始字符串),并且需要使用nofilter 对于以下代码: {a

我想用Smarty模板中的html标记替换搜索查询,但我遇到了一个问题

当我在Smarty
replace()
函数中使用html标记时,我得到一个错误

这是我用html标记替换搜索查询的代码

{$tools[x].tool_title|replace:$q:'<b>$q</b>'}  
{$tools[x].tool_title | replace:$q:'$q'}

您需要使用双引号(使用变量值-否则将被视为原始字符串),并且需要使用
nofilter

对于以下代码:

{assign var="q" value="sample"}
{assign var="text" value="This is sample text"}
{$text|replace:$q:"<b>$q</b>" nofilter}
{assign var="q" value="sample"}
{assign var="text" value="This is sample text <script>alert('hello');</script>"}
{$text|replace:$q:"<b>$q</b>" nofilter}
{assign var="q" value="sample"}
{assign var="text" value="This <b>is</b> sample text <script>alert('hello');</script>"}
{$text|escape|replace:$q:"<b>$q</b>" nofilter}
{assign var=“q”value=“sample”}
{assign var=“text”value=“这是示例文本”}
{$text |替换:$q:$q“nofilter}
页面源中的输出为:

This is <b>sample</b> text
这是示例文本
然而,你需要知道这可能是潜在的危险。考虑下面的代码:

{assign var="q" value="sample"}
{assign var="text" value="This is sample text"}
{$text|replace:$q:"<b>$q</b>" nofilter}
{assign var="q" value="sample"}
{assign var="text" value="This is sample text <script>alert('hello');</script>"}
{$text|replace:$q:"<b>$q</b>" nofilter}
{assign var="q" value="sample"}
{assign var="text" value="This <b>is</b> sample text <script>alert('hello');</script>"}
{$text|escape|replace:$q:"<b>$q</b>" nofilter}
{assign var=“q”value=“sample”}
{assign var=“text”value=“这是示例文本警报('hello');”}
{$text |替换:$q:$q“nofilter}
它将显示JavaScript警报,因为页面源现在是:

This is <b>sample</b> text <script>alert('hello');</script>
这是示例文本警报(“hello”);
但是,您似乎可以使用以下代码对其进行操作:

{assign var="q" value="sample"}
{assign var="text" value="This is sample text"}
{$text|replace:$q:"<b>$q</b>" nofilter}
{assign var="q" value="sample"}
{assign var="text" value="This is sample text <script>alert('hello');</script>"}
{$text|replace:$q:"<b>$q</b>" nofilter}
{assign var="q" value="sample"}
{assign var="text" value="This <b>is</b> sample text <script>alert('hello');</script>"}
{$text|escape|replace:$q:"<b>$q</b>" nofilter}
{assign var=“q”value=“sample”}
{assign var=“text”value=“这是示例文本警报('hello');”}
{$text | escape | replace:$q:“$q”nofilter}
其页面来源为:

This &lt;b&gt;is&lt;/b&gt; <b>sample</b> text &lt;script&gt;alert(&#039;hello&#039;);&lt;/script&gt;
此bis/b示例文本scriptalert(';你好';)/剧本
因为首先使用
转义
修饰符转义
$text
变量中的所有内容,然后在安全输入时执行替换