7
回答
多字段的查询的sql 问题

对于 这种 查询, 一般 我的写法都是拼接 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"));
		}

举报
panmingguang
发帖于6年前 7回/567阅
共有7个答案 最后回答: 6年前
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));
// 已修改成此种模式, 希望有所改进
最起码要转义下,query.and("name").like("%"+ StringEscapeUtils.escapeSql(map.get("name")) +"%");防止楼上说的注入
我一般是这样
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转换成数组

--- 共有 1 条评论 ---
panmingguang这个 方案我也想到, list 使用linkedlist 保证其顺序的正确性,这样是不是更好 6年前 回复

引用来自“红薯”的答案

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