【问题标题】:How do you un-encode single and double quotes in java?你如何在java中取消编码单引号和双引号?
【发布时间】:2011-09-20 19:07:19
【问题描述】:

我使用AntiSamy 来清理用户输入并且效果很好。有一个问题:它编码单引号和双引号。所以如果我想编辑一些东西,my sample's 会被渲染而不是my sample's——单引号会被编码。

澄清:浏览器正确呈现引号,但它们作为 HTML 实体保存在我的数据库中。因此,当用户加载帖子进行编辑时,HTML 实体会显示在文本字段中。

  1. 有没有办法绕过这个限制?
  2. 我应该使用/是否有其他工具?

我的用户可以发布代码和其他各种东西。所以 AntiSamy 在那里做得很好。但我不想在普通文本中转换单引号和双引号。

我有什么选择?

【问题讨论】:

    标签: java quotes sanitization


    【解决方案1】:
    String s = "string unencode ' "NOW"";
    String unencoded = s.replaceAll("'", "'").replaceAll(""","\"");
    myTextField.setText(unencoded);
    

    【讨论】:

      【解决方案2】:

      如果AntiSamy没有反转方法,这个东西特别可以由commons-lang的StringEscapeUtils.unesacpeHtml(..)处理。

      浏览器知道如何显示',所以应该没有问题。仅当您要在文本区域或其他输入控件或浏览器外部显示文本时才使用上述内容。

      【讨论】:

      • 对不起,我没有很好地解释自己。我说的是当用户加载帖子进行编辑时,文本字段显示原始文本,其中包含 HTML 实体。所以 AntiSamy 在我的东西进入数据库之前对其进行编码。这可以。我只是不希望它在普通文本中编码单引号和双引号——例如 StackOverFlow。他们对所有内容进行编码,但他们引用了普通文本。我希望这是有道理的。
      • 此外,不能使用 StringUnescapeUtils,因为它可能会编码危险的输入。我想我只是想对我编码和不编码的内容有所选择。
      • 那么我的第一段应该适合你
      • @dee - 仅用于取消转义输入,以便显示。之后您将再次通过 AntiSamy 传递编辑后的输入
      • StringEscapeUtils 将不起作用。它将对潜在危险的输入进行编码。由于它对单引号进行编码,它还会对 HTML 括号和脚本示例进行编码,不是吗?
      【解决方案3】:

      如果您只需要转义输入中的潜在危险字符,您可以将该输入以其原始形式存储在数据库中并在输出中对其进行编码。

      如果编码过程更复杂(即应用了一些标签白名单或格式化规则),您可以存储两个版本的输入 - 一个用于显示的编码 HTML 版本和一个用于编辑的原始版本,并在原始版本已修改。

      【讨论】:

      • 谢谢。这有点棘手,因为有些用户可以编辑其他人的帖子。这意味着必须对原始文本进行清理。但它必须针对有害内容进行清理,同时保持复杂的格式规则和示例代码......它不应该在普通文本中编码引号。
      • 一个很好的例子是 StackOverFlow 是如何做到的。他们消毒一切。但是当你去编辑你的帖子时,一切都很好。单引号和双引号不编码。
      • @dee:我相信 StackOverflow 使用了上面描述的第二种方法。
      猜你喜欢
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      • 2013-12-14
      • 2013-02-16
      • 2013-08-25
      • 2011-01-23
      相关资源
      最近更新 更多