国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - ASP.NET教程 - 防SQL注入 生成參數化的通用分頁查詢語句

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

2019-09-07 15:25asp.net之家 ASP.NET教程

前些時間看了玉開兄的“如此高效通用的分頁存儲過程是帶有sql注入漏洞的”這篇文章,才突然想起某個項目也是使用了累似的通用分頁存儲過程。

使用這種通用的存儲過程進行分頁查詢,想要防SQL注入,只能對輸入的參數進行過濾,例如將一個單引號“'”轉換成兩個單引號“''”,但這種做法是不安全的,厲害的黑客可以通過編碼的方式繞過單引號的過濾,要想有效防SQL注入,只有參數化查詢才是最終的解決方案。但問題就出在這種通用分頁存儲過程是在存儲過程內部進行SQL語句拼接,根本無法修改為參數化的查詢語句,因此這種通用分頁存儲過程是不可取的。但是如果不用通用的分頁存儲過程,則意味著必須為每個具體的分頁查詢寫一個分頁存儲過程,這會增加不少的工作量。 
經過幾天的時間考慮之后,想到了一個用代碼來生成參數化的通用分頁查詢語句的解決方案。代碼如下: 

復制代碼代碼如下:


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> 
/// 當前頁數 
/// </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> 
/// 生成查詢記錄總數的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> 
/// 生成分頁查詢語句,包含記錄總數 
/// </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)); 


使用方法: 

復制代碼代碼如下:


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

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 亚洲精品午夜 | 中文字幕在线免费视频 | 日本久久精品 | 伊人精品成人久久综合软件 | 免费激情 | 99精品国产热久久91蜜凸 | www.欧美视频 | 亚洲精品v | 久久精品国产一区 | 91精品久久 | 国产精品不卡一区二区三区 | 成人在线免费观看 | 日韩视频一区二区 | 一级a毛片| 欧美中文字幕在线 | 中文字幕一区二区三区在线观看 | 日韩一区二区三区在线看 | 亚洲欧美视屏 | 国产精品久久精品 | 北条麻妃99精品青青久久 | 日韩一区二区三区精品 | 山岸逢花在线观看无删减 | 久久这里有精品视频 | 精品一二区| 我要看一级黄色 | 亚洲性视频 | 91视频一88av | 少妇一级淫免费放 | 中文字幕在线看 | av黄色在线看 | 国产精品久久久久久久久久大牛 | 国产偷亚洲偷欧美偷精品 | 欧美二区三区 | 午夜影院免费观看视频 | 欧美日韩在线观看视频 | 精品久久久久久久久久 | 曰韩一级鸥美一级 | 色视频在线看 | 一级片导航 | 成人av影视 | 国产高清亚洲 |