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) --%'
    

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

  • 相关阅读:
    query.setXXX预编译赋值 (坑爹的)
    JAVA 预编译执行SQL 之setparameterList用法
    ActiveMQ
    JavaScript DOM日记
    Mysql 详解(三)
    Mysq连接使用
    Mysql详解(二)
    Mysql详解(一)
    Spring MVC 批量导入Excel文件
    《走遍中国》珍藏版(三)
  • 原文地址:https://www.cnblogs.com/mantishell/p/11343865.html
Copyright © 2011-2022 走看看