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

sql防注入方式

發布時間: 2022-01-13 00:00:21

1. 如何從根本上防止 sql 注入

SQL注入並不是一個在SQL內不可解決的問題,這種攻擊方式的存在也不能完全歸咎於SQL這種語言,因為注入的問題而放棄SQL這種方式也是因噎廢食。首先先說一個我在其他回答中也曾提到過的觀點:沒有(運行時)編譯,就沒有注入。
SQL注入產生的原因,和棧溢出、XSS等很多其他的攻擊方法類似,就是未經檢查或者未經充分檢查的用戶輸入數據,意外變成了代碼被執行。針對於SQL注入,則是用戶提交的數據,被資料庫系統編譯而產生了開發者預期之外的動作。也就是,SQL注入是用戶輸入的數據,在拼接SQL語句的過程中,超越了數據本身,成為了SQL語句查詢邏輯的一部分,然後這樣被拼接出來的SQL語句被資料庫執行,產生了開發者預期之外的動作。
所以從根本上防止上述類型攻擊的手段,還是避免數據變成代碼被執行,時刻分清代碼和數據的界限。而具體到SQL注入來說,被執行的惡意代碼是通過資料庫的SQL解釋引擎編譯得到的,所以只要避免用戶輸入的數據被資料庫系統編譯就可以了。
現在的資料庫系統都提供SQL語句的預編譯(prepare)和查詢參數綁定功能,在SQL語句中放置佔位符'?',然後將帶有佔位符的SQL語句傳給資料庫編譯,執行的時候才將用戶輸入的數據作為執行的參數傳給用戶。這樣的操作不僅使得SQL語句在書寫的時候不再需要拼接,看起來也更直接,而且用戶輸入的數據也沒有機會被送到資料庫的SQL解釋器被編譯執行,也不會越權變成代碼。
至於為什麼這種參數化的查詢方式沒有作為默認的使用方式,我想除了兼容老系統以外,直接使用SQL確實方便並且也有確定的使用場合。

2. 怎麼樣防止Sql注入

(1)對於動態構造SQL查詢的場合,可以使用下面的技術:

第一:替換單引號,即把所有單獨出現的單引號改成兩個單引號,防止攻擊者修改SQL命令的含義。再來看前面的例子,「SELECT * from Users WHERE login = ''' or ''1''=''1' AND password = ''' or ''1''=''1'」顯然會得到與「SELECT * from Users WHERE login = '' or '1'='1' AND password = '' or '1'='1'」不同的結果。

第二:刪除用戶輸入內容中的所有連字元,防止攻擊者構造出類如「SELECT * from Users WHERE login = 'mas' -- AND password =''」之類的查詢,因為這類查詢的後半部分已經被注釋掉,不再有效,攻擊者只要知道一個合法的用戶登錄名稱,根本不需要知道用戶的密碼就可以順利獲得訪問許可權。

第三:對於用來執行查詢的資料庫帳戶,限制其許可權。用不同的用戶帳戶執行查詢、插入、更新、刪除操作。由於隔離了不同帳戶可執行的操作,因而也就防止了原本用於執行SELECT命令的地方卻被用於執行INSERT、UPDATE或DELETE命令。

⑵ 用存儲過程來執行所有的查詢。SQL參數的傳遞方式將防止攻擊者利用單引號和連字元實施攻擊。此外,它還使得資料庫許可權可以限制到只允許特定的存儲過程執行,所有的用戶輸入必須遵從被調用的存儲過程的安全上下文,這樣就很難再發生注入式攻擊了。

⑶ 限製表單或查詢字元串輸入的長度。如果用戶的登錄名字最多隻有10個字元,那麼不要認可表單中輸入的10個以上的字元,這將大大增加攻擊者在SQL命令中插入有害代碼的難度。

⑷ 檢查用戶輸入的合法性,確信輸入的內容只包含合法的數據。數據檢查應當在客戶端和伺服器端都執行——之所以要執行伺服器端驗證,是為了彌補客戶端驗證機制脆弱的安全性。

在客戶端,攻擊者完全有可能獲得網頁的源代碼,修改驗證合法性的腳本(或者直接刪除腳本),然後將非法內容通過修改後的表單提交給伺服器。因此,要保證驗證操作確實已經執行,唯一的辦法就是在伺服器端也執行驗證。你可以使用許多內建的驗證對象,例如RegularExpressionValidator,它們能夠自動生成驗證用的客戶端腳本,當然你也可以插入伺服器端的方法調用。如果找不到現成的驗證對象,你可以通過CustomValidator自己創建一個。

⑸ 將用戶登錄名稱、密碼等數據加密保存。加密用戶輸入的數據,然後再將它與資料庫中保存的數據比較,這相當於對用戶輸入的數據進行了「消毒」處理,用戶輸入的數據不再對資料庫有任何特殊的意義,從而也就防止了攻擊者注入SQL命令。System.Web.Security.FormsAuthentication類有一個,非常適合於對輸入數據進行消毒處理。

⑹ 檢查提取數據的查詢所返回的記錄數量。如果程序只要求返回一個記錄,但實際返回的記錄卻超過一行,那就當作出錯處理。
---------------------------------------------------------------------------------------------------------------------------
關鍵是明白原理,其實防範很簡單的,
1.過濾SQL需要的參數中的敏感字元(注意加入忽略大小寫)
2.禁用資料庫伺服器的xp_cmdshell存儲過程,刪除相應用到的dll
3.屏蔽伺服器異常信息

3. 如何防止sql注入

對於jsp而言我們一般採取一下策略來應對:

1、PreparedStatement
如果你已經是稍有水平開發者,你就應該始終以PreparedStatement代替Statement.
以下是幾點原因
1)、代碼的可讀性和可維護性.
2)、PreparedStatement盡最大可能提高性能.
3)、最重要的一點是極大地提高了安全性.
到目前為止,有一些人(包括本人)連基本的惡義SQL語法都不知道.
String sql = "select * from tb_name where name= '"+varname+"' and passwd='"+varpasswd+"'";
如果我們把[' or '1' = '1]作為name傳入進來.密碼隨意,看看會成為什麼?
select * from tb_name = 'or '1' = '1' and passwd = '隨意' ;
因為'1'='1'肯定成立,所以可以任何通過驗證.更有甚者:
把['; drop table tb_name; ]作為varpasswd傳入進來,則:
select * from tb_name = '隨意' and passwd = ''; drop table tb_name; 有些資料庫是不會讓你成功的,但也有很多資料庫就可以使這些語句得到執行.
而如果你使用預編譯語句.你傳入的任何內容就不會和原來的語句發生任何匹配的關系.(前提是資料庫本身支持預編譯,但上前可能沒有什麼服務端資料庫不支持編譯了,只有少數的桌面資料庫,就是直接文件訪問的那些只要全使用預編譯語句,你就用不著對傳入的數據做任何過慮.而如果使用普通的 statement,有可能要對drop,; 等做費盡心機的判斷和過慮.

2、正則表達式
2.1、檢測SQL meta-characters的正則表達式 /(\%27)|(\')|(\-\-)|(\%23)|(#)/ix
2.2、修正檢測SQL meta-characters的正則表達式 /((\%3D)|(=))[^\n]*((\%27)|(\')|(\-\-) |(\%3B)|(:))/i
2.3、典型的 SQL 注入攻擊的正則表達式 /\w*((\%27)|(\'))((\%6F)|o|(\%4F))((\%72)|r|(\ ))/ix
2.4、檢測SQL注入,UNION查詢關鍵字的正則表達式 /((\%27)|(\'))union/ix(\%27)|(\') - 單引號和它的hex等值union - union關鍵字。
2.5、檢測MS SQL Server SQL注入攻擊的正則表達式 /exec(\s|\+)+(s|x)p\w+/ix

3、字元串過濾
public static String filterContent(String content){
String flt ="'|and|exec|insert|select|delete|update|count|*|%
|chr|mid|master|truncate|char|declare|; |or|-|+|,";
Stringfilter[] = flt.split("|");
for(int i=0; i {
content.replace(filter[i], "");
}
return content;
}

4、不安全字元屏蔽
本部分採用js來屏蔽,起的作用很小,這樣用屏蔽關鍵字的方法雖然有一定作用,但是在實際應用中這些 SQL的關鍵字也可能成為真正的查詢關鍵字,到那是被你屏蔽了那用戶不是不能正常的使用了。 只要在代碼規范上下點功夫就可以了。
凡涉及到執行的SQL中有變數時,用JDBC(或者其他數據持久層)提供的如:PreparedStatement就可以 ,切記不要用拼接字元串的方法就可以了.
功能介紹:檢查是否含有"'","\\","/"
參數說明:要檢查的字元串
返回值:0:是 1:不是
函數名是
function check(a)
{
return 1;
fibdn = new Array ("'" ,"\\","/");
i=fibdn.length;
j=a.length;
for (ii=0; ii { for (jj=0; jj

{ temp1=a.charAt(jj);
temp2=fibdn[ii];
if (tem'; p1==temp2)
{ return 0; }
}
}
return 1;
}

4. 什麼是sql注入,怎麼防止注入

sql注入其實就是在這些不安全控制項內輸入sql或其他資料庫的一些語句,從而達到欺騙伺服器執行惡意到嗎影響到資料庫的數據。防止sql注入,可以在接受不安全空間的內容時過濾掉接受字元串內的「'」,那麼他不再是一條sql語句,而是一個類似sql語句的zifuc,執行後也不會對資料庫有破壞。

如:

username = request("username") //獲取用戶名 這里是通過URL傳值獲取的。

password = request("password") //獲取密碼 也是通過URL傳值獲取的。

sql="select * from userlist where username = '" & username & "' and password = '" & password & "'"--------如果某個人知道某個用戶名是admin,常常有人網站的管理員用戶名就是admin,這是密碼可以選用'or 1 or ',

那麼sql="select * from userlist where username = 'admin' and password = '' or 1 or ''",顯然1是恆真的,那麼驗證密碼就通過了。

防止的方式比較多,比如可以限制username,password中出現"'"這些字元,一般網站都是只允許數字,字元,下劃線的組合,這可以通過javascript驗證。也可以採取用存儲過程代替sql拼接,等等。

5. 關於防止sql注入的幾種手段

所謂SQL注入,就是通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字元串,最終達到欺騙伺服器執行惡意的SQL命令。具體來說,它是利用現有應用程序,將(惡意)的SQL命令注入到後台資料庫引擎執行的能力,它可以通過在Web表單中輸入(惡意)SQL語句得到一個存在安全漏洞的網站上的資料庫,而不是按照設計者意圖去執行SQL語句。比如先前的很多影視網站泄露VIP會員密碼大多就是通過WEB表單遞交查詢字元暴出的,這類表單特別容易受到SQL注入式攻擊.
防護
歸納一下,主要有以下幾點:
1.永遠不要信任用戶的輸入。對用戶的輸入進行校驗,可以通過正則表達式,或限制長度;對單引號和
雙"-"進行轉換等。
2.永遠不要使用動態拼裝sql,可以使用參數化的sql或者直接使用存儲過程進行數據查詢存取。
3.永遠不要使用管理員許可權的資料庫連接,為每個應用使用單獨的許可權有限的資料庫連接。
4.不要把機密信息直接存放,加密或者hash掉密碼和敏感的信息。
5.應用的異常信息應該給出盡可能少的提示,最好使用自定義的錯誤信息對原始錯誤信息進行包裝
6.sql注入的檢測方法一般採取輔助軟體或網站平台來檢測,軟體一般採用sql注入檢測工具jsky,網站平台就有億思網站安全平台檢測工具。MDCSOFT SCAN等。採用MDCSOFT-IPS可以有效的防禦SQL注入,XSS攻擊等。

6. 怎樣防止sql注入

可以使用變數綁定的方式就可以防止sql注入,如果是直接拼接的方式那麼就非常容易被注入。比如:select * from tablename where user='admin' and pwd ='123' 假設說這個是一個登錄的sql語句,admin是用戶文本框輸入的,pwd是密碼框輸入的。如果密碼文本框如果輸入:' or '1'='1 那麼拼接起sql就是select * from tablename where user='admin' and pwd ='' or '1'='1' 那麼就會跳過sql的條件就直接進入登錄,但是如果是使用綁定變數的就不一樣
如下:
select * from tablename where user=@user and pwd =@pwd
@user=admin
@pwd=123
這樣的話不管user和pwd傳入的是什麼內容都被sql server識別成字元串而不是直接拼接在sql 語句上。

7. 什麼是sql注入sql注入有哪些方式防止sql注入又有哪些方式(.Net下)

所謂SQL注入,其實是程序漏洞,沒有什麼技術,比如下面的語句就可能被注入
SQL="SELECT * FROM ADMIN WHERE USER='" &REQUEST("USER")& "' AND PASS ='" &REQUEST("PASS")& "'"

別人可以精心設計一個PASS參數提交給你,使得你的SQL完成其它功能,例如PASS的值為:
abc' OR USER='admin

這時候SQL語句是什麼樣子,你看看:
SELECT * FROM ADMIN WHERE USER='admin' AND PASS='abc' OR USER='admin'

任何密碼都可以成功登錄。

解決的方法:程序應該判斷USER和PASS這些參數裡面是否有引號等特殊符號。

上面是一個簡單的例子,通過提交精心設計的參數,還可以修改你的資料庫。

8. 如何徹底防止SQL注入

1、對,限制用戶輸入肯定有效
2、應該也可以做到,但正則不是一種高效的方法,用HtmlEncode的方法可以有效防止空格等被DBMS解釋,但注意別把編碼、解碼搞反了;存儲過程是DBMS執行的一段程序,把數據操縱交給存儲過程執行,而不是提交SQL語句,可以有效防止SQL注入。
3、地址欄的Sql攻擊,下面我引用了一段資料解釋,他關於機制說的較清楚,關於解決,只是從客戶端考慮的,實際上用存儲過程等都可以防範。
資料:
首先,入侵者會對一個網站確定可不可以進行注入,假設一篇文章的地址為:http://www.naohou.cn/show.asp?id=325一般會以提交兩個地址來測試,如:
http://www.naohou.cn/show.asp?id=325 and 1=1
http://www.naohou.cn/show.asp?id=325 and 1=2
第一個地址後面加了 and 1=1,構成的SQL語句也就變為了:Select * from 表單名 where id=1 and 1=1這句話要成立就必須and前後語句都成立。那麼前面的文章地址是可以訪問的,後面的1=1也是客觀成立的,那麼第一個地址就可以正常顯示;相反1=2是顯然不成立的,關鍵就看這步了,如果提交and 1=2頁面還是正常顯示說明他並沒有將and 1=2寫入SQL語句,此站也就不存在注入漏洞;但如果提交and 1=2之後返回了錯誤頁面則說明此站點將後面的語句帶入了SQL語句並執行了,也就說明他可以進行SQL注入。(註:如果地址後面跟的是news.asp?id='1'就得變為news.asp?id=1' and '1'='1來補全引號了)
那麼,知道可以注入後入侵者可以做什麼呢?
這里就簡單的說一下,比如提交這樣的地址:
http://www.naohou.cn/show.asp?id=325 and exists (select * from 表名 where 列名=數據)
根據返回的正確或錯誤頁面來判斷猜的表名和列名是否正確,具體實現時是先猜表名再猜列名。當猜出表名和列名之後還可以用ASC和MID函數來猜出各列的數據。MID函數的格式為:mid(變數名,第幾個字元開始讀取,讀取幾個字元),比如:mid(pwd,1,2)就可以從變數pwd中的第一位開始讀取兩位的字元。ASC函數的格式為:ASC("字元串"),如:asc("a")就可以讀出字母a的ASCII碼了。那麼實際應用的時候就可以寫為:asc(mid(pwd,1,1))這樣讀取的就是pwd列的第一個字元的ASCII碼,提交: asc(mid(pwd,1,1))>97以返回的頁面是否為正確頁面來判斷pwd列的第一個字元的ASCII碼是否大於97(a的ASCII碼),如果正確就再試是否小於122(z的ASCII碼)……這樣慢慢縮小字元的ASCII碼的范圍,猜到真實的ASCII碼也只是時間的問題。一位一位的猜就可以得到資料庫中的用戶名和密碼了。還有一種ASP驗證缺陷——就是用戶名和密碼都輸'or '1'='1,構造SQL語句Select * form 表單名 where username='' or '1'='1' and pwd='' or '1'='1'就可以達到繞過密碼驗證的目的。
說了那麼多,其實防範的方法很簡單,我們把特殊字元(如and、or、'、")都禁止提交就可以防止注入了。ASP傳輸數據分為get和post兩種, get是通過將數據添加到URL後提交的方式,post則是利用郵寄信息數據欄位將數據傳送到伺服器。

9. 如何防止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注入的三種方法,由於對專業知識了解有限,具體原理並不清楚,有待以後深入學習後總結。

10. 怎樣防止sql注入攻擊 / 藍訊

所謂SQL注入式攻擊,就是攻擊者把SQL命令插入到Web表單的輸入域或頁面請求的查詢字元串中,欺騙伺服器執行惡意的SQL命令。在某些表單中,用戶輸入的內容直接用來構造(或者影響)動態SQL命令,或作為存儲過程的輸入參數,這類表單特別容易受到SQL注入式攻擊。
防範SQL注入式攻擊闖入並不是一件特別困難的事情,只要在利用表單輸入的內容構造SQL命令之前,把所有輸入內容過濾一番就可以了。過濾輸入內容可以按多種方式進行。

●替換單引號,即把所有單獨出現的單引號改成兩個單引號,防止攻擊者修改SQL命令的含義。
●刪除用戶輸入內容中的所有連字元,防止攻擊者順利獲得訪問許可權。
●對於用來執行查詢的資料庫賬戶,限制其許可權。用不同的用戶賬戶執行查詢、插入、更新、刪除操作。由於隔離了不同賬戶可執行的操作,因而也就防止了原本用於執行SELECT命令的地方卻被用於執行INSERT、UPDATE或DELETE命令。
●用存儲過程來執行所有的查詢。SQL參數的傳遞方式將防止攻擊者利用單引號和連字元實施攻擊。此外,它還使得資料庫許可權可以被限制到只允許特定的存儲過程執行,所有的用戶輸入必須遵從被調用的存儲過程的安全上下文,這樣就很難再發生注入式攻擊了。
●檢查用戶輸入的合法性,確信輸入的內容只包含合法的數據。數據檢查應當在客戶端和伺服器端都執行。之所以要執行伺服器端驗證,是為了彌補客戶端驗證機制脆弱的安全性。在客戶端,攻擊者完全有可能獲得網頁的源代碼,修改驗證合法性的腳本(或者直接刪除腳本),然後將非法內容通過修改後的表單提交給伺服器。因此,要保證驗證操作確實已經執行,唯一的辦法就是在伺服器端也執行驗證。
●將用戶登錄名稱、密碼等數據加密保存。加密用戶輸入的數據,然後再將它與資料庫中保存的數據比較,這相當於對用戶輸入的數據進行了「消毒」處理。用戶輸入的數據不再對資料庫有任何特殊的意義,從而也就防止了攻擊者注入SQL命令。
●檢查提取數據的查詢所返回的記錄數量。如果程序只要求返回一個記錄,但實際返回的記錄卻超過一行,那就當做出錯處理。