htmlspecialchars在数据内容

时间:2018-05-16 11:42:20

标签: php html security twitter-bootstrap-3 bootstrap-select

我正在使用bootstrap select来显示类别,我正在使用htmlspecialchars清理这些类别但由于某种原因,当它在数据内容属性内部时它不起作用,因为我有一个名为的类别,浏览器将其解释为是一个真正的HTML标签,而不是一个字符串。我曾尝试使用htmlentitites,但它也不起作用...我也有关于使用urlencode但因为我使用bootstrap选择我不知道在哪里解码它...

这是我的代码:

"<option value='$row[id]' data-content='<span class=\"glyphicon glyphicon-stop\" 
style=\"color:$row[cor]\"></span> <span style=\"text-align:left\"> 
".htmlspecialchars("$row[nome]",ENT_QUOTES)." 
</span>'>".htmlspecialchars("$row[nome]",ENT_QUOTES)."</option>";

As you can see all categories are showing (they have wierd names for testing purposes) but the last one that has the name of </a> is not showing up and has you can see in the source the </a> is being interpred as html and not as a string as the other categorie names

谢谢!

1 个答案:

答案 0 :(得分:0)

<被解释为HTML标记的开头 &lt;是HTML编码的实体,将被解释为字符“&lt;”。

如果将类似HTML的内容放入属性中,则需要对其进行HTML编码以避免破坏HTML属性。例如,如果您希望在属性中包含引号,那么该属性将被引号括起来,只需要&quot;

attribute="&quot;value&quot;"

使用data-content属性的值作为HTML 因此data-content="&lt;span&gt;"将最终成为HTML元素<span>

如果您希望它最终作为文本“&lt; span&gt;”,则需要提供呈现文字“&lt; span&gt;”的HTML,即&lt;span&gt; 。由于您将其添加到HTML属性中,因此您需要将 编码为:

data-content="&amp;lt;span&amp;gt;"

☝️这是&lt;span&gt;正确的HTML编码值(因为它在一个属性中),当被解释为HTML时(如所示)将呈现为文本“&lt; span&gt; ;”

所以:

$attrTemplate = '<span class="glyphicon glyphicon-stop" style="color:%s"></span>
                 <span style="text-align:left">%s</span>';
$attr = sprintf($attrTemplate, htmlspecialchars($row['cor']), htmlspecialchars($row['nome']));

$optionTemplate = '<option value="%s" data-content="%s">%s</option>';
printf($optionTemplate, htmlspecialchars($row['id']), htmlspecialchars($attr), htmlspecialchars($row['nome']));

正如您所看到的,您希望保留为HTML的所有内容都必须采用HTML编码(此处使用htmlspecialchars)。

另见The Great Escapism (Or: What You Need To Know To Work With Text Within Text)