當前位置:首頁 » 編程語言 » 什麼是sql注入如何防止
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

什麼是sql注入如何防止

發布時間: 2022-02-05 17:36:26

1. 防止sql注入~~是什麼意思

SQL注入,就是利用sql不完規范代碼漏洞進行網站功擊。
比如你在網站上寫上if **()="admin" then的代碼,admin為用戶等判斷如果再下來不進行過濾那麼別人有可能用if**()="user
"代碼進入你的系統。又如登錄框 用戶名: 密碼 提交。
這樣的樣式,別人可以用"or"="or" 進入。如:用戶名:"or"="or"密碼"or"="or"。你點提交可以直接進入對方後台,並切是管理員,但大部分網站已經過濾掉or了。網站最要命的有user admin add or rs eof等。都可以進入,所以做好網站,還要做一個過濾的代碼。來做安全。
由於不給寫太多有關資料庫的代碼,俺 不演示了。不過你可以用"or"="or" 式式別人的網站了。方法你在google輸入網站管理後台。然後就享受一下吧。別忘記了,只在學習,不能亂來。口號是一致對外,特別是日本美國。

2. 如何防止SQL注入

一、存儲程序
在學習資料庫視頻的時候接觸過,它是存儲在資料庫中的一些事先編譯好的指令。在用的時候不用重新編寫,直接調用就好了。所以,使用它可以大大提高程序的執行效率。
那麼,如何創建一個存儲程序並使用它呢?這是我們今天要解決的問題。
1.創建過程
可編程性——下拉菜單——存儲過程——右鍵——查詢菜單———指定模板參數的值——新建查詢——輸入語句——查詢菜單中的分析檢查語法是否正確——執行
2.具體創建語法
在創建存儲程序時,為了應對各種變換的數據,通常會涉及到帶參數的存儲程序,其中參數用@來表示。
Create Procere procerename[:number] --[:number]表示一組存儲程序中的第幾個,如果只有一個,此參數可忽略

[@parameter data_type] [default] [OUTPUT] --@parameter表示存儲過程中的參數,default 表示默認值,OUTPUT表示輸出值即輸出值 as SqlStatement --[]代表可選參數
3.具體執行過程
exec[ute] procerename [參數]
舉例:
--創建

CreateProcere
scores @score1smallint, @score2smallint, @score3smallint,
@score4smallint, @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="Execute procereName;"
二、參數化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 '設定值
三、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注入的三種方法,由於對專業知識了解有限,具體原理並不清楚,有待以後深入學習後總結。