【问题标题】:Escape urls in JSF to prevent XSS [duplicate]在 JSF 中转义 url 以防止 XSS [重复]
【发布时间】:2020-05-02 10:13:18
【问题描述】:

我在一个我想要处理的 html 输入字段 (<input type="text">) 中有一个 XSS 漏洞。 html 输入用于社交媒体网址(例如 Facebook、Linkedin、Jabber、Skype 等),后来显示为:<a href=link>link</a>

没有验证,因此用户可以输入他们想要的任何内容。然后,当有人点击应用程序中的链接时,如果有危险的javascript,它将被执行。我决定做的是在输出中转义这些 url,这样它们就不会在点击时执行任何 javascript。我正在使用 jsf 作为视图,但找不到可以帮助我正确修复它的工具。

首先,我想在保存用户输入之前进行一些基本的 url 验证,但由于 url 的复杂性(链接可能不以协议开头,它可以是任何名称,因为某些社交媒体将具有默认地址前缀(方案)在系统中,对于前Skype:对于Skype,所以网址可能是:linkedin.com/in/name 或 asdqwe)我不得不放弃这个想法。

我试图做的是用 StringEscapeUtils.escapeJavaScript 方法从 apache.commons.lang 转义这些 url,但它并不能阻止每种类型的危险代码,例如它不会阻止输入:javascript:alert(0); 所以我正在寻找对于可以让我转义这些 url 以完全或几乎完全防止 xss 的工具。感谢您的帮助。

【问题讨论】:

标签: java security jsf xss


【解决方案1】:

实际上,您应该通过 UrlValidator 验证 URL 格式的输入,以确保交互式内容(在您的情况下 - 超链接)与您的格式匹配并且可以安全地单击。示例如下:

使用“http”和“https”的有效方案构造一个 UrlValidator。

String[] schemes = {"http","https"}.
UrlValidator urlValidator = new UrlValidator(schemes);
if (urlValidator.isValid("https://facebook.com")) {
   System.out.println("url is valid");
} else {
   System.out.println("url is invalid");
}

打印出“url有效”

【讨论】:

  • 首先我在考虑它,验证输入以防止不输入有效的网址,但问题是用户可以在那里输入任何内容,网址可能类似于:linkedin.com/in/ asd 或 asdqwe(因为每个社交媒体都可能有前缀地址,例如 skype: 用于 Skype,所以创建白名单非常困难,我决定转义输出。
  • 嗨@cerbin:下次在你的问题中陈述这些,它可以节省人们花时间写一个对你无用的答案,或者他们可以直接对此发表评论。就个人而言,我会选择验证器和小白名单。
  • @Kukeltje 是的,很抱歉,我编辑了我的问题以考虑我上面的评论。
猜你喜欢
  • 2012-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-05
  • 2012-06-08
相关资源
最近更新 更多