zoukankan      html  css  js  c++  java
  • 防SQL注入:生成参数化的通用分页查询语句

    http://www.cnblogs.com/NickYao/archive/2008/11/28/1343229.html


         前些时间看了玉开兄的“如此高效通用的分页存储过程是带有sql注入漏洞的”这篇文章,才突然想起某个项目也是使用了累似的通用分页存储过程。使用这种通用的存储过程进行分页查询,想要防SQL注入,只能对输入的参数进行过滤,例如将一个单引号“'”转换成两个单引号“''”,但这种做法是不安全的,厉害的黑客可以通过编码的方式绕过单引号的过滤,要想有效防SQL注入,只有参数化查询才是最终的解决方案。但问题就出在这种通用分页存储过程是在存储过程内部进行SQL语句拼接,根本无法修改为参数化的查询语句,因此这种通用分页存储过程是不可取的。但是如果不用通用的分页存储过程,则意味着必须为每个具体的分页查询写一个分页存储过程,这会增加不少的工作量。

          经过几天的时间考虑之后,想到了一个用代码来生成参数化的通用分页查询语句的解决方案。代码如下:

    Code
     

    使用方法:

    PagerQuery query = new PagerQuery();
    query.PageIndex = 1;
        query.PageSize = 20;
        query.PK = "ID";
        query.SelectClause = "*";
        query.FromClause = "TestTable";
        query.SortClause = "ID DESC";

        if (!string.IsNullOrEmpty(code))
        {
         query.WhereClause.Append(" and ID= @ID");
        }

    a) GenerateCountSql ()方法生成的语句为:
    Select count(0) from TestTable Where 1=1 and ID= @ID

    b) GenerateSql()方法生成的语句为:
    WITH t AS (SELECT ROW_NUMBER() OVER(ORDER BY ECID DESC) as row_number, * from TestTable where 1=1 and ID= @ID) Select * from t where row_number BETWEEN 1 and 20

    c) GenerateSqlIncludetTotalRecords()方法生成的语句为:
    WITH t AS (SELECT ROW_NUMBER() OVER(ORDER BY E.ECID DESC) as row_number,* from TestTable where 1=1 and ID= @ID) Select * from t where row_number BETWEEN 1 and 20;Select count(0) from ECBasicInfo where 1=1 and ID= @ID;

    注意:以上代码生成的SQL语句是曾对SQL SERVER 2005以上版本的,希望这些代码对大家有用

  • 相关阅读:
    innodb存储引擎监控
    Oracle 11g DATAGUARD 同步延时监控脚本
    查看表空间的增长情况
    linux上下键,rlwrap来解决
    命令模式彻底删除oracle实例
    oracle 11g 静默安装
    oracle表空间相关统计查询
    11gr2 alert日志中报TNS-12535 TNS-00505原因及解决方法
    ORACLE EXPIRED(GRACE)
    清理监听日志处理的方法
  • 原文地址:https://www.cnblogs.com/lzhdim/p/1343262.html
Copyright © 2011-2022 走看看