欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

防SQL注入 生成參數(shù)化的通用分頁查詢語句

 更新時間:2010年07月11日 13:00:22   作者:  
前些時間看了玉開兄的“如此高效通用的分頁存儲過程是帶有sql注入漏洞的”這篇文章,才突然想起某個項目也是使用了累似的通用分頁存儲過程。
使用這種通用的存儲過程進行分頁查詢,想要防SQL注入,只能對輸入的參數(shù)進行過濾,例如將一個單引號“'”轉(zhuǎn)換成兩個單引號“''”,但這種做法是不安全的,厲害的黑客可以通過編碼的方式繞過單引號的過濾,要想有效防SQL注入,只有參數(shù)化查詢才是最終的解決方案。但問題就出在這種通用分頁存儲過程是在存儲過程內(nèi)部進行SQL語句拼接,根本無法修改為參數(shù)化的查詢語句,因此這種通用分頁存儲過程是不可取的。但是如果不用通用的分頁存儲過程,則意味著必須為每個具體的分頁查詢寫一個分頁存儲過程,這會增加不少的工作量。
經(jīng)過幾天的時間考慮之后,想到了一個用代碼來生成參數(shù)化的通用分頁查詢語句的解決方案。代碼如下:
復(fù)制代碼 代碼如下:

public class PagerQuery
{
private int _pageIndex;
private int _pageSize = 20;
private string _pk;
private string _fromClause;
private string _groupClause;
private string _selectClause;
private string _sortClause;
private StringBuilder _whereClause;
public DateTime DateFilter = DateTime.MinValue;
protected QueryBase()
{
_whereClause = new StringBuilder();
}
/**//// <summary>
/// 主鍵
/// </summary>
public string PK
{
get { return _pk; }
set { _pk = value; }
}
public string SelectClause
{
get { return _selectClause; }
set { _selectClause = value; }
}
public string FromClause
{
get { return _fromClause; }
set { _fromClause = value; }
}
public StringBuilder WhereClause
{
get { return _whereClause; }
set { _whereClause = value; }
}
public string GroupClause
{
get { return _groupClause; }
set { _groupClause = value; }
}
public string SortClause
{
get { return _sortClause; }
set { _sortClause = value; }
}
/**//// <summary>
/// 當(dāng)前頁數(shù)
/// </summary>
public int PageIndex
{
get { return _pageIndex; }
set { _pageIndex = value; }
}
/**//// <summary>
/// 分頁大小
/// </summary>
public int PageSize
{
get { return _pageSize; }
set { _pageSize = value; }
}
/**//// <summary>
/// 生成緩存Key
/// </summary>
/// <returns></returns>
public override string GetCacheKey()
{
const string keyFormat = "Pager-SC:{0}-FC:{1}-WC:{2}-GC:{3}-SC:{4}";
return string.Format(keyFormat, SelectClause, FromClause, WhereClause, GroupClause, SortClause);
}
/**//// <summary>
/// 生成查詢記錄總數(shù)的SQL語句
/// </summary>
/// <returns></returns>
public string GenerateCountSql()
{
StringBuilder sb = new StringBuilder();
sb.AppendFormat(" from {0}", FromClause);
if (WhereClause.Length > 0)
sb.AppendFormat(" where 1=1 {0}", WhereClause);
if (!string.IsNullOrEmpty(GroupClause))
sb.AppendFormat(" group by {0}", GroupClause);
return string.Format("Select count(0) {0}", sb);
}
/**//// <summary>
/// 生成分頁查詢語句,包含記錄總數(shù)
/// </summary>
/// <returns></returns>
public string GenerateSqlIncludeTotalRecords()
{
StringBuilder sb = new StringBuilder();
if (string.IsNullOrEmpty(SelectClause))
SelectClause = "*";
if (string.IsNullOrEmpty(SortClause))
SortClause = PK;
int start_row_num = (PageIndex - 1)*PageSize + 1;
sb.AppendFormat(" from {0}", FromClause);
if (WhereClause.Length > 0)
sb.AppendFormat(" where 1=1 {0}", WhereClause);
if (!string.IsNullOrEmpty(GroupClause))
sb.AppendFormat(" group by {0}", GroupClause);
string countSql = string.Format("Select count(0) {0};", sb);
string tempSql =
string.Format(
"WITH t AS (SELECT ROW_NUMBER() OVER(ORDER BY {0}) as row_number,{1}{2}) Select * from t where row_number BETWEEN {3} and {4};",
SortClause, SelectClause, sb, start_row_num, (start_row_num + PageSize - 1));
return tempSql + countSql;
}
/**//// <summary>
/// 生成分頁查詢語句
/// </summary>
/// <returns></returns>
public override string GenerateSql()
{
StringBuilder sb = new StringBuilder();
if (string.IsNullOrEmpty(SelectClause))
SelectClause = "*";
if (string.IsNullOrEmpty(SortClause))
SortClause = PK;
int start_row_num = (PageIndex - 1)*PageSize + 1;
sb.AppendFormat(" from {0}", FromClause);
if (WhereClause.Length > 0)
sb.AppendFormat(" where 1=1 {0}", WhereClause);
if (!string.IsNullOrEmpty(GroupClause))
sb.AppendFormat(" group by {0}", GroupClause);
return
string.Format(
"WITH t AS (SELECT ROW_NUMBER() OVER(ORDER BY {0}) as row_number,{1}{2}) Select * from t where row_number BETWEEN {3} and {4}",
SortClause, SelectClause, sb, start_row_num, (start_row_num + PageSize - 1));
}
}

使用方法:

復(fù)制代碼 代碼如下:

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以上版本的,希望這些代碼對大家有用

相關(guān)文章

  • 注冊頁實現(xiàn)激活郵箱驗證(asp.net c#)

    注冊頁實現(xiàn)激活郵箱驗證(asp.net c#)

    在填寫注冊提交后,大一點的網(wǎng)站會有郵箱激活驗證這一步,本文也是實現(xiàn)了一下,感興趣的朋友可以參考下哈,希望可以幫助到你
    2013-04-04
  • asp.net URL 顯示亂碼 解決方法

    asp.net URL 顯示亂碼 解決方法

    剛剛接觸網(wǎng)頁開發(fā),不過遇到URR參數(shù)傳遞錯誤的問題,兩個頁面進行信息交互時可以用url進行傳遞,但是如果傳遞信息的編碼格式不是UTF-8(或者不是設(shè)置的默認(rèn)格式)URL傳遞時會出現(xiàn)亂碼。
    2009-06-06
  • 在ASP.NET Core中用HttpClient發(fā)送POST, PUT和DELETE請求

    在ASP.NET Core中用HttpClient發(fā)送POST, PUT和DELETE請求

    這篇文章主要介紹了在ASP.NET Core中用HttpClient發(fā)送POST, PUT和DELETE請求的方法,幫助大家更好的理解和學(xué)習(xí)使用ASP.NET Core,感興趣的朋友可以了解下
    2021-03-03
  • asp.net動態(tài)生成HTML表單的方法

    asp.net動態(tài)生成HTML表單的方法

    這篇文章主要介紹了asp.net動態(tài)生成HTML表單的方法,結(jié)合實例形式分析了asp.net動態(tài)生成HTML表單的相關(guān)控件使用技巧與注意事項,需要的朋友可以參考下
    2017-03-03
  • 在ASP.Net Core中使用Lamar的全過程

    在ASP.Net Core中使用Lamar的全過程

    這篇文章主要給大家介紹了關(guān)于在ASP.Net Core中使用Lamar的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • .NET中彈性和瞬時處理庫Polly的使用詳解

    .NET中彈性和瞬時處理庫Polly的使用詳解

    Polly 是一個 .NET 彈性和瞬態(tài)故障處理庫,允許開發(fā)人員以 Fluent 和線程安全的方式來實現(xiàn)重試、斷路、超時、隔離和回退策略,下面就跟隨小編一起來看看它的具體使用吧
    2024-01-01
  • 運行page頁面時的事件執(zhí)行順序及頁面的回發(fā)與否深度了解

    運行page頁面時的事件執(zhí)行順序及頁面的回發(fā)與否深度了解

    page頁面時的事件執(zhí)行順序的了解對于一些.net開發(fā)者起到者尤關(guān)重要的作用;頁面的回發(fā)與否會涉及到某些事件執(zhí)行與不執(zhí)行,在本文中會詳細(xì)介紹,感興趣的朋友可以了解下
    2013-01-01
  • ASP.NET框架中的數(shù)據(jù)綁定概要與數(shù)據(jù)綁定表達式的使用

    ASP.NET框架中的數(shù)據(jù)綁定概要與數(shù)據(jù)綁定表達式的使用

    數(shù)據(jù)綁定是ASP.NET中操作數(shù)據(jù)的基礎(chǔ)方式,這里我們暫時拋開.NET提供的控件,來從基礎(chǔ)上講解ASP.NET框架中的數(shù)據(jù)綁定概要與數(shù)據(jù)綁定表達式的使用:
    2016-06-06
  • ASP.NET MVC5驗證系列之Remote Validation

    ASP.NET MVC5驗證系列之Remote Validation

    這篇文章主要為大家詳細(xì)介紹了ASP.NET MVC5驗證系列之Remote Validation,感興趣的小伙伴們可以參考一下
    2016-07-07
  • LINQ教程之LINQ簡介

    LINQ教程之LINQ簡介

    這篇文章介紹了語言集成查詢LINQ,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03

最新評論