我希望用户能够提交网址,然后将该网址显示给其他用户作为链接。
如果我天真地重新显示用户提交的内容,我会将自己留给
这样的网址http://somesite.com' ><script>[any javacscript in here]</script>
当我将其重新显示给其他用户时,会做一些令人讨厌的事情,或者至少是因为没有阻止它而使我看起来不专业的事情。
是否有一个库,最好是在java中,它会清理一个url,以便它保留所有有效的URL,但是除掉任何漏洞/ tomfoolery?
谢谢!
答案 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
}