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

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

  • 相关阅读:
    windows补丁更新列表
    centos7网卡配置vlan
    exp备份工具使用说明
    windows系统SSL/TLS漏洞修复
    CDH平台:ZooKeeper 未授权访问【原理扫描】漏洞修复
    MySQL升级至5.7.35问题处理过程
    10fb does not support flow control autoneg问题处理
    vCenter异常日志:pg_tblspc找不到数据文件
    tcpdump命令
    排序算法总结
  • 原文地址:https://www.cnblogs.com/mantishell/p/11343865.html
Copyright © 2020-2023  润新知