6

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

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

例如,用户可以输入:

Stackoverflow & Perl = Awesome…

这最终被编码为

Stackoverflow & Perl = Awesome…

这在浏览器中呈现为

Stackoverflow & Perl = Awesome…

我们希望它呈现为

Stackoverflow & Perl = Awesome...

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

任何帮助是极大的赞赏!

4

3 回答 3

7

您可以先解码字符串:

my $input = from_user();

my $encoded = encode_entities( decode_entities $input );
于 2010-04-09T01:48:52.573 回答
4

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

  1. 在输入时删除所有实体(将它们转换为 Unicode)
  2. 在输出阶段再次编码成实体。
于 2010-04-09T01:48:46.557 回答
1

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

编辑

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

于 2010-04-09T01:38:17.697 回答