Sqlparameter防SQL注入

2021-12-29 22:28:32 字數 3787 閱讀 4302

1.一sql注入的原因

2.二sql注入的一般步驟

3.三防範方法

4.四總結

隨著b/s模式應用開發的發展,使用這種模式編寫應用程式的程式設計師也越來越多。但是由於這個行業的入門門檻不高,程式設計師的水平及經驗也參差不齊,相當大一部分程式設計師在編寫**的時候,沒有對使用者輸入資料的合法性進行判斷,使應用程式存在安全隱患。使用者可以提交一段資料庫查詢**,根據程式返回的結果,獲得某些他想得知的資料,這就是所謂的sql injection,即sql注入。 

sql注入是從正常的www埠訪問,而且表面看起來跟一般的web頁面訪問沒什麼區別,所以目前市面的防火牆都不會對sql注入發出警報,如果管理員沒檢視iis日誌的習慣,可能被入侵很長時間都不會發覺。  

但是,sql注入的手法相當靈活,在注入的時候會碰到很多意外的情況。能不能根據具體情況進行分析,構造巧妙的sql語句,從而成功獲取想要的資料,是高手與「菜鳥」的根本區別。  

二、sql注入的一般步驟

首先,判斷環境,尋找注入點,判斷資料庫型別。

其次,根據注入引數型別,在腦海中重構sql語句的原貌,按引數型別主要分為下面三種: 

(a) id=49 這類注入的引數是數字型,sql語句原貌大致如下: 

select * from 表名 where 字段=49 

注入的引數為id=49 and [查詢條件],即是生成語句: 

select * from 表名 where 字段=49 and [查詢條件] 

(b) class=連續劇 這類注入的引數是字元型,sql語句原貌大致概如下: 

select * from 表名 where 字段=』連續劇』 

注入的引數為class=連續劇』 and [查詢條件] and 『』=』 ,即是生成語句: 

select * from 表名 where 字段=』連續劇』 and [查詢條件] and 『』=』』 

(c) 搜尋時沒過濾引數的,如keyword=關鍵字,sql語句原貌大致如下: 

select * from 表名 where 欄位like 』%關鍵字%』 

注入的引數為keyword=』 and [查詢條件] and 『%25』=』, 即是生成語句: 

select * from 表名 where欄位like 』%』 and [查詢條件] and 『%』=』%』 

接著,將查詢條件替換成sql語句,猜解表名,例如: 

id=49 and (select count(*) from admin)>=0 

如果頁面就與id=49的相同,說明附加條件成立,即表admin存在,反之,即不存在(請牢記這種方法)。如此迴圈,直至猜到表名為止。 表名猜出來後,將count(*)替換成count(欄位名),用同樣的原理猜解欄位名。 

有人會說:這裡有一些偶然的成分,如果表名起得很複雜沒規律的,那根本就沒得玩下去了。說得很對,這世界根本就不存在100%成功的黑客技術,蒼蠅不叮無縫的蛋,無論多技術多高深的黑客,都是因為別人的程式寫得不嚴密或使用者保密意識不夠,才有得下手。   

三、防範方法

sql注入漏洞可謂是「千里之堤,潰於蟻穴」,這種漏洞在網上極為普遍,通常是由於程式設計師對注入不了解,或者程式過濾不嚴格,或者某個引數忘記檢查導致。在這裡,我給大家乙個函式,代替asp中的request函式,可以對一切的sql注入說 no。

下面我就說說用sqlparameter防sql注入的方法 

1、 sqlparameter 建構函式

sqlparameter(string, sqldbtype, int32,parameterdirection, byte, byte, string, datarowversion, boolean, object,string, string, string),其引數分別代表該類使用引數名、引數的型別、引數的長度、方向、精度、小數字數、源列名稱、datarowversion 值之

一、用於源列對映的布林值、sqlparameter 的值、此 xml 例項的架構集合所在的資料庫的名稱、此 xml 例項的架構集合所在的關係架構以及此引數的架構集合的名稱。

2、  sqlparameter的應用

public class userdal

'''

''' 查詢使用者資訊

'''

'''

''' userone

''' 返回使用者的基本資訊實體

public function inquiry(byval enuserinfo as entity.userinfoentity) as entity.userinfoentity

'定義userinfoentity的乙個物件

dim userone as new entity.userinfoentity

'獲得連線字串

dim strconnection as string = system.configuration.configurationmanager.appsettings("sqlconnectstr")

'設定連線

dim conn as sqlconnection = new sqlconnection(strconnection)

'定義命令物件

dim cmd as new sqlcommand

'定義乙個介面卡物件

dim sqladapter as sqldataadapter

'例項乙個資料表的物件

dim dt as new datatable

'例項乙個資料集的物件

dim ds as new dataset

'sal語句

dim strsql as string = "select *from t_userinfo where userno=@userno"

dim paras as sqlparameter() =

'對cmd進行賦值

cmd.commandtext = strsql

cmd.commandtype = commandtype.text

cmd.connection = conn

cmd.parameters.addrange(paras)

sqladapter = new sqldataadapter(cmd)

conn.open() '開啟連線

sqladapter.fill(ds) '填充資料集

dt = ds.tables(0)

cmd.parameters.clear()

conn.close()

cmd.dispose()

try'對實體進行賦值

userone.userno = dt.rows(0).item("userno")

userone.username = dt.rows(0).item("username")

userone.userlevel = dt.rows(0).item("userlevel")

userone.userpwd = dt.rows(0).item("userpwd")

userone.registermanager = dt.rows(0).item("registermanager")

return userone

catch ex as exception

return userone

end try

end function  

3、 sqlparameter的基本原理是執行計畫重用。即對注入後的sql語句重新進行了編譯,重新執行了語法解析。

四、總結

不管怎麼說,在今後的開發中,對於sql注入的問題值得我們注意的還有很多,還有待於我們慢慢的積累

Sqlparameter防SQL注入

隨著b s 模式應用開發的發展,使用這種模式編寫應用程式的程式設計師也越來越多。但是由於這個行業的入門門檻不高,程式設計師的水平及經驗也參差不齊,相當大一部分程式設計師在編寫 的時候,沒有對使用者輸入資料的合法性進行判斷,使應用程式存在安全隱患。使用者可以提交一段資料庫查詢 根據程式返回的結果,獲得...

SQL防注入SqlParameter的使用

概述 一般來說,在更新datatable 或是dataset 時,如果不採用 sqlparameter 那麼當輸入的 sql語句出現歧義時,如字串中含有單引號,程式就會發生錯誤,並且他人可以輕易地通過拼接 sql語句來進行注入攻擊。目的 防止sql 注入被攻擊。首先,先寫乙個沒有 sqlparame...

php如何防sql注入,php如何預防sql注入

在查詢資料庫時需要防止sql注入 實現的方法 php自帶了方法可以將sql語句轉義,在資料庫查詢語句等的需要在某些字元前加上了反斜線。這些字元是單引號 雙引號 反斜線 與 nul null 字元 推薦學習 php程式設計從入門到精通 string addslashes string str 該函式返...