在我们的网站上,我们有一个搜索字段,一名安全研究人员告诉我们,这对 XSS 攻击是开放的,因为访问者可能会尝试执行完整的 JavaScript。他们向我们发送了一个简单的示例 URL,它会导致 JavaScript 警告框出现在搜索页面上 - URL 参数是 search?submitted=true&action=search&siteId=2.9945&freeText=1";confirm(/XSSPOSED/);a="&sort= publishedDate_descending&slotSearch=true
安全研究人员建议,所有数据都应通过类似于 PHP 的 htmlentities 的函数传递,同时设置 ent 引号和 UTF8 标志,以防止使用混淆进行利用。所以我搜索了看是否有与 htmlentities 等效的 Java,并且我从 Apache Commons Lang 的 StringEscapeUtils 类中找到了 escapeHtml() 和 escapeJavaScript() 方法:https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/StringEscapeUtils.html .
escapeHtml() 方法转义 HTML 字符,例如 < 和 >,但我不太确定 JavaScript。 escapeJavaScript 方法实际上似乎使用 JavaScript 字符串规则转义字符串中的字符,而不是剥离 JavaScript 本身。
那么,有谁知道可以 100% 停止在页面上呈现 JavaScript 的解决方案吗?
如果您正在使用 java 并想在后端验证它,您可以使用此代码,在此示例中,它检查用户是否未发送和可疑值而不是他的名字。
if (CommonUtility.checkValidate(firstName) || CommonUtility.checkValidate(lastName) ||
CommonUtility.checkValidate(newUserName)) {
response
.sendRedirect(PHConstants.CONTEXT_PATH
+ "/login/registrationError.jsp");
return;
}
public static boolean checkValidate(String name) {
if (null != name) {
String patternString = ".*javascript:.*|.*//.*|.*<.*|.*>.*";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(name);
return matcher.matches();
}
return false;
}
我们可以通过添加识别规则来在服务器端识别被篡改的 URL。这是通过在 RuleConf 文件夹中添加 conf 文件来完成的
供您引用的代码示例:
SecRule REQUEST_LINE "@contains myapp/access/PageServlet?url=/notices/dummyNotifPage.jsp" "chain,phase:2,t:none,status:403,msg:'Generic javascript Injection prevention',severity:2"
SecRule ARGS|QUERY_STRING "(<[^>]*>)" "status:403"
SecRule REQUEST_LINE "@contains myapp/access/PageServlet?url=/notices/dummyNotifPage.jsp" "chain,phase:2,t:none,status:403,msg:'Generic javascript Injection prevention',severity:2"
SecRule ARGS|QUERY_STRING "(?i)javascript:" "status:403"
SecRule REQUEST_LINE "@contains myapp/access/PageServlet?url=" "chain,phase:2,t:none,status:403,msg:'Check for double slashes in url parameter',severity:2"
SecRule ARGS|QUERY_STRING "/{2}" "status:403"