如何使用OWASP在Java中检测XSS的安全性
我现在正在处理这件事,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的算法),也许我不需要与原始字符串进行比较
如果你能帮助我,我将非常感激
谢谢
# 1 楼答案
无法检测字符串是否包含XSS。XSS是一个输出问题,而不是输入问题。数据在一种环境中是良性的,在另一种环境中可能会导致恶意行为
使用白名单验证数据,以确保数据在域中有效(数字是数字,名称不包含unwantef字符等)。这将阻止一些但绝对不是所有的攻击
按照OWASP XSS预防备忘单中的说明,对用户提供的输出进行上下文编码
不要混合使用客户端和服务器端模板
在javascript中使用未初始化的数据时要小心(请参阅基于DOM的XSS)