2

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

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

http://somesite.com' ><script>[any javacscript in here]</script>

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

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

谢谢!

4

3 回答 3

3

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

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

于 2012-08-30T10:59:12.457 回答
3

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

Java 没有内置的 HTML 编码器(表现不佳!),但大多数 Web 库都有(随你选择,或者自己编写一些字符串替换)。如果您使用 JSTL 标签,escapeXml默认情况下您可以免费使用:

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

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

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

于 2012-08-30T14:48:48.920 回答
1

您可以使用apache 验证器 URLValidator

UrlValidator urlValidator = new UrlValidator(schemes);
if (urlValidator.isValid("http://somesite.com")) {
   //valid
}
于 2012-08-30T10:09:39.203 回答