前些時間看了玉開兄的「如此高效通用的分頁儲存過程是帶有sql注入漏洞的」這篇文章,才突然想起某個專案也是使用了累似的通用分頁儲存過程。使用這種通用的儲存過程進行分頁查詢,想要防sql注入,只能對輸入的引數進行過濾,例如將乙個單引號「'」轉換成兩個單引號「''」,但這種做法是不安全的,厲害的黑客可以通過編碼的方式繞過單引號的過濾,要想有效防sql注入,只有引數化查詢才是最終的解決方案。但問題就出在這種通用分頁儲存過程是在儲存過程內部進行sql語句拼接,根本無法修改為引數化的查詢語句,因此這種通用分頁儲存過程是不可取的。但是如果不用通用的分頁儲存過程,則意味著必須為每個具體的分頁查詢寫乙個分頁儲存過程,這會增加不少的工作量。
經過幾天的時間考慮之後,想到了乙個用**來生成引數化的通用分頁查詢語句的解決方案。**如下:
public
class
pagerquery
/**/
//////
主鍵///
public
string
pkset
}public
string
selectclause
set}
public
string
fromclause
set}
public
stringbuilder whereclause
set}
public
string
groupclause
set}
public
string
sortclause
set}
/**/
//////
當前頁數
///public
intpageindex
set}
/**/
//////
分頁大小
///public
intpagesize
set}
/**/
//////
生成快取key
//////
public
override
string
getcachekey()
-fc:-wc:-gc:-sc:";
return
string
.format(keyformat, selectclause, fromclause, whereclause, groupclause, sortclause);
}/**/
//////
生成查詢記錄總數的sql語句
//////
public
string
generatecountsql()
", fromclause);
if(whereclause.length
>0"
where 1=1
", whereclause);if(
!string
"group by
", groupclause);
return
string
.format(
"select count(0)
", sb);
}/**/
//////
生成分頁查詢語句,包含記錄總數
//////
public
string
generatesqlincludetotalrecords()
", fromclause);
if(whereclause.length
>0"
where 1=1
", whereclause);if(
!string
"group by
", groupclause);
string
countsql
=string
.format(
"select count(0) ;
", sb);
string
tempsql
=string
.format(
"with t as (select row_number() over(order by ) as row_number,) select * from t where row_number between and ;",
sortclause, selectclause, sb, start_row_num, (start_row_num
+pagesize -1
));return
tempsql
+countsql;
}/**/
//////
生成分頁查詢語句
//////
public
override
string
generatesql()
", fromclause);
if(whereclause.length
>0"
where 1=1
", whereclause);if(
!string
"group by
", groupclause);
return
string
.format(
"with t as (select row_number() over(order by ) as row_number,) select * from t where row_number between and ",
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";
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;
ASP 防 SQL 注入攻擊通用程式
sql 注入被那些菜鳥級別的所謂黑客高手玩出了滋味,發現現在大部分黑客入侵都是基於sql注入實現的,哎,誰讓這個入門容易呢,好了,不說廢話了,現在我開始說如果編寫通用的sql防注入程式一般的http請求不外乎get 和 post,所以只要我們在檔案中過濾所有 post 或者 get 請求中的引數資訊...
編寫通用的ASP防SQL注入程式
sql注入被那些菜鳥級別的所謂黑客高手玩出了滋味,發現現在大部分黑客入侵都是基於sql注入實現的,哎,誰讓這個入門容易呢,好了,不說廢話了,現在我開始說如果編寫通用的sql防注入程式一般的http請求不外乎get 和 post,所以只要我們在檔案中過濾所有post或者get請求中的引數資訊中非法字元...
編寫通用的ASP防SQL注入程式
sql注入被那些菜鳥級別的所謂黑客高手玩出了滋味,發現現在大部分黑客入侵都是基於sql注入實現的,哎,誰讓這個入門容易呢,好了,不說廢話了,現在我開始說如果編寫通用的sql防注入程式一般的http請求不外乎get 和 post,所以只要我們在檔案中過濾所有post或者get請求中的引數資訊中非法字元...