java - Checkmarx Postgres 查询形成错误 SQL Injection error , SQL Second order injection error Java Springboot
问题描述
我有一些执行数据库操作的 API。每当我将代码上传到 checkmarx 时,我都会收到以下错误,并将其标记为高漏洞错误有人可以帮助我吗?
错误
应用程序的 CreateDatabaseAndMapToDomain 方法在 daas-springboot-CheckMarxIntegration\src\main\java\com\it\daas\apis\service\PostgresConnectionServiceImpl.java 的第 717 行使用 executeQuery 执行 SQL 查询。应用程序通过将不受信任的字符串嵌入到查询中来构造此 SQL 查询,而无需进行适当的清理。连接的字符串被提交到数据库,在那里进行相应的解析和执行。
攻击者可能能够将任意数据写入数据库,然后应用程序在 daas-springboot-CheckMarxIntegration\src\main\java\com\it\daas\apis\service 的第 678 行的 getDomains 方法中使用 executeQuery 检索这些数据\PostgresConnectionServiceImpl.java。然后这些数据流经代码,直到直接在 SQL 查询中使用,无需净化,然后提交给数据库服务器执行
这是我的功能
@Override
public String getDomains() throws SQLException {
String domainquery = "SELECT id,domain FROM domain";
Connection con = null;
PreparedStatement st = null;
ResultSet result = null;
try
{
con = ConnectToPostgresapibuilderDatabase(apibuilderConnectionString, apibuilderUserName,apibuilderPassword);
con.setSchema(this.schema);
st = con.prepareStatement(domainquery);
result = st.executeQuery();
ArrayList<DatabaseDomainBean> list = new ArrayList<DatabaseDomainBean>();
while (result.next()) {
list.add(new DatabaseDomainBean(result.getString("domain"), result.getString("id")));
}
return new JSONObject().put("domainlist", list).toString();
}
catch(Exception e)
{
e.printStackTrace();
return null;
}
finally{
result.close();
st.close();
con.close();
}
}
@Override
public String CreateDatabaseAndMapToDomain(String database, String[] domainIds, String password)
throws SQLException {
if (!this.apibuilderPassword.equals(password)) {
return null;
}
else if(database==null || domainIds==null || password ==null)
{
return "Failure";
}
Connection con =null;
PreparedStatement st =null;
ResultSet ispresent =null;
PreparedStatement mapquerystmnt =null;
ResultSet resultMapping = null;
try
{
con = ConnectToPostgresapibuilderDatabase(apibuilderConnectionString, apibuilderUserName,apibuilderPassword);
con.setSchema(this.schema);
for (int i = 0; i < domainIds.length; i++) {
con.setSchema(this.schema);
String IfExists = MessageFormat.format(
"SELECT databasename,domainid FROM Databases WHERE databasename IN (?) AND domainid IN (?)",
Utilitymethods.ConvertToMessageFormatCompatibleForm(database),
Utilitymethods.ConvertToMessageFormatCompatibleForm(domainIds[i]));
st = con.prepareStatement(IfExists);
st.setString(1, database);
st.setInt(2, Integer.parseInt(domainIds[i]));
ispresent = st.executeQuery();
if (!ispresent.next()) {
// INSERT INTO Databases (databasename,domainid) VALUES ('Teradata','1')
String mapquery = MessageFormat.format(
"INSERT INTO Databases (databasename,domainid) VALUES (?,?) returning Id",
Utilitymethods.ConvertToMessageFormatCompatibleForm(database),
Utilitymethods.ConvertToMessageFormatCompatibleForm(domainIds[i]));
mapquerystmnt = con.prepareStatement(mapquery);
mapquerystmnt.setString(1, database);
mapquerystmnt.setInt(2, Integer.parseInt(domainIds[i]));
resultMapping = mapquerystmnt.executeQuery();
}
}
return "Success";
}
catch(Exception e)
{
e.printStackTrace();
return "Failure";
}
finally
{
ispresent.close();
st.close();
resultMapping.close();
mapquerystmnt.close();
con.close();
}
}
@Override
public String getDomains() throws SQLException {
String domainquery = "SELECT id,domain FROM domain";
Connection con = null;
PreparedStatement st = null;
ResultSet result = null;
try
{
con = ConnectToPostgresapibuilderDatabase(apibuilderConnectionString, apibuilderUserName,apibuilderPassword);
con.setSchema(this.schema);
st = con.prepareStatement(domainquery);
result = st.executeQuery();
ArrayList<DatabaseDomainBean> list = new ArrayList<DatabaseDomainBean>();
while (result.next()) {
list.add(new DatabaseDomainBean(result.getString("domain"), result.getString("id")));
}
return new JSONObject().put("domainlist", list).toString();
}
catch(Exception e)
{
e.printStackTrace();
return null;
}
finally{
result.close();
st.close();
con.close();
}
}
解决方案
直接试试st = con.prepareStatement("SELECT id,domain FROM domain")
。String domainquery = "SELECT id,domain FROM domain"
由于语句和 sql 注入的可能性,checkmarx 看起来很混乱。
推荐阅读
- python-3.x - 由于 windows10 上的 ssl 验证,为 Python3.8 安装 boto3 失败
- python - docker build 中的 node-gyp 错误,如何在 docker 化我的 testcafe 项目时在 dockerfile 中安装 Python?
- java - 刚开始学习的 Java 子字符串
- amazon-web-services - 在 AWS lambda“编辑运行时设置”中获取“拒绝访问”
- triggers - 在其他 sql server 数据库中触发 Oracle 更新字段
- javascript - 如何向通过路由器加载的 Vue2 组件的 HTML 添加引用?
- javascript - 如何在 discord.js 中获取您在消息中 ping 的人的用户名
- javascript - 如何在页面向下滚动时为圆形进度条设置动画?
- javascript - 按多个条件过滤数据
- xamarin.forms - 可以使用 C# 在 Visual Studio for Mac 上创建多平台桌面应用程序,但在 Windows 上构建它