前沿拓展:
防止sql注入
**選D。選擇使用什么數(shù)據(jù)起怎媽得掉**江表樣庫本身不能作為防止sql注入,無論使用什么數(shù)據(jù)庫,不做任何防護(hù),都會(huì)有被sql注入的危險(xiǎn)。如果對(duì)客戶端和服務(wù)器端進(jìn)行相應(yīng)設(shè)置便可以起到防止sql注入的作用。比如:對(duì)用戶數(shù)據(jù)進(jìn)行過濾(a選項(xiàng))、對(duì)數(shù)據(jù)庫用戶訪問權(quán)限以及對(duì)信息加密(b選項(xiàng)、c選項(xiàng))等。另外在編程時(shí)避免程序漏洞也可防止一部分sql注入。sql注入的固斤穿念怕息愿雨單一部分功能就是為了竊取數(shù)據(jù)庫登錄信息等,另外可利用登錄信息進(jìn)行sql語句拼接達(dá)到注入的目的,所以對(duì)賬號(hào)加密處理對(duì)防止sql注入起到了一定的作用。
c#.net全站防止SQL注入類的代碼,需要的朋友可以參考一下
閑言碎語先不談,上代碼,
我這個(gè)是在Web項(xiàng)目,第一先創(chuàng)建SqlChecker類,用于校驗(yàn)前端傳到后臺(tái)所有請(qǐng)求中的過濾
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace Web
{
public class SqlChecker
{
//當(dāng)前請(qǐng)求對(duì)象
private HttpRequest request;
//當(dāng)前響應(yīng)對(duì)象
private HttpResponse response;
//安全Url,當(dāng)出現(xiàn)Sql注入時(shí),將導(dǎo)向到的安全頁面,如果沒賦值,則停留在當(dāng)前頁面
private string safeUrl = String.Empty;
//Sql注入時(shí),可能出現(xiàn)的sql關(guān)鍵字,可根據(jù)自己的實(shí)際情況進(jìn)行初始化,每個(gè)關(guān)鍵字由'|'分隔開來
//private const string StrKeyWord = @"select|insert|delete|from|count(|drop table|update|truncate|asc(|mid(|char(|xp_cmdshell|exec master|netlocalgroup administrators|:|net user|""|or|and";
private const string StrKeyWord = @"select|insert|delete|from|drop table|update|truncate|exec master|netlocalgroup administrators|:|net user|or|and";
//Sql注入時(shí),可能出現(xiàn)的特殊符號(hào),,可根據(jù)自己的實(shí)際情況進(jìn)行初始化,每個(gè)符號(hào)由'|'分隔開來
private const string StrRegex = @"-|;|,|/|(|)|[|]|}|{|%|@|*|!|'";
//private const string StrRegex = @"=|!|'";
public SqlChecker()
{
//
// TODO: 在此處添加構(gòu)造函數(shù)邏輯
//
}
/// <summary>
/// 由此構(gòu)造函數(shù)創(chuàng)建的對(duì)象,在驗(yàn)證Sql注入之后將停留在原來頁面上
/// </summary>
/// <param name="_request">當(dāng)前請(qǐng)求的 Request 對(duì)象</param>
/// <param name="_response">當(dāng)前請(qǐng)求的 Response 對(duì)象</param>
public SqlChecker(HttpRequest _request, HttpResponse _response)
{
this.request = _request;
this.response = _response;
}
/// <summary>
/// 由此構(gòu)造函數(shù)創(chuàng)建的對(duì)象,在驗(yàn)證Sql注入之后將請(qǐng)求將導(dǎo)向由 _safeUrl 指定的安全url頁面上
/// </summary>
/// <param name="_request">當(dāng)前請(qǐng)求的 Request 對(duì)象</param>
/// <param name="_response">當(dāng)前請(qǐng)求的 Response 對(duì)象</param>
/// <param name="_safeUrl">驗(yàn)證Sql注入之后將導(dǎo)向的安全 url</param>
public SqlChecker(HttpRequest _request, HttpResponse _response, string _safeUrl)
{
this.request = _request;
this.response = _response;
this.safeUrl = _safeUrl;
}
/// <summary>
/// 只讀屬性 SQL關(guān)鍵字
/// </summary>
public string KeyWord
{
get
{
return StrKeyWord;
}
}
/// <summary>
/// 只讀屬性過濾特殊字符
/// </summary>
public string RegexString
{
get
{
return StrRegex;
}
}
/// <summary>
/// 當(dāng)出現(xiàn)Sql注入時(shí)需要提示的錯(cuò)誤信息(主要是運(yùn)行一些客戶端的腳本)
/// </summary>
public string Msg
{
get
{
string msg = "<script type='text/javascript'> "
+ " alert('請(qǐng)勿輸入非法字符!'); ";
if (this.safeUrl == String.Empty)
msg += " window.location.href = '" + request.RawUrl + "'";
else
msg += " window.location.href = '" + safeUrl + "'";
msg += "</script>";
return msg;
}
}
/// <summary>
/// 檢查URL參數(shù)中是否帶有SQL注入的可能關(guān)鍵字。
/// </summary>
/// <returns>存在SQL注入關(guān)鍵字時(shí)返回 true,否則返回 false</returns>
public bool CheckRequestQuery()
{
bool result = false;
if (request.QueryString.Count != 0)
{
//若URL中參數(shù)存在,則逐個(gè)檢驗(yàn)參數(shù)。
foreach (string queryName in this.request.QueryString)
{
//過慮一些特殊的請(qǐng)求狀態(tài)值,主要是一些有關(guān)頁面視圖狀態(tài)的參數(shù)
if (queryName == "__VIEWSTATE" || queryName == "__EVENTVALIDATION")
continue;
//開始檢查請(qǐng)求參數(shù)值是否合法
if (CheckKeyWord(request.QueryString[queryName]))
{
//只要存在一個(gè)可能出現(xiàn)Sql注入的參數(shù),則直接退出
result = true;
break;
}
}
}
return result;
}
/// <summary>
/// 檢查提交表單中是否存在SQL注入的可能關(guān)鍵字
/// </summary>
/// <returns>存在SQL注入關(guān)鍵字時(shí)返回 true,否則返回 false</returns>
public bool CheckRequestForm()
{
bool result = false;
if (request.Form.Count > 0)
{
//若獲取提交的表單項(xiàng)個(gè)數(shù)不為0,則逐個(gè)比較參數(shù)
foreach (string queryName in this.request.Form)
{
//過慮一些特殊的請(qǐng)求狀態(tài)值,主要是一些有關(guān)頁面視圖狀態(tài)的參數(shù)
if (queryName == "__VIEWSTATE" || queryName == "__EVENTVALIDATION")
continue;
//開始檢查提交的表單參數(shù)值是否合法
if (CheckKeyWord(request.Form[queryName]))
{
//只要存在一個(gè)可能出現(xiàn)Sql注入的參數(shù),則直接退出
result = true;
break;
}
}
}
return result;
}
/// <summary>
/// 檢查_sword是否包涵SQL關(guān)鍵字
/// </summary>
/// <param name="_sWord">需要檢查的字符串</param>
/// <returns>存在SQL注入關(guān)鍵字時(shí)返回 true,否則返回 false</returns>
public bool CheckKeyWord(string _sWord)
{
bool result = false;
//模式1 : 對(duì)應(yīng)Sql注入的可能關(guān)鍵字
string[] patten1 = StrKeyWord.Split('|');
//模式2 : 對(duì)應(yīng)Sql注入的可能特殊符號(hào)
string[] patten2 = StrRegex.Split('|');
//開始檢查 模式1:Sql注入的可能關(guān)鍵字 的注入情況
foreach (string sqlKey in patten1)
{
if (_sWord.IndexOf(" " + sqlKey) >= 0 || _sWord.IndexOf(sqlKey + " ") >= 0)
{
//只要存在一個(gè)可能出現(xiàn)Sql注入的參數(shù),則直接退出
result = true;
break;
}
}
//開始檢查 模式1:Sql注入的可能特殊符號(hào) 的注入情況
foreach (string sqlKey in patten2)
{
if (_sWord.IndexOf(sqlKey) >= 0)
{
//只要存在一個(gè)可能出現(xiàn)Sql注入的參數(shù),則直接退出
result = true;
break;
}
}
return result;
}
/// <summary>
/// 執(zhí)行Sql注入驗(yàn)證
/// </summary>
public void Check()
{
if (CheckRequestQuery() || CheckRequestForm())
{
response.Write(Msg);
response.End();
}
}
}
}
創(chuàng)建好SqlChecker后,就要考慮在那個(gè)地方使用。SqlChecker SqlChecker = new SqlChecker(this.Request, this.Response);
//或 SqlChecker SqlChecker = new SqlChecker(this.Request,this.Response,safeUrl);
SqlChecker.Check();
以上就是C#.net防止SQL注入的代碼,如果有些關(guān)鍵字和特殊符號(hào)不想加在過濾中可以自定義SqlChecker類的StrKeyWord變量和StrRegex變量
拓展知識(shí):
防止sql注入
以下是OMG我為大家收集整理的文章,希望對(duì)大家有所幫助。
SQL注入(SQLInjection)漏洞攻擊是目前網(wǎng)上最流行最熱門的黑客腳本攻擊方法之一,那什么是SQL注入漏洞攻擊呢?它是指黑客利用一些Web應(yīng)用程序(如:網(wǎng)站、論壇、留言本、文章發(fā)布系統(tǒng)等)中某些存在不安全代碼或SQL語句不縝密的頁面,精心構(gòu)造SQL語句,把非法的SQL語句指令轉(zhuǎn)譯到系統(tǒng)實(shí)際SQL語句中并執(zhí)行它,以獲取用戶名、口令等敏感信息,從而達(dá)到控制主機(jī)服務(wù)器的攻擊方法。
1. SQL注入漏洞攻擊原理
1. 1 SQL注入漏洞攻擊實(shí)現(xiàn)原理
SQL(Structured Query Language)是一種用來和數(shù)據(jù)庫交互的語言文本。SQL注入的攻擊原理就是攻擊者通過Web應(yīng)用程序利用SQL語句或字符串將非法的數(shù)據(jù)插入到服務(wù)器端數(shù)據(jù)庫中,獲取數(shù)據(jù)庫的管理用戶權(quán)限,第二將數(shù)據(jù)庫管理用戶權(quán)限提升至**作系統(tǒng)管理用戶權(quán)限,控制服務(wù)器**作系統(tǒng),獲取重要信息及機(jī)密文件。
SQL注入漏洞攻擊主要是通過借助于HDSI、NBSI和Domain等SQL注入漏洞掃描工具掃描出Web頁面中存在的SQL注入漏洞,從而**SQL注入點(diǎn),通過執(zhí)行非法的SQL語句或字符串達(dá)到入侵者想要的**作。下面以一段身份驗(yàn)證的.NET代碼為例,說明一下SQL 注入攻擊的實(shí)現(xiàn)方法。
SqlConnectionnwConn = new SqlConnection((string)ConfigurationSettings.AppSettings["DBconnStrings"]); string queryStr = "SELECT userid,userpwd, username,type FROM users where userid='" + Txtusername.Text +"'";
DataSet userSet = new DataSet();
SqlDataAdapter userAdapter = newSqlDataAdapter(queryStr, nwConn);
userAdapter.Fill(userSet, "Users");
Session["UserID"] =Txtusername.Text.ToString();
Session["type"] =type.Text.ToString();
Response.Redirect("/Myweb/admin/login.aspx");
從上面的代碼中可以看出,程序在與數(shù)據(jù)庫建立連接得到用戶數(shù)據(jù)之后,直接將username的值通過session傳給login.aspx,沒有進(jìn)行任何的過濾和處理措施, 直接用來構(gòu)造SQL 語句, 其危險(xiǎn)系數(shù)是非常高的, 攻擊者只要根據(jù)SQL 語句的編寫規(guī)則就可以繞過身份驗(yàn)證,從而達(dá)到入侵的目的。
1. 2 SQL注入漏洞攻擊分析
SQL注入可以說是一種漏洞,也可以說是一種攻擊。當(dāng)程序中的變量處理不當(dāng),沒有對(duì)用戶提交的數(shù)據(jù)類型進(jìn)行校驗(yàn),編寫不安全的代碼,構(gòu)造非法的SQL語句或字符串,都可能產(chǎn)生這個(gè)漏洞。
例如Web系統(tǒng)有一個(gè)login頁面,這個(gè)login頁面控制著用戶是否有權(quán)訪問,要求用戶輸入一個(gè)用戶名和口令,連接數(shù)據(jù)庫的語句為:
“select * from users where username = 'username' andpassword = 'password'”
攻擊者輸入用戶名為aa or 1=1口令為1234 or 1=1之類的內(nèi)容。我們可以看出實(shí)際上攻擊者并不知道真正的用戶名、口令,該內(nèi)容提交給服務(wù)器之后,服務(wù)器執(zhí)行攻擊者構(gòu)造出的SQL命令,但由于攻擊者輸入的內(nèi)容非常特殊,所以最后得到的SQL命令變成:
“select * from users where username = 'aa' or 1=1 andpassword = '1234' or 1=1”
服務(wù)器執(zhí)行查詢或存儲(chǔ)過程,將用戶輸入的身份信息和數(shù)據(jù)庫users表中真實(shí)的身份信息進(jìn)行核對(duì),由于SQL命令實(shí)際上已被修改,存在永遠(yuǎn)成立的1=1條件,因此已經(jīng)不能真正驗(yàn)證用戶身份,所以系統(tǒng)會(huì)錯(cuò)誤地授權(quán)攻擊者訪問。
SQL 注入是通過目標(biāo)服務(wù)器的80端口進(jìn)行的,是正常的Web訪問,防火墻不會(huì)對(duì)這種攻擊發(fā)出警告或攔截。當(dāng)Web服務(wù)器以普通用戶的身份訪問數(shù)據(jù)庫時(shí),利用SQL注入漏洞就可能進(jìn)行創(chuàng)建、刪除、修改數(shù)據(jù)庫中所有數(shù)據(jù)的非法**作。而當(dāng)數(shù)據(jù)庫以管理用戶權(quán)限的身份進(jìn)行登錄時(shí),就可能控制整個(gè)數(shù)據(jù)庫服務(wù)器。
SQL注入的方法很多,在以手動(dòng)方式進(jìn)行攻擊時(shí)需要構(gòu)造各種各樣的SQL語句,所以一般攻擊者需要豐富的經(jīng)驗(yàn)和耐心,才能繞過檢測(cè)和處理,提交語句,從而獲得想要的有用信息。這個(gè)過程需要花費(fèi)很多的時(shí)間,如果以這種手動(dòng)方式進(jìn)行SQL注入漏洞攻擊,許多存在SQL注入漏洞的ASP、JSP、PHP、JAVA等網(wǎng)站就會(huì)安全很多了,不是漏洞不存在了,而是手動(dòng)入侵者需要編程基礎(chǔ),但現(xiàn)在攻擊者可以利用一些現(xiàn)成的黑客工具來輔助SQL注入漏洞攻擊,加快入侵的速度,使SQL注入變得輕而易舉。
由于SQL注入漏洞攻擊利用的是通用的SQL語法,使得這種攻擊具有廣泛性。理論上說,對(duì)于所有基于SQL語言的數(shù)據(jù)庫管理系統(tǒng)都是有效的,包括MSSQLServer、Oracle、DB2、Sybase和MySQL等。當(dāng)然,各種系統(tǒng)自身的SQL擴(kuò)展功能會(huì)有所不同,因此最終的攻擊代碼可能不盡相同。
1. 3 SQL注入漏洞攻擊過程
(1)繞過身份驗(yàn)證
如一個(gè)login界面,需要輸入用戶名和口令,第二Post到另一個(gè)頁面,進(jìn)行身份驗(yàn)證,因此攻擊者只需在用戶名和口令的輸入框中都輸入aa or’1’=’1’的內(nèi)容,那么攻擊者就可以通過欺騙的驗(yàn)證方式而直接進(jìn)入下一個(gè)頁面,并擁有和正常登錄用戶一樣的全部特權(quán)。原因是什么呢? 我們比較一下正常用戶登錄和攻擊者登錄時(shí)的兩種SQL語句:
1)正常用戶(如用戶名為admin,口令為1234567) :
SQL= " selectfrom users where username = ’admin’and password= ’1234567’ ";
2)攻擊者(用戶名和口令都為aa or’1’=’1’) :
SQL= " select * from users where username='aa or’1’=’1’'and password = ' aa or’1’=’1’'";
可以看到由and連接的兩個(gè)條件都被一個(gè)永遠(yuǎn)成立的1=1所代替,執(zhí)行的結(jié)果為true,數(shù)據(jù)庫會(huì)認(rèn)為條件恒成立,會(huì)返回一個(gè)true,讓攻擊者以合法身份登錄進(jìn)入下一個(gè)頁面。
(2)執(zhí)行非法**作
如一個(gè)查詢頁面select1.asp? id=1,編程人員原本設(shè)計(jì)意圖是顯示id為1的查詢信息,而攻擊者利用程序中沒有對(duì)id內(nèi)容進(jìn)行檢查的機(jī)制,插入自己的代碼。
從select1.asp中摘錄一段關(guān)鍵代碼:
SQL= " select *from photo where photoid= 'id'";
可以看到,id沒有進(jìn)行任何的處理,直接構(gòu)成SQL語句并執(zhí)行,而攻擊者在知道該系統(tǒng)數(shù)據(jù)庫中表名及字段名的情況下,利用SQL語句特性(分號(hào)是將兩句SQL 語句分開的符號(hào)),直接向數(shù)據(jù)庫Tuser表中添加記錄:
select1.asp? id= 1;Insertinto Tuser (username,password,type) values ('hack','1234567','管理員'),第二攻擊者就可以直接用hack進(jìn)行登錄了。通過這樣的方法,攻擊者還可以對(duì)系統(tǒng)做任何的事情,包括添加、刪除、修改系統(tǒng)資源的**作。
(3)執(zhí)行系統(tǒng)命令
如果Web主機(jī)使用MSSQL數(shù)據(jù)庫管理系統(tǒng),那么攻擊者就可以用到xp_cmdshell這個(gè)擴(kuò)展存儲(chǔ)過程,xp_cmdshell是一個(gè)非常有用的擴(kuò)展存儲(chǔ)過程,用于執(zhí)行系統(tǒng)命令,比如dir、net等,攻擊者可以根據(jù)程序的不同,提交不同的語句:
execmaster.dbo.xp_cmdshell " dir "; exec master.dbo.xp_cmdshell" net user hack 1234567 /add ";
execmaster.dbo.xp_cmdshell " net localgroup administrators hack /add ";
這樣就可以向Web主機(jī)系統(tǒng)中成功添加了一個(gè)管理員帳戶。
2. SQL注入漏洞攻擊的檢測(cè)方式及方法
2. 1檢測(cè)方式
SQL注入漏洞攻擊檢測(cè)分為入侵前的檢測(cè)和入侵后的檢測(cè)。入侵前的檢測(cè),可以通過手工方式,也可以使用SQL注入漏洞掃描工具軟件。檢測(cè)的目的是為預(yù)防SQL注入漏洞攻擊,而對(duì)于SQL注入漏洞攻擊后的檢測(cè),主要是針對(duì)審計(jì)日志的查看,SQL注入漏洞攻擊成功后,會(huì)在Web Service和數(shù)據(jù)庫的審計(jì)日志中留下“痕跡”。
2. 2檢測(cè)方法
(1)動(dòng)態(tài)SQL檢查
動(dòng)態(tài)的SQL語句是一個(gè)進(jìn)行數(shù)據(jù)庫查詢的強(qiáng)大的工具,但把它和用戶輸入混合在一起就使SQL注入成為了可能。將動(dòng)態(tài)的SQL語句替換成預(yù)編譯的SQL或者存儲(chǔ)過程對(duì)大多數(shù)應(yīng)用程序是可行的。預(yù)編譯的SQL或者存儲(chǔ)過程可以將用戶的輸入作為參數(shù)而不是命令來執(zhí)行,這樣就限制了入侵者的行動(dòng)。當(dāng)然,它不適用于存儲(chǔ)過程中利用用戶輸入來生成SQL命令的情況。在這種情況下,用戶輸入的SQL命令仍可能得到執(zhí)行,數(shù)據(jù)庫仍然存在SQL注入漏洞攻擊的危險(xiǎn)。
(2)有效性校驗(yàn)
如果一個(gè)輸入框只可能包括數(shù)字,那么要通過驗(yàn)證確保用戶輸入的都是數(shù)字。如果可以接受字母,檢查是不是存在不可接受的字符,那就需要設(shè)置字符串檢查功能。確保應(yīng)用程序要檢查以下字符:分號(hào)、等號(hào)、破折號(hào)、括號(hào)以及SQL關(guān)鍵字。
(3)數(shù)據(jù)表檢查
使用SQL注入漏洞攻擊工具軟件進(jìn)行SQL注入漏洞攻擊后,都會(huì)在數(shù)據(jù)庫中生成一些臨時(shí)表。通過查看數(shù)據(jù)庫中最近新建的表的結(jié)構(gòu)和內(nèi)容,可以判斷是否曾經(jīng)發(fā)生過SQL注入漏洞攻擊。
(4)審計(jì)日志檢查
在Web服務(wù)器中如果啟用了審計(jì)日志功能,則Web Service審計(jì)日志會(huì)記錄訪問者的IP地址、訪問時(shí)間、訪問文件等信息,SQL注入漏洞攻擊往往會(huì)大量訪問某一個(gè)頁面文件(存在SQL注入點(diǎn)的動(dòng)態(tài)網(wǎng)頁),審計(jì)日志文件會(huì)急劇增加,通過查看審計(jì)日志文件的大小以及審計(jì)日志文件中的內(nèi)容,可以判斷是否發(fā)生過SQL注入漏洞攻擊**;另外還可以通過查看數(shù)據(jù)庫審計(jì)日志,查詢某個(gè)時(shí)間段是否有非法的插入、修改、刪除**作。
(5)其他
SQL注入漏洞攻擊成功后,入侵者往往會(huì)添加特權(quán)用戶(如:administrator、root、sa等)、開放非法的遠(yuǎn)程服務(wù)以及安裝木馬后門程序等,可以通過查看用戶帳戶列表、遠(yuǎn)程服務(wù)開啟情況、系統(tǒng)最近日期產(chǎn)生的一些文件等信息來判斷是否發(fā)生過入侵。
3. SQL注入漏洞防范措施
SQL注入漏洞攻擊的防范方法有很多種,現(xiàn)階段小編綜合來說起來有以下方法:
(1)數(shù)據(jù)有效性校驗(yàn)。如果一個(gè)輸入框只可能包括數(shù)字,那么要通過校驗(yàn)確保用戶輸入的都是數(shù)字。如果可以接受字母,那就要檢查是不是存在不可接受的字符,最好的方法是增加字符復(fù)雜度自動(dòng)驗(yàn)證功能。確保應(yīng)用程序要檢查以下字符:分號(hào)、等號(hào)、破折號(hào)、括號(hào)以及SQL關(guān)鍵字。另外限制表單數(shù)據(jù)輸入和查詢字符串輸入的長(zhǎng)度也是一個(gè)好方法。如果用戶的登錄名最多只有10個(gè)字符,那么不要認(rèn)可表單中輸入10個(gè)以上的字符,這將大大增加攻擊者在SQL命令中插入有害代碼的難度。
(2)封裝數(shù)據(jù)信息。對(duì)客戶端提交的數(shù)據(jù)進(jìn)行封裝,不要將數(shù)據(jù)直接存入cookie中,方法就是在編程的代碼中,插入session、if、try、else,這樣可以有效地防止攻擊者獲取cookie中的重要信息。
(3)去除代碼中的敏感信息。將在代碼中存在的用戶名、口令信息等敏感字段刪除,替換成輸入框。
SQL=" select from users where username = ’admin’and password= ’1234567’ "
如:這樣顯然會(huì)暴露管理員的用戶名、口令信息??梢詫⑵湫薷某桑?/p>
SQL= " select * from users where username='" +Txtuser.Text + "' and userpwd='" + Textpwd.Text + "'"
這樣就安全了很多,入侵者也是不會(huì)輕易的就獲取到用戶名、口令信息。
(4)替換或刪除單引號(hào)。使用雙引號(hào)替換掉所有用戶輸入的單引號(hào),這個(gè)簡(jiǎn)單的預(yù)防措施將在很大程度上預(yù)防SQL注入漏洞攻擊,單引號(hào)時(shí)常會(huì)無法約束插入數(shù)據(jù)的Value,可能給予輸入者不必要的權(quán)限。用雙引號(hào)替換掉單引號(hào)可以使大部分SQL注入漏洞攻擊失敗。 如:
“select* from users where username='" + admin + "' and userpwd='" + 1234567+ "'”
顯然會(huì)得到與
“select * from users where username='admin' and password= '1234567'”
相同的結(jié)果。
(5)指定錯(cuò)誤返回頁面。攻擊者有時(shí)從客戶端嘗試提交有害代碼和攻擊字符串,根據(jù)Web Service給出的錯(cuò)誤提示信息來收集程序及服務(wù)器的信息,從而獲取想得到的資料。應(yīng)在Web Service中指定一個(gè)不包含任何信息的錯(cuò)誤提示頁面。
(6)限制SQL字符串連接的配置文件。使用SQL變量,因?yàn)樽兞坎皇强梢詧?zhí)行的腳本,即在Web頁面中將連接數(shù)據(jù)庫的SQL字符串替換成指定的Value,第二將Web.config文件進(jìn)行加密,拒絕訪問。
(7)設(shè)置Web目錄的訪問權(quán)限。將虛擬站點(diǎn)的文件目錄禁止游客用戶(如:Guest用戶等)訪問,將User用戶權(quán)限修改成只讀權(quán)限,切勿將管理權(quán)限的用戶添加到訪問列表。
(8)最小服務(wù)原則。Web服務(wù)器應(yīng)以最小權(quán)限進(jìn)行配置,只提供Web服務(wù),這樣可以有效地阻止系統(tǒng)的危險(xiǎn)命令,如ftp、cmd、vbscript等。
(9)鑒別信息加密存儲(chǔ)。將保存在數(shù)據(jù)庫users表中的用戶名、口令信息以密文形式保存,也可以對(duì)users表進(jìn)行加密處理,這樣可以大大增加對(duì)鑒別信息訪問的安全級(jí)別。
(10)用戶權(quán)限分離。應(yīng)盡可能的禁止或刪除數(shù)據(jù)庫中sa權(quán)限用戶的訪問,對(duì)不同的數(shù)據(jù)庫劃分不同的用戶權(quán)限,這樣不同的用戶只能對(duì)授權(quán)給自己的數(shù)據(jù)庫執(zhí)行查詢、插入、更新、刪除**作,就可以防止不同用戶對(duì)非授權(quán)的數(shù)據(jù)庫進(jìn)行訪問。
4. 結(jié)束語
SQL注入漏洞攻擊在網(wǎng)上非常普遍,許多ASP、PHP論壇和文章管理系統(tǒng)、下載系統(tǒng)以及**系統(tǒng)都存在這個(gè)漏洞。造成SQL注入漏洞攻擊的主要原因是開發(fā)人員在系統(tǒng)開發(fā)的過程中編程不規(guī)范,沒有形成良好的編程習(xí)慣,問題的解決只有依賴于規(guī)范編程。此外,也可以使用現(xiàn)有的SQL注入漏洞掃描器對(duì)整個(gè)網(wǎng)站中的關(guān)鍵代碼進(jìn)行掃描,查找網(wǎng)站頁面中存在的SQL注入點(diǎn)。對(duì)于有問題的頁面,可以及時(shí)刪除或更新。本文通過對(duì)SQL注入漏洞攻擊的方法、原理以及攻擊實(shí)施過程進(jìn)行了闡述和小編綜合來說,并給出了一些常見的SQL注入漏洞攻擊防范的方法。
原創(chuàng)文章,作者:九賢生活小編,如若轉(zhuǎn)載,請(qǐng)注明出處:http://xiesong.cn/19994.html