儲存過程分頁的注入問題以及解決

2022-02-06 20:54:11 字數 2383 閱讀 2242

最近發現,很久以前的乙個

專案中的查詢竟然會注入sql,原來是使用的通用的儲存過程分頁,裡面有個引數是@wherestr,這個引數是在拼接sql,所以會造成注入,這個真是蛋疼的問題。

很多人沒發現這個問題,所以在這裡說一說,也希望找到完美的解決方法,首先過濾是不行的,過濾說白了是在改變使用者的意志。所以我就寫了乙個通用分頁的方法,動態拼接sql,這樣引數化就可以完全分開了

首先先說一下究竟是怎麼回事

以下是先用 儲存過程分頁

分頁儲存過程是從網上隨便找的其中有個引數是@wherestr

(1)按鈕事件

public

void trandatabind(int

pageindex)

this.datagridview1.datasource = tc.pagedataexecute(pageindex, sb.tostring(), out

count);

this.pagecontroler1.pageindex = 1

;

this.pagecontroler1.recordcount =count;

}

(2)呼叫的tc.pagdateexecute()

public datatable pagedataexecute(int pageindex,string wherestr,out

intcount)

(3)

sqlhelper.executedatapage裡的wherestr引數 new sqlparameter("@filter",where);........
我寫這些是說明我這裡的確用了引數化,但是是在引數化裡實行了sql拼接,這是錯誤的關鍵所在。然後查詢乙個單引號

最後沒辦法,只能放棄儲存過程的分頁,寫個通用的分頁方法,雖然會損失效率但是相比sql注入和過濾是值得的。

public

static datatable executepage(string tablename,string pk,string sort,int pagenumber,int pagesize,string fields,string filter,out

intrecordcount,sqlparameter pars)

"select count(

"+pk+"

) as recordcount from

"+tablename+"

"+ wheresb+";"

);

if(string

.isnullorempty(sort))

if (pagenumber < 1

)

string startid = ((pagenumber - 1) * pagesize + 1

).tostring();

string endid = (pagenumber *pagesize).tostring();

"select * from (select

" + fields + "

,row_number() over( order by

" + sort + "

) as rownum from

" + tablename + "

" + wheresb + "

) as t where rownum between

"+startid+"

and

"+endid);

dataset ds = new

dataset();

if (pars != null

)

else

recordcount =(int)ds.tables[0].rows[0]["

recordcount"];

ds.tables[

1].columns.remove("

rownum");

return ds.tables[1

]; }

最後希望大家能說說自己的看法,不過千萬別說什麼過濾之類的------

-------------------------------------歡迎指導討論-------------------------------

儲存過程的注入及解決

由於儲存過程中存在用於字串連線的 號連線sql語句,這就造成sql注入的可能性.下面乙個例子 pr usermanage users batchmove create procedure dbo pr usermanage users batchmove usertype int 1,groupid...

Sql分頁儲存過程以及實現

建立乙個類檔案,內容如下 using system using datahelper using system.data using system.data.sqlclient using system.web using system.configuration namespace classba...

Oracle分頁儲存過程以及C 呼叫

1 分頁儲存過程 首先需要新建乙個包,至於為什麼要這麼做,我沒有深究,如有童鞋知道的話,只會一聲哈 建立包 create or replace package pck system is type t cursor is ref cursor end pck system 建立儲存過程 create...