当输入中允许html实体时,如何防止html实体的双重编码

时间:2010-04-09 01:31:56

标签: html perl cpan encode

如何防止html实体的双重编码,或以编程方式修复它们?

我正在使用HTML::Entities perl模块中的encode()函数来编码用户输入中的HTML实体。这里的问题是我们还允许用户直接输入HTML实体,这些实体最终被双重编码。

例如,用户可以输入:

Stackoverflow & Perl = Awesome…

这最终被编码为

Stackoverflow & Perl = Awesome…

这在浏览器中呈现为

Stackoverflow & Perl = Awesome…

我们希望将其呈现为

Stackoverflow & Perl = Awesome...

有没有办法阻止这种双重编码?或者是否有一个模块或代码片段可以轻松纠正这些双重编码问题?

非常感谢任何帮助!

3 个答案:

答案 0 :(得分:6)

您可以先解码字符串:

my $input = from_user();

my $encoded = encode_entities( decode_entities $input );

答案 1 :(得分:4)

有一种非常简单的方法可以避免这种情况:

  1. 在输入时删除所有实体(将其转换为Unicode)
  2. 在输出阶段再次对实体进行编码。

答案 2 :(得分:1)

考虑将调用保存到encode(),直到您检索显示值,而不是在存储之前。只要您的检索机制保持一致,数据库中的额外数据可能就不值得烦恼了。

修改

重新阅读你的问题我现在意识到我的答案没有完全解决这个问题,因为稍后调用encode()仍然会有相同的结果。我自己不知道替代方案,它可能没什么帮助,但您可能想要考虑找到一种更合适的编码方法,以尊重现有符号。