mssql server 排序 以及like语句

当我们按照某个字段排序时,通常使用order by语句,如果该字段存在null值,则会把null值的这条放到最上面,

那我们是否有办法解决呢?

答案是肯定的:

ORDER BY CASE WHEN OrderNum IS NULL THEN 1 ELSE 0 END

这样的话,null值的这条就排队到了最后。

 

使用dapper查询数据时,有时候会用到模糊查询,像下面这样:

SELECT * FROM T_Test  WHERE Sex='男' AND (CardNo like 'xxx' OR Remark like 'xxx')

如果dapper里这么写:

public List<TestModel> Test(string sex, string keyWords){
  var sb = new StringBuilder("SELECT * FROM T_Test WHERE 1=1 ");
  sb.Append(" AND Sex=@Sex ");
  sb.Append(" AND(Content LIKE '%"+ keyWords +"%' OR Remark LIKE '%"+ keyWords +"%')");
  return DapperHelper.Query<TestModel>(sb.ToString(), new { Sex = sex}).ToList();
}

如果keyWords的参数写:%' or 1=1) --

生成的sql语句就是:

SELECT * FROM T_Test WHERE 1=1 
AND Sex='男' 
AND (Content LIKE '%%' or 1=1) --%' OR Remakr LIKE '%%')

那么恭喜你,他人将获取你所有的信息。

那我们该怎么处理呢?

那就是修改dapper方法

public List<TestModel> Test(string sex, string keyWords){
  var sb = new StringBuilder("SELECT * FROM T_Test ");
  sb.Append(" AND Sex=@Sex ");
  sb.Append(" AND(Content LIKE @KeyWords OR Remark LIKE @KeyWords )");
  return DapperHelper.Query<TestModel>(sb.ToString(), new { Sex = sex, KeyWords = '%' + keyWords + '%'}).ToList();
}

  生成的sql语句就是

exec sp_executesql N'SELECT * FROM T_Test WHERE 1=1 Sex=@Sex AND (Content LIKE @KeyWords OR Remark LIKE @KeyWords)',N'@KeyWords 
nvarchar(4000)',@KeyWords=N'%%'' or 1=1) --%'

  即使是这样,数据也不会泄露了。

posted @ 2019-08-17 10:25  mantishell  阅读(496)  评论(0编辑  收藏  举报