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

2021-08-29 18:47:31 字數 3702 閱讀 2082

前些時間看了玉開兄的「如此高效通用的分頁儲存過程是帶有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請求中的引數資訊中非法字元...