多字段的查询的sql 问题

panmingguang 发布于 2012/11/23 11:25
阅读 568
收藏 0

对于 这种 查询, 一般 我的写法都是拼接 sql 的方式, 虽然已过滤字符, 但是似乎还是没有

preparedstatment 来的安全, 可以改造成 select * from aa where aa.xx=? and aa.cc=?

但是又如何判断拼接的参数位置等等

Query query = new DBQuery("account1",true);
		query.add(" WHERE 1=1 ");
		if (map.get("name") != null) {
			query.and("name").like("%" + map.get("name") + "%");
		}
		if (map.get("realname") != null) {
			query.and("real_name").like("%" + map.get("realname") + "%");
		}
		if (map.get("role") != null && !map.get("role").equals("")) {
			query.and("role").eq(map.get("role"));
		}

加载中
0
panmingguang
panmingguang
Query query = new DBQuery("account1",true);
		query.add(" WHERE 1=1 ");
		if (map.get("name") != null) {
			query.and("name").like("?").setParams("%" + map.get("name") + "%");
		}
		if (map.get("realname") != null) {
			query.and("real_name").like("?").setParams("%" + map.get("realname") + "%");
		}
		if (map.get("role") != null && !map.get("role").equals("")) {
			query.and("role").eq("?").setParams(map.get("role"));
		}
		return getPagelist(query, toDataDrid(map));
// 已修改成此种模式, 希望有所改进
0
红薯
红薯
SQL 就是这样被注入的,真不应该写这样的代码
0
缪斯的情人
缪斯的情人
最起码要转义下,query.and("name").like("%"+ StringEscapeUtils.escapeSql(map.get("name")) +"%");防止楼上说的注入
0
丁小骆
丁小骆

拼参数可不可以呢 不直接拼执行语句

0
panmingguang
panmingguang

这个会转义的, query对象自己写的会自动转义的

0
烈冰
烈冰
我一般是这样
Query query = new DBQuery("account1",true);
List<Object> params = new ArrayList<Object>();
		query.add(" WHERE 1=1 ");
		if (map.get("name") != null) {
			query.and("name").like("%?%");
                        params.add(map.get("name"));

		}
		if (map.get("realname") != null) {
			query.and("real_name").like("%?%");
                        params.add(map.get("realname"));
		}
//然后再把params转换成数组

panmingguang
panmingguang
这个 方案我也想到, list 使用linkedlist 保证其顺序的正确性,这样是不是更好
0
panmingguang
panmingguang

引用来自“红薯”的答案

SQL 就是这样被注入的,真不应该写这样的代码
有什么好的办法,  当然使用preparedStament , 这是我需要 改用的
panmingguang
panmingguang
@红薯 恩, 还是要使用 ? 同一防止 注入
红薯
红薯
用?代替参数,然后 setXxxx
返回顶部
顶部