資源描述:
《如此高效通用的分頁存儲過程是帶有sql注入漏洞的》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、如此高效通用的分頁存儲過程是帶有sql注入漏洞的>>教育資源庫 在google中搜索分頁存儲過程會出來好多結(jié)果,是大家常用的分頁存儲過程,今天我卻要說它是有漏洞的,而且漏洞無法通過修改存儲過程進(jìn)行補救,如果你覺得我錯了,請讀下去也許你會改變看法。 通常大家都會認(rèn)為存儲過程可以避免sql注入的漏洞,這適用于一般的存儲過程,而對于通用分頁存儲過程是不適合的,請看下面的代碼和分析! 一般的通用的分頁存儲過程代碼如下: 通用分頁存儲過程CREATEPROCEDUREpaginationtblNamevarchar(
2、255),--表名strGetFieldsvarchar(1000)='*',--需要返回的列fldNamevarchar(255)='',--排序的字段名PageSizeint=10,--頁尺寸PageIndexint=1,--頁碼doCountbit=0,--返回記錄總數(shù),非0值則返回OrderTypebit=0,--設(shè)置排序類型,非0值則降序str['+tblName+']['+tblName+']'end--以上代碼的意思是如果doCo
3、unt傳遞過來的不是0,就執(zhí)行總數(shù)統(tǒng)計。以下的所有代碼都是doCount為0的情況 elsebeginifOrderType!=0beginsetstrTmp='<(selectmin'setstrOrder='orderby['+fldName+']desc'--如果OrderType不是0,就執(zhí)行降序,這句很重要!end elsebeginsetstrTmp='>(selectmax'setstrOrder='orderby
4、['+fldName+']asc'endifPageIndex=1beginifstr['+tblName+']['+tblName+']'+strOrder--如果是第一頁就執(zhí)行以上代碼,這樣會加快執(zhí)行速度end elsebegin--以下代碼賦予了strSQL以真正執(zhí)行的SQL代碼setstrSQL='selecttop'+str(PageSize)+''+strGetFields+'from['+
5、tblName+']e+']'+strTmp+'(['+fldName+'])from(selecttop'+str((PageIndex-1)*PageSize)+'['+fldName+']from['+tblName+']'+strOrder+')astblTmp)'+strOrderifstr['+tblName+']e+']'+strTmp+'([
6、'+fldName+'])from(selecttop'+str((PageIndex-1)*PageSize)+'['+fldName+']from['+tblName+']p)and'+strWhere+''+strOrderendendexec(strSQL)GO 大家可以看到上面的12下一頁>>>>這篇文章來自..,。存儲過程中是通過一些步驟最終拼接成一個sql字符串,然后通過exec執(zhí)行這個串得到分頁的結(jié)果?! ∥覀?/p>
7、假定要做一個這樣的查詢,通過用戶名UserName模糊查詢用戶,為了敘述方便,便于理解我們只考慮取第一頁的情況,取出存儲過程中取第一頁的拼串行如下:setstrSQL='SELECTTOP'+str(PageSize)+''+strGetFields+'from['+tblName+'] e為UserAccount,strOrder為ORDER BY IDDESC那么上面一行可以寫成如下形式: setstrSQL='SELECTTOP20* from
8、[UserAccount] sdog 我們用SqlParameter傳遞參數(shù)給分頁存儲過程strSSQLServer2000的數(shù)據(jù)庫,而非使用SQL2005的新特性分頁?! ∥恼拢簓ukaizhao/上一頁12>>>>這篇文章來自..,。