我在执行更新后的语句上看到跨脚本注入错误。如何清理输出以消除交叉脚本错误。
我有一个简单的代码段,它使用PreparedStatement运行选择并返回在前端GUI屏幕上检索到的值。
XSS缺陷消息:“受污染的数据源自对java.sql.ResultSetMetaData.getColumnName的早期调用。”
Java代码:
Connection conn = null;
Statement stmt = null;
PreparedStatement pstmt = null;
try {
List alist= new ArrayList();
pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
int count = rs.getMetaData().getColumnCount();
for (int i = 1; i <= count; i++) {
alist.add(rs.getMetaData().getColumnName(i)) //Flaw seems to point to this.
}
}catch(Exception e){
//close connections
}
return alist;
完整的Veracode缺陷:
攻击向量:javax.servlet.jsp.JspWriter.print
受影响的模块数:1
描述:对javax.servlet.jsp.JspWriter.print()的此调用包含跨站点脚本(XSS)缺陷。该应用程序使用不受信任的输入填充HTTP响应,从而使攻击者可以嵌入恶意内容(例如Javascript代码),这些恶意内容将在受害者的浏览器的上下文中执行。 XSS漏洞通常被利用来窃取或操纵Cookie,修改内容表示并破坏机密信息,并定期发现新的攻击媒介。 print()的第一个参数包含来自变量getHtml()的污染数据。污染数据源自对java.sql.ResultSetMetaData.getColumnName的早期调用。被污染的数据被定向到javax.servlet.jsp.JspWriter返回的输出流中。
最佳答案
我不知道为什么ResultSetMetaData
对象正在调用servlet方法,但是如果我正确理解它,它将用于在servlet中打印内容。但是,由于ResultSetMetaData
中的所有数据均来自数据库的元数据(不可能包含javascript代码或其他XSS风险),因此在这种情况下应将其保存。ResultSetMetaData
是一个常用的类(并且使用了很长时间),所以我真的不认为这在当前的Java版本中是个问题。
因此,我不知道如何解决此问题,但是我很确定这不是问题,因为不可能在数据库的元数据中添加任何恶意代码(javascript或sql注入代码)。