【问题标题】:How can one prevent double encoding of html entities when they are allowed in the input当输入中允许 html 实体时,如何防止它们的双重编码
【发布时间】:2011-02-05 23:15:10
【问题描述】:

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

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

例如,用户可以输入:

Stackoverflow & Perl = Awesome…

这最终被编码为

Stackoverflow & Perl = Awesome…

这在浏览器中呈现为

Stackoverflow & Perl = Awesome…

我们希望它呈现为

Stackoverflow & Perl = Awesome...

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

非常感谢任何帮助!

【问题讨论】:

  • 必须……而不是巨魔……关于静态类型系统……
  • @jleedev => 这与静态类型系统有什么关系?
  • 好吧,我还没有完全阅读整个问题。将脏用户输入与经过清理的输出分开是相关的。

标签: html perl cpan encode


【解决方案1】:

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

编辑

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

【讨论】:

  • 我认为尊重现有实体的方法是理想的。我知道在PHP中编码的相应方法有一个防止双重编码的标志。 Perl中有这样的方法吗?
【解决方案2】:

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

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

【讨论】:

  • 总是。始终以已知格式存储数据。不要混搭。始终在输入时解码(转换为已知格式)。始终在输出时进行编码(转换为显示或交互所需的格式)。适用于 HTML 实体的程度与适用于 Unicode 一样。
【解决方案3】:

你可以先解码字符串:

my $input = from_user();

my $encoded = encode_entities( decode_entities $input );

【讨论】:

    猜你喜欢
    • 2010-10-21
    • 1970-01-01
    • 2020-01-04
    • 1970-01-01
    • 2011-10-06
    • 2015-01-12
    • 2018-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多