防止sql注入的三種方法

經常使用的避免SQL注入的三種方法 sql

一,存儲過程 數據庫

        在學習數據庫視頻的時候接觸過,它是存儲在數據庫中的一些事先編譯好的指令。在用的時候不用從新編寫,直接調用就行了。因此,使用它能夠大大提升程序的執行效率。 編程

那麼,若是建立一個存儲程序並使用它呢?這是咱們今天要解決的問題   服務器

         1.建立過程 函數

            可編程性——下拉菜單——存儲過程——右鍵——查詢菜單——指定模板參數的值——新建查詢——輸入語句——查詢菜單中的分析檢查語法是否正確——執行        學習

        2.具體建立語法 spa

            在建立存儲程序時,爲了應對各類變換的數據,一般會涉及到帶參數的存儲程序,其中參數用@來表示。 .net

     Create Procedure procedurename[:number] --['number]表示一組存儲程序中的第幾個,若是隻有一個,此參數可忽略 設計

    [@parameter data_type] [default] [OUTPUT] --@parameter表示存儲過程當中的參數,default表示默認值,OUTPUT表示輸出值即輸出值as SqlStatement --[]表明可選參數 視頻

    3.具體執行過程

    exec[ute]procedurename [參數]

    舉例:

--建立

CreateProcedure scores @score1smallint, @score2smallint, @score3smallint,@secre4smallint, @score5smallint, @myAvgsmallint Output --Output可用return來代替   

As select @myAvg=(@score1+@score2+@score3+@score4+@score5)/5 --調用過程

Declare@avgscore smallint --將輸出結果放在avgscore中

Execavgscore Output 5,6,7,8,9, --帶有參數的存儲過程調用時,必須加上Output關鍵字,不然SQL會當作參數來對待

小結:存儲程序的建立可分爲帶參數和不帶參數,以及含有默認值和輸出值的存儲程序,可是他們的使用原理是同樣的。只是帶輸出值得存儲程序在調用過程當中要使用關鍵字Output來對要輸出的變量進行聲明,不然SQL會將它當作參數來處理。

注意:建立存儲程序後,咱們能夠在編寫程序時,直接調用存儲程序的名稱來代替複雜的查詢語句:

strSQL="select .....;" strSQL="Execte produreName"

2、參數化SQL

    是指在設計與數據庫連接並訪問數據時,在須要填入數值或數據的地方,使用參數 (Parameter) 來給值,用@或?來表示參數。

    在使用參數化查詢的狀況下,數據庫服務器不會將參數的內容視爲SQL指令的一部份來處理,而是在數據庫完成 SQL 指令的編譯後,才套用參數運行,所以就算參數中含有惡意的指令,因爲已經編譯完成,就不會被數據庫所運行,所以,可從必定程度上避免SQL注入。

參數化SQL在不一樣數據庫中支持的方式有必定的差異。SQL server中兩者均支持。

在不用的數據庫上基本語法都是同樣的,但在不一樣的運行平臺上客戶端的書寫有不一樣之處,在這裏就拿如今我正在學習的SQL server在.net上執行來舉例。

--SQL server中的參數化SQL語句: SELECT * FROM myTable WHERE myID = @myID INSERT INTO myTable (c1, c2, c3, c4) VALUES (@c1, @c2, @c3, @c4)'.在.NET上執行

SqlCommand sqlcmd = new SqlCommand("INSERT INTO myTable (c1, c2, c3, c4) VALUES (@c1, @c2, @c3, @c4)", sqlconn);

sqlcmd.Parameters.AddWithValue("@c1", 1); ' 設定參數 @c1 的值。

sqlcmd.Parameters.AddWithValue("@c2", 2); ' 設定參數 @c2 的值。

sqlcmd.Parameters.AddWithValue("@c3", 3); ' 設定參數 @c3 的值。

sqlcmd.Parameters.AddWithValue("@c4", 4); ' 設定參數 @c4 的值。

sqlconn.Open();

sqlcmd.ExecuteNonQuery();

sqlconn.Close();

在向command中增長參數時,還有其餘的方法,如:

sqlcmd.parameters.Add("@c1",SqlDbType.BigInt) 'BigInt爲c1的數據類型

sqlcmd.parameter("@c1").value=1 '設定值

3、Regular Expression

     簡稱REs是一種很是強大的文字驗證技術。一般咱們在設計程序時,若是要在TEXT中輸入數字的話,那麼咱們會用到IsNumberic函數來限制,可是不少狀況,爲了用戶方便,咱們不止要用到限定數字這一個技術,還有不少關係式須要咱們去遵循,如手機號碼要限定成11爲,郵箱號碼要限制相應的格式等。這時候就用到了REs這種技術。它能夠爲咱們要輸入的內容提供一個模板,讓用戶的輸入必須遵循這個模板的格式,若是格式不正確,則程序不能繼續執行。這樣也能夠避免SQL注入。

例如

\d   -------表明數字

\d{5}  -------表明5位數字

\w+@\w+ -------@前的w+表示要有至少一個的字符,@表明這個模板中必須有一個@字符。

固然在使用這種技術以前,是有條件的,首先,它須要引用一個命名空間,具體以下:

Imports RE=System.Text.RegularExpressions.Regex

這樣還不夠,咱們須要一個方法來作驗證用戶輸入是否正確的工做,這裏,咱們要用到一個方法match,具體使用以下:

Dim input,pattern As String

Input=Me.txtInput.TextTrim()

Pattern=Me.txtPattern.Text

If Re.Mathc(input,pattern).Success Then ‘使用Match方法來對用戶輸入的內容與定義好的模板進行驗證

MessageBox.Show("True,input matches pattern") Else MessageBox.Show("False,input does not match pattern") End if

以上,是經過看.net視頻總結出來的避免SQL注入的三種方法,因爲對專業知識瞭解有限,具體原理並不清楚,有待之後深刻學習後總結。 

相關文章
相關標籤/搜索