如何清理和清理用户提交的用于在java中重新显示的URL?

时间:2012-08-30 09:56:22

标签: java javascript html security

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

如果我天真地重新显示用户提交的内容,我会将自己留给

这样的网址
http://somesite.com' ><script>[any javacscript in here]</script>

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

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

谢谢!

3 个答案:

答案 0 :(得分:3)

我认为你要找的是输出编码。看看OWASP ESAPI,它是经过试验和测试的方法,可以用Java执行编码。

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

答案 1 :(得分:3)

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

Java没有内置的HTML编码器(糟糕的节目!),但是大多数网络库都会这样做(take your pick,或者用一些字符串替换自己编写)。如果您使用JSTL标记,则默认情况下会escapeXml免费执行此操作:

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

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

您还应该检查网址是否以http://https://等已知良好的协议开头。这将阻止任何人使用像javascript:这样的危险URL协议,这可以像HTML注入一样轻松地实现跨站点脚本编写。

答案 2 :(得分:1)

您可以使用apache validator URLValidator

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