我现在正在处理这个问题,XSS。
我需要检测一个字符串是否包含XSS。为了解决这个问题,我使用了 link 。这是我正在使用的代码:
public static boolean containsXSS(String value) {
if (StringUtils.isEmpty(value)) {
return false;
}
String stripXss = stripXSS(value);
return !value.equals(stripXss);
}
public static String stripXSS(String value) {
if (StringUtils.isBlank(value))
return value;
// Use the ESAPI library to avoid encoded attacks.
Encoder encoder = ESAPI.encoder();
value = encoder.canonicalize(value);
// Avoid null characters
value = value.replaceAll("\0", "");
// Clean out HTML
Document.OutputSettings outputSettings = new Document.OutputSettings();
outputSettings.escapeMode(Entities.EscapeMode.xhtml);
outputSettings.prettyPrint(false);
value = Jsoup.clean(value, "", Whitelist.none(), outputSettings);
return value;
}
使用上面的代码,我确实成功捕获了类似以下内容:<script>alert('xss')</script>
我的问题是,我将以下字符串识别为包含 XSS,尽管事实并非如此: {“项目”:5}
这是因为 jsoup.clean 将其变成 {"item" :5}
我尝试过解决,但没有成功。 这让我想知道我的算法是否完全错误(如果是的话我在哪里可以找到检测XSS的算法),也许我不需要与原始字符串进行比较?
如果您能帮助我,我将非常感激。
谢谢
最佳答案
您无法检测字符串是否包含 XSS。 XSS 是输出问题,而不是输入问题。数据在一种情况下是良性的,在另一种情况下可能会导致恶意行为。
使用白名单验证数据,以确保数据在您的域中有效(数字就是数字,名称不包含不需要的字符等)。这将阻止一些但绝对不是全部攻击。
按照 OWASP XSS 预防备忘单中的说明,对用户提供的输出进行上下文编码
不要混合客户端和服务器端模板
在 JavaScript 中使用未经净化的数据时要小心(请参阅基于 DOM 的 XSS)
关于java - 如何使用 OWASP 检测 Java 中的 XSS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45824398/