【问题标题】:how can I clean and sanitize a url submitted by a user for redisplay in java?如何清理和清理用户提交的 url 以便在 java 中重新显示?
【发布时间】:2012-08-25 00:40:56
【问题描述】:

我希望用户能够提交一个 url,然后将该 url 作为链接显示给其他用户。

如果我天真地重新显示用户提交的内容,我会让自己对诸如

之类的 URL 持开放态度
http://somesite.com' ><script>[any javacscript in here]</script>

当我将它重新显示给其他用户时会做一些令人讨厌的事情,或者至少会因为没有阻止它而让我看起来不专业。

是否有一个库,最好是在 java 中,它会清理一个 url,以便它保留所有有效的 url,但清除任何漏洞/tomfoolery?

谢谢!

【问题讨论】:

  • 看看here
  • 你想要 URLEncoding 或者你不想显示整个 URL ???
  • 这个问题要求一个**有效的 URL 正则表达式:stackoverflow.com/questions/161738/…**。答案很有帮助。您只需要在 java 中创建一个正则表达式匹配器

标签: java javascript html security


【解决方案1】:

具有' 的网址完全有效。如果您将它们输出到 HTML 文档而不进行转义,那么问题在于您缺少 HTML 转义,而不是输入检查。您需要确保每次将任何可变文本(包括 URL)输出到 HTML 文档中时调用 HTML 编码方法。

Java 没有内置的 HTML 编码器(表现不佳!),但大多数 Web 库都有(take your pick,或者自己编写并替换一些字符串)。如果你使用 JSTL 标签,你会得到escapeXml 默认免费做:

<a href="<c:out value="${link}"/>">ok</a>

虽然您的主要问题是 HTML 转义,但验证输入 URL 是否有效以捕获错误仍然可能有益 - 您可以通过使用 new URL(...) 解析它并查看是否收到 MalformedURLException 来做到这一点。

您还应该检查 URL 是否以已知良好的协议开头,例如 http://https://。这将防止任何人使用危险的 URL 协议,如 javascript:,这可能会像 HTML 注入一样容易导致跨站点脚本。

【讨论】:

    【解决方案2】:

    我认为您正在寻找的是输出编码。看看OWASP ESAPI,这是在 Java 中执行编码的久经考验的方法。

    另外,只是一个建议,如果您想检查用户是否提交了恶意 URL,您可以对照 Google 恶意软件数据库进行检查。你可以使用SafeBrowing API。

    【讨论】:

      【解决方案3】:

      你可以使用apache validatorURLValidator

      UrlValidator urlValidator = new UrlValidator(schemes);
      if (urlValidator.isValid("http://somesite.com")) {
         //valid
      }
      

      【讨论】:

      • 不要那样做——你可能仍然容易受到基于 DOM 的 XSS 注入的影响
      • 基本上,带有一些转义 HTML 字符(' 或 " )的有效 URL 最终会落在您的 HTML 上,更改
      猜你喜欢
      • 2012-04-06
      • 2012-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-30
      • 2013-05-29
      • 1970-01-01
      • 2023-03-27
      相关资源
      最近更新 更多