㈠ 如何能防止sql注入
如何能防止sql注入
普通用戶與系統管理員用戶的許可權要有嚴格的區分。
如果一個普通用戶在使用查詢語句中嵌入另一個Drop Table語句,那麼是否允許執行呢?由於Drop語句關繫到資料庫的基本對象,故要操作這個語句用戶必須有相關的許可權。在許可權設計中,對於終端用戶,即應用軟體的使用者,沒有必要給他們資料庫對象的建立、刪除等許可權。那麼即使在他們使用SQL語句中帶有嵌入式的惡意代碼,由於其用戶許可權的限制,這些代碼也將無法被執行。故應用程序在設計的時候,
強迫使用參數化語句。
如果在編寫SQL語句的時候,用戶輸入的變數不是直接嵌入到SQL語句。而是通過參數來傳遞這個變數的話,那麼就可以有效的防治SQL注入式攻擊。也就是說,用戶的輸入絕對不能夠直接被嵌入到SQL語句中。與此相反,用戶的輸入的內容必須進行過濾,或者使用參數化的語句來傳遞用戶輸入的變數。參數化的語句使用參數而不是將用戶輸入變數嵌入到SQL語句中。採用這種措施,可以杜絕大部分的SQL注入式攻擊。不過可惜的是,現在支持參數化語句的資料庫引擎並不多。不過資料庫工程師在開發產品的時候要盡量採用參數化語句。
多多使用SQL Server資料庫自帶的安全參數。
為了減少注入式攻擊對於SQL Server資料庫的不良影響,在SQLServer資料庫專門設計了相對安全的SQL參數。在資料庫設計過程中,工程師要盡量採用這些參數來杜絕惡意的SQL注入式攻擊。
如在SQL Server資料庫中提供了Parameters集合。這個集合提供了類型檢查和長度驗證的功能。如果管理員採用了Parameters這個集合的話,則用戶輸入的內容將被視為字元值而不是可執行代碼。即使用戶輸入的內容中含有可執行代碼,則資料庫也會過濾掉。因為此時資料庫只把它當作普通的字元來處理。使用Parameters集合的另外一個優點是可以強制執行類型和長度檢查,范圍以外的值將觸發異常。如果用戶輸入的值不符合指定的類型與長度約束,就會發生異常,並報告給管理員。如上面這個案例中,如果員工編號定義的數據類型為字元串型,長度為10個字元。而用戶輸入的內容雖然也是字元類型的數據,但是其長度達到了20個字元。則此時就會引發異常,因為用戶輸入的內容長度超過了資料庫欄位長度的限制。
加強對用戶輸入的驗證。
總體來說,防治SQL注入式攻擊可以採用兩種方法,一是加強對用戶輸入內容的檢查與驗證;二是強迫使用參數化語句來傳遞用戶輸入的內容。在SQLServer資料庫中,有比較多的用戶輸入內容驗證工具,可以幫助管理員來對付SQL注入式攻擊。測試字元串變數的內容,只接受所需的值。拒絕包含二進制數據、轉義序列和注釋字元的輸入內容。這有助於防止腳本注入,防止某些緩沖區溢出攻擊。測試用戶輸入內容的大小和數據類型,強制執行適當的限制與轉換。這即有助於防止有意造成的緩沖區溢出,對於防治注入式攻擊有比較明顯的效果。
如可以使用存儲過程來驗證用戶的輸入。利用存儲過程可以實現對用戶輸入變數的過濾,如拒絕一些特殊的符號。如以上那個惡意代碼中,只要存儲過程把那個分號過濾掉,那麼這個惡意代碼也就沒有用武之地了。在執行SQL語句之前,可以通過資料庫的存儲過程,來拒絕接納一些特殊的符號。在不影響資料庫應用的前提下,應該讓資料庫拒絕包含以下字元的輸入。如分號分隔符,它是SQL注入式攻擊的主要幫凶。如注釋分隔符。注釋只有在數據設計的時候用的到。一般用戶的查詢語句中沒有必要注釋的內容,故可以直接把他拒絕掉,通常情況下這么做不會發生意外損失。把以上這些特殊符號拒絕掉,那麼即使在SQL語句中嵌入了惡意代碼,他們也將毫無作為。
故始終通過測試類型、長度、格式和范圍來驗證用戶輸入,過濾用戶輸入的內容。這是防止SQL注入式攻擊的常見並且行之有效的措施。
多層環境如何防治SQL注入式攻擊?
在多層應用環境中,用戶輸入的所有數據都應該在驗證之後才能被允許進入到可信區域。未通過驗證過程的數據應被資料庫拒絕,並向上一層返回一個錯誤信息。實現多層驗證。對無目的的惡意用戶採取的預防措施,對堅定的攻擊者可能無效。更好的做法是在用戶界面和所有跨信任邊界的後續點上驗證輸入。如在客戶端應用程序中驗證數據可以防止簡單的腳本注入。但是,如果下一層認為其輸入已通過驗證,則任何可以繞過客戶端的惡意用戶就可以不受限制地訪問系統。故對於多層應用環境,在防止注入式攻擊的時候,需要各層一起努力,在客戶端與資料庫端都要採用相應的措施來防治SQL語句的注入式攻擊。
㈡ Mysql資料庫拼接且防注入
<?php
//------show_xml.php------
error_reporting(E_ALL ^ E_NOTICE);
include_once("../include/mysql.class.php"); //資料庫類
include_once("../config/config.php"); //資料庫連接配置文件
header("Content-type:text/xml"); print("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>");
$db = new mysql(); //connect MYSQL
$query="select * from a order by id asc";
$result=$db->query($query);
while ($row = $db->fetch_array($result))
{
print("<document_info><source id='".$row[id]."'>".$row[name]."</source></document_info><content><title>".$row[num]."</title></content>");
}
$db->close();
?>
㈢ java拼接sql怎麼防止注入
使用Hibernate框架的SQL注入防範 Hibernate是目前使用最多的ORM框架,在Java Web開發中,很多時候不直接使用JDBC,而使用Hibernate來提高開發效率。
在Hibernate中,仍然不應該通過拼接HQL的方式,而應使用參數化的方式來防範SQL注入。有兩種方式,一種仍然是使用JDBC一樣的佔位符「?」,但更好的方式是使用Hibernate的命名參數,例如檢測用戶名和密碼是否正確,使用Hibernate可以寫成:
String queryStr = 「from user where username=:username 」+」password=:password」;
List result = session.createQuery(queryStr).setString("username", username).setString("password", password).list();
㈣ 如何徹底防止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則是利用郵寄信息數據欄位將數據傳送到伺服器。
㈤ 怎樣防止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 語句上。
㈥ 怎麼樣防止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.屏蔽伺服器異常信息
㈦ 多條件查詢拼接sql語句如何防止sql注入
參數合法性驗證:
參數過濾
參數長度驗證
...
㈧ java里拼接sql怎麼防注入
最簡單最容易的是限制用戶輸入。簡單點的就是不允許用戶輸入單引號 和 --,因為單引號號--在SQL中都是影響執行的,兩種方式一種是在JSP中加判斷:
3
另一種是在SQL拼接是對單引號和--等進行轉義,str = str.replace("'", "''");
㈨ 如何防止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;
}
㈩ oracle拼接sql字元串,怎樣防止sql注入
用replace函數替換
把 ' 替換成 空