前言
關(guān)于sql注入的解釋這里不再贅述。
在MyBatis中防止的sql注入主要分為兩種:
????????第一種就是MyBatis提供了兩種支持動(dòng)態(tài) sql 的語法 #{}?和 ${},其中${} 是簡(jiǎn)單的字符串替換,而 #{}?在預(yù)處理時(shí),會(huì)把參數(shù)部分用一個(gè)占位符 ? 代替,可以有效的防止sql的注入,面試的時(shí)候經(jīng)常會(huì)問到,這里也不再詳細(xì)贅述;
? ? ? ? 第二種是排序防止sql注入,實(shí)現(xiàn)方案如下
SQL注入過濾器
以下是sql注入過濾器,當(dāng)判斷出是非法字符時(shí)則拋出到自定義的異常類BusinessException中
BusinessException異常類的創(chuàng)建與使用
public class SQLFilter {
/**
* SQL注入過濾
*
* @param sql 待驗(yàn)證字符串
*/
public static String filterInject(String sql) {
if (StringUtils.isBlank(sql)) {
return null;
}
//去掉'|"|;|\字符
sql = sql.replace("'", "")
.replace("\"", "")
.replace(";", "")
.replace("\\", "")
.toLowerCase();
//非法字符
final String[] keywords = {"master", "truncate", "insert", "select", "delete", "update", "declare", "alert", "drop"};
//判斷是否包含非法字符
for (String keyword : keywords) {
if (sql.indexOf(keyword) > 0) {
throw new BusinessException("SQL包含非法字符");
}
}
return sql;
}
}
分頁工具類
這里我們使用的是PageHelper組件實(shí)現(xiàn)分頁,需要在pom中引用jar包【com.github.pagehelper】
public class PageUtils {
public static void initPaging(Map<String, Object> params) {
//分頁參數(shù)
Object pageNumObj = params.get("page");
Object pageSizeObj = params.get("limit");
Object sortNameObj = params.get("sortName");
Object sortOrderObj = params.get("sortOrder");
//默認(rèn)分頁數(shù)為1
int pageNum = pageNumObj != null ? Integer.parseInt(pageNumObj.toString()) : 1;
//默認(rèn)每頁大小為10
int pageSize = pageSizeObj != null ? Integer.parseInt(pageSizeObj.toString()) : 10;
String orderBy = "";
if (sortNameObj != null && sortOrderObj != null) {
orderBy = sortNameObj.toString() + " " + sortOrderObj.toString();
}
PageHelper.startPage(pageNum, pageSize, SQLFilter.filterInject(orderBy));
}
public static Map<String, Object> filterParams(Map<String, Object> params) {
Object sortNameObj = params.get("sortName");
Object sortOrderObj = params.get("sortOrder");
String orderBy = "";
if (sortNameObj != null && sortOrderObj != null) {
orderBy = sortNameObj.toString() + " " + sortOrderObj.toString();
}
params.put("orderBy",SQLFilter.filterInject(orderBy));
return params;
}
}
分頁公共參數(shù)實(shí)體
@Data
public abstract class Query {
// 初始分頁頁碼
private Integer page = 1;
// 初始分頁條數(shù)
private Integer limit = 10;
// 初始排序字段; sortName = "id"
private String sortName;
// 初始排序方式; sortOrder = "asc"
private String sortOrder;
}
實(shí)現(xiàn)分頁
實(shí)現(xiàn)方法中,【SysUserQuery?】中是我的業(yè)務(wù)邏輯中的查詢參數(shù),但是繼承了分頁公共參數(shù)實(shí)體,這里就不列出來了;
分頁工具類中的方法由Map接收,由于我這里傳的是實(shí)體,所以多出來一步實(shí)體轉(zhuǎn)成Map操作;文章來源:http://www.zghlxwxcb.cn/news/detail-642385.html
@Override
public Result queryPage(SysUserQuery sysUserQuery) {
Map<String, Object> params = JSON.parseObject(JSON.toJSONString(sysUserQuery), Map.class);
// 分頁
PageUtils.initPaging(params);
// 查詢數(shù)據(jù)
List<SysUserVo> list = sysUserMapper.selectListByQuery(sysUserQuery);
PageInfo page = new PageInfo(list);
return new Result(page);
}
至此結(jié)束。文章來源地址http://www.zghlxwxcb.cn/news/detail-642385.html
到了這里,關(guān)于【MyBatis】防止sql注入的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!