zoukankan      html  css  js  c++  java
  • 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) --%'
    

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

  • 相关阅读:
    [python] 类组合与聚合关系
    [python] 伪私有属性,防止变量名冲突
    [vim] 配置文件之常用命令模式
    [VIM] 编辑器---多行注释和取消注释及多行复制和黏贴
    [Visual Studio Code] 执行python
    [C] 编译器codeblocks安装注意
    字符串全排列
    集合全量子集提取
    random函数详解
    Solr常用命令总结
  • 原文地址:https://www.cnblogs.com/mantishell/p/11343865.html
Copyright © 2011-2022 走看看