【问题标题】:htmlspecialchars does not work inside data-contenthtmlspecialchars 在数据内容中不起作用
【发布时间】:2018-05-16 22:02:15
【问题描述】:

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

这是我的代码:

"<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 &lt;/a&gt; is not showing up and has you can see in the source the &lt;/a&gt; is being interpred as html and not as a string as the other categorie names

谢谢!

【问题讨论】:

  • 是否回显$row[nome]
  • 所有这些的输出是什么,它是如何显示在您的页面上的,您希望它如何喜欢显示在您的页面上?
  • 基本上它将 解释为 html,我希望它将其解释为字符串而不是 html
  • 它确实会回显 $row[nome] 但问题是当它类似于 时,它会将其解释为 html 标签而不是字符串
  • 我们能看到的任何地方都没有&lt;/a&gt;。给我们该 PHP 代码的完整输出。

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


【解决方案1】:

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

如果您将看起来像 HTML 的内容放入属性中,则需要对其进行 HTML 编码以避免破坏 HTML 属性。例如,属性被引号包围,如果您想在属性内使用引号作为值,则需要&amp;quot;

attribute="&quot;value&quot;"

data-content 属性的值用作 HTML。
所以data-content="&amp;lt;span&amp;gt;" 最终会成为 HTML 元素 &amp;lt;span&amp;gt;

如果您希望它以 text”的形式结束,则需要提供呈现文本“”的 HTML,即&amp;lt;span&amp;gt;。由于您将其放入 HTML 属性中,因此您需要将 that 的 HTML 编码为:

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

☝️ 这是&amp;lt;span&amp;gt; 的正确 HTML 编码值(因为它在一个属性中),当解释为 HTML 时(就像 一样)呈现为文本“”。

所以:

$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)

【讨论】:

  • 我想我遗漏了一些东西:data-content='&amp;lt;span class=\"glyphicon glyphicon-stop\" style=\"color:". htmlspecialchars($row['cor']) ."\"&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span style=\"text-align:left\"&amp;gt;". htmlspecialchars($row['nome']) ."&amp;lt;/span&amp;gt;' 我只是不知道是什么......我没有真正理解你代码的最后一部分......
  • 是的,最里面的$row['nome'] 需要被HTML 编码两次。如果你真的使用我上面的代码,这一切都会容易得多。
  • 我真的不明白,因为我不明白 %s 是从哪里来的......
  • php.net/sprintf(看例子。不需要理解整个描述。)
  • 我设法理解了 sprintf 的工作原理!现在我可以理解你的代码了!谢谢!
猜你喜欢
  • 2012-07-06
  • 2020-12-15
  • 2018-09-04
  • 1970-01-01
  • 1970-01-01
  • 2014-06-09
  • 1970-01-01
  • 2012-09-14
  • 2012-10-18
相关资源
最近更新 更多