没有java源代码如何修改bug

有时候遇到比较老的产品,公司的产品组也不提供维护了,更可恨的是,源代码也不给。在这种情况,遇到有bug,怎么办呢?

我们项目组一直在维护着一个2013年基于公司老产品开发的项目,既然是产品,公司产品弄死不肯定提供老产品的代码,原因大概是因为代码管理混乱,已经找不到我们项目的代码了。

这个bug出现在数据授权的时候,按常规组织授权后,下级用户居然能看到上级用户数据,我们的数据授权原理是:获取授权用户所在层级,并获取当前的授权组织表,将组织表数据和当前用户进行匹配,并记录在授权表,然后,用户在查询数据的时候就读取授权表拼接in语句去数据库查询。当出现这个问题的时候,显然是不允许的,这时候,我们的检查步骤是:
1、检查用户组织表
2、检查授权表
3、检查最终执行sql语句
通过以上步骤,最终发现是在做sql拼接成in的条件的时候出现的问题,这时候,就只有进入到代码里面一探究竟,由于没有源代码,就只有借用各种反编译工具:
1、Java Decompiler
2、Jadclipse
3、jad
4、jd-gui
…..
等等,还有很多其他的,这里,我选用的是jd-gui,如果是用的idea作为IDE的话,可以直接查看。
借助反编译工具反编译出来的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
static boolean userIsDept(JdbcTemplate sysJdbcTemplate, final String dept, String userId) {
String sql = SQLProvider.getSQL("query.all.sub.dept");
List<String> depts = (List)sysJdbcTemplate.query(sql, new PreparedStatementSetter() {
public void setValues(PreparedStatement ps) throws SQLException {
ps.setString(1, dept);
ps.setString(2, dept);
}
}, new ResultSetExtractor<List<String>>() {
public List<String> extractData(ResultSet rs) throws SQLException, DataAccessException {
ArrayList trs = new ArrayList();

while(rs.next()) {
trs.add(rs.getString("DEPT_ID"));
}

return trs;
}
});
String userDeptSql = SQLProvider.getSQL("query.user.dept");
String userDeptId = (String)sysJdbcTemplate.queryForObject(userDeptSql, String.class, new Object[]{userId});
return depts.contains(userDeptId);
}

经过分析,发现该处的组织id过多加载,因为在授权表中已经将当前用户所属组织的授权内容全量写进去,这儿过多加载,其实把父组织的授权内容也一并拼接到了in条件内,所以出现这种情况。
最后,我通过idea新建一个java项目,把项目的依赖包添加进去,新建了一个同包名、同类名的类,将代码copy进新类,稍作修改,就可导出一个jar包。然后将class文件复制到原来的jar包中覆盖即可,在这里,一定要注意JDK版本,否者会报错。

没有java源代码如何修改bug

https://blogs.52fx.biz/posts/1851977506.html

作者

eyiadmin

发布于

2019-11-05

更新于

2024-05-31

许可协议

评论