當(dāng)前位置:
首頁 >
asp.net中防止攻击的方法
發(fā)布時(shí)間:2025/6/15
38
豆豆
生活随笔
收集整理的這篇文章主要介紹了
asp.net中防止攻击的方法
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
你應(yīng)該在程序中驗(yàn)證所有的不信任輸入.你應(yīng)該假定所有的用戶輸入都是非法的.用戶可以在應(yīng)用程序中提供表單字段,查詢字串,客戶端cookies和瀏覽器環(huán)境值比如用戶代理字串和IP地址等.
? 弱輸入校驗(yàn)通常為注入攻擊提供了機(jī)會.下面是常見的利用弱輸入校驗(yàn)或無輸入校驗(yàn)進(jìn)行攻擊的手段.
SQL 注入(SQL injection). 如果你使用用戶的輸入值來動態(tài)構(gòu)造SQL語句,那么數(shù)據(jù)庫可能執(zhí)行攻擊性的有害SQL語句.?
跨站腳本(Cross-site scripting). 跨站腳本攻擊利用網(wǎng)頁驗(yàn)證漏洞注入客戶端腳本.接下來這些代碼被發(fā)送到受信任的客戶端電腦上并被瀏覽器解釋執(zhí)行.因?yàn)檫@些代碼來自受信任的站點(diǎn),所以瀏覽器無法得知這些代碼是有害的.?
未授權(quán)的文件訪問(Unauthorized file access).如果你的代碼從調(diào)用者那里接受輸入,惡意用戶可以看到你對文件的操作過程從而訪問那些受保護(hù)的文件或者使用你的代碼注入非法數(shù)據(jù).?
? 注意 : 注入攻擊可通過使用HTTP或HTTPS Secure Socket Layer(SSL) 連接. 傳輸加密技術(shù)不能用來防御攻擊.
? 通常的輸入驗(yàn)證方法總結(jié)如下.你應(yīng)在所有的需要通過網(wǎng)絡(luò)輸入的地方進(jìn)行驗(yàn)證,比如文本框和其它表單輸入字段, 查詢字串參數(shù),cookies,服務(wù)器端變量和網(wǎng)絡(luò)方法參數(shù).注意,過濾策略應(yīng)該是只允許正確的輸入然后拒絕非法輸入.這是因?yàn)槎x正確的輸入策略比過濾所有的非法輸入要容易,那通常很難包括所有的非法輸入.
? 通入如下幾個(gè)方面驗(yàn)證輸入內(nèi)容:
約束.驗(yàn)證是否輸入的是正確的類型,字符長度,格式和范圍.可以應(yīng)用ASP.NET驗(yàn)證控件來約束服務(wù)器控件輸入.約束其它來源的輸入可以使用正則表達(dá)式和自定義的驗(yàn)證規(guī)則.?
拒絕.檢測已知的有害數(shù)據(jù)輸入并拒絕.?
過濾.有時(shí)候你會希望過濾掉用戶輸入中那些有安全隱患的那些部分.例如,你的程序允許自由格式的輸入,比如備注字段,你會允許特定的安全HTML標(biāo)記象<b>,<i>及其它的HTML標(biāo)記.?
? 步驟提要
? 通過以下步驟保護(hù)你的ASP.NET程序不受注入式攻擊危害 :
第一步.使用ASP.NET請求驗(yàn)證.?
第二步.約束輸入.?
第三步.對不安全的輸出進(jìn)行編碼.?
第四步.對SQL查詢語句使用命令參數(shù).?
第五步.驗(yàn)證ASP.NET的出錯(cuò)信息沒有泄漏至客戶端.?
? 下面的章節(jié)將對這些步驟進(jìn)行詳細(xì)討論.
? 第一步.使用ASP.NET請求驗(yàn)證.
? 默認(rèn)地,ASP.NET 1.1和2.0請求驗(yàn)證會對送至服務(wù)器的數(shù)據(jù)檢測是否含有HTML標(biāo)記元素和保留字符.這可以防止用戶向程序中輸入腳本.請求驗(yàn)證會對照一個(gè)有潛在威脅的字符串列表進(jìn)行匹配,如果發(fā)現(xiàn)異常它會拋出一個(gè)HttpRequestValidationException類型的異常.
? 你可以在你的web.config文件中的<pages>元素中加入validateRequest="false" 或在單獨(dú)的頁面的@Pages元素里面設(shè)置ValidateRequest = "false"來禁用此項(xiàng)功能.
? 如果你想禁用請求驗(yàn)證功能,你可以僅在需要的頁面禁用它.比如你在程序頁面上包含一個(gè)可接受HTML格式輸入的字段.
? 確定在Machine.config文件中請求驗(yàn)證功能被打開.
?
? 請求驗(yàn)證功能在ASP.NET中被默認(rèn)啟用.你可以在Machine.config.comments文件中看到如下的默認(rèn)設(shè)置.
<pages validateRequest = "true" ... />?
? 確認(rèn)你沒有修改你的服務(wù)器的Machine.config和應(yīng)用程序的Web.config文件里的默認(rèn)設(shè)置.
? 測試ASP.NET請求驗(yàn)證
? 你可以測試請求驗(yàn)證的作用.創(chuàng)建一個(gè)ASP.NET頁面通過設(shè)置ValidateRequest = "fasle"禁用請求驗(yàn)證,代碼如下 :?
<%@ Language="C#" ValidateRequest="false" %>
<html>
<script runat="server">
void btnSubmit_Click(Object sender, EventArgs e)
{
?
//
If ValidateRequest is false, then ’hello’ is displayed
?
//
If ValidateRequest is true, then ASP.NET returns an exception
Response.Write(txtString.Text);
}
</script>
<body>
<form id="form1" runat="server">
<asp:TextBox id="txtString" runat="server"?
Text="<script>alert(’hello’);</script>" />
<asp:Button id="btnSubmit" runat="server" OnClick="btnSubmit_Click"?
Text="Submit" />
</form>
</body>
</html>
? 當(dāng)你運(yùn)行頁面的時(shí)候,"Hello"被顯示在一個(gè)消息框中,因?yàn)樵趖xtString中的腳本被執(zhí)行并被客戶端的瀏覽器處理.
? 如果你設(shè)置ValidateRequest = "true" 或者移除ValidateRequest頁面屬性,ASP.NET請求驗(yàn)證會拒絕腳本輸入并拋出一個(gè)象下面這樣的錯(cuò)誤信息.
? A potentially dangerous Request.Form value was detected from the client (txtString="<script>alert(’hello").
? 注意 不要僅僅依賴請求驗(yàn)證功能,而只是把它作為自定驗(yàn)證的輔導(dǎo)手段.
第二步.約束輸入
? 要約束輸入通過如下方法 :
使用服務(wù)器端的輸入驗(yàn)證.不要依賴于客戶端的驗(yàn)證,因?yàn)樗苋菀拙捅焕@過.使用客戶端驗(yàn)證是為了減少頁面返住次數(shù)提升性能,改進(jìn)用戶體驗(yàn).?
驗(yàn)證輸入的長度,范圍,格式和類型.確保輸入內(nèi)容是符合要求的正確內(nèi)容.?
使用強(qiáng)數(shù)據(jù)類型.為數(shù)字類型的輸入指定如Integer或者Double的類型.為字符輸入指定為String數(shù)據(jù)類型.為日期時(shí)間輸入指定DateTime類型.?
? 要驗(yàn)證表單里面的HTML控件輸入字段,在服務(wù)器端代碼中進(jìn)行驗(yàn)證,使用Regex正則表達(dá)式類型可以幫助約束字符輸入.下面的章節(jié)介紹如何約束普通輸入類型的變量.
? 驗(yàn)證字符串字段
要驗(yàn)證字符串字段,如姓名,地址,傳真,生份證號碼,使用正則表達(dá)式.?
約束可接受的字符范圍.?
啟動格式規(guī)則.例如,基于模式的字段如稅號,郵編,郵遞區(qū)號需要規(guī)定的字符模式.?
驗(yàn)證長度.?
? 使用正則表達(dá)式驗(yàn)證控件(RegularExpresionValidator)
? 要使用則表達(dá)式驗(yàn)證控件需要設(shè)置待驗(yàn)證的控件名(ControlToValidate),驗(yàn)證表達(dá)式(ValidationExpression)和出錯(cuò)提示(ErrorMessage).相關(guān)的屬性設(shè)置請看下面的代碼示例.
<form id="WebForm" method="post" runat="server">
<asp:TextBox id="txtName" runat="server"></asp:TextBox>
<asp:RegularExpressionValidator id="nameRegex" runat="server"?
ControlToValidate="txtName"?
ValidationExpression="^[a-zA-Z’./s]{1,40}$"?
ErrorMessage="Invalid name">
</asp:regularexpressionvalidator>
</form>
? 在上面的代碼中,正則表達(dá)式被用于限定輸入的名字為字母(允許大寫字母和小寫字母),空格,單名省略號象O’Dell和句點(diǎn).此外,輸入的字符長度被限定在40個(gè)字符.
? 注意 正則表達(dá)式驗(yàn)證控件(RegularExpressionValidator)會自動加入脫字符(^)和美元符號($)作為開始和結(jié)束的分隔符.如果你沒有在自定義的表達(dá)式中加入他們那么最好加入.加入分隔符只是為了讓你的表達(dá)式得到想要的那部分?jǐn)?shù)據(jù)內(nèi)容.
? 使用正則表達(dá)式類(Regex Class)
? 如果你沒有使用服務(wù)器端的控件(意味著你不能使用驗(yàn)證控件),或者你需要其它的輸入字段源而非表單字段(比如查詢字串參數(shù)和cookies),那么你可以使用正則表達(dá)式類(Regex class).
? 使用正則表達(dá)式類
加入使用using前綴的語句導(dǎo)入System.Text.RegularExpressions命名空間.?
確認(rèn)正則表達(dá)式包含"^"和"$"(字串開始處,字串結(jié)束處).?
調(diào)用Regex類的IsMatch方法,下面是代碼示例.?
//
Instance method:
Regex reg = new Regex(@"^[a-zA-Z’./s]{1,40}$");
Response.Write(reg.IsMatch(txtName.Text));
//
Static method:
if (!Regex.IsMatch(txtName.Text,@"^[a-zA-Z’./s]{1,40}$"))?
{
?
//
Name does not match expression
}
? 如果你不能把經(jīng)常使用的正則表達(dá)式緩存起來,你應(yīng)該使用IsMatch靜態(tài)方法來改進(jìn)性能防止不必要的對象創(chuàng)建過程.
? 驗(yàn)證數(shù)字字段
? 在大多數(shù)情況下,應(yīng)該驗(yàn)證數(shù)字的輸入和范圍.使用服務(wù)器控件驗(yàn)證數(shù)字字段的輸入和范圍,使用RangeValidator控件.RangeValidator支持貨幣,日期,整型,雙精度和字符串類型的數(shù)據(jù).
? 使用RangeValidator控件需要設(shè)置需要驗(yàn)證的控件名(ControlToValidate),類型(Type),最小值(MinimumValue),最大值(MaximumValue),和出錯(cuò)提示信息(ErrorMessage)屬性.下面是代碼示例 :?
<asp:RangeValidator?
ID="RangeValidator1"?
Runat="server"?
ErrorMessage="Invalid range. Number must be between 0 and 255."
ControlToValidate="rangeInput"?
MaximumValue="255"?
MinimumValue="0" Type="Integer" />
? 如果你沒使用服務(wù)器控件,你可以將輸入值轉(zhuǎn)化成整型再進(jìn)行驗(yàn)證來完成對數(shù)字的范圍驗(yàn)證.例如,要驗(yàn)證一個(gè)整數(shù)是否合法,使用ASP.NET2.0提供的新方法Int32.TryParse將輸入值轉(zhuǎn)化為System.Int32的變量類型.這個(gè)方法會在轉(zhuǎn)換失敗時(shí)返回false.
Int32 i;
if (Int32.TryParse(txtInput.Text, out i) == false)
{
?
//
Conversion failed
}
? 如果你使用早先的ASP.NET版本,可以在try/catch語句塊中 使用Int32.Parse或者Convert.ToInt32方法并可以在轉(zhuǎn)換失敗時(shí)處理拋出的FormatException錯(cuò)誤.
? 下面的示例代碼演示了如何驗(yàn)證來自HTML文本框的整數(shù)類型的類型和范圍.
<%@ Page Language="C#" %>
<script runat="server">
void Page_Load(object sender, EventArgs e)
?
{
if (Request.RequestType == "POST")
?
{
int i;
if (Int32.TryParse(Request.F
orm["integerTxt"], out i) == true)
?
{
?
//
TryParse returns true if the conversion succeeds
if ((0 <= i && i <= 255) == true)
?
{
Response.Write("Input data is valid.");
}
else
Response.Write("Input data is out of range");
}
else
Response.Write("Input data is not an integer");
}
}
?
</script>
<html>
<body>
<form id="form1" action="NumericInput.aspx" method="post">
<div>
Enter an integer between 0 and 255:
<input name="integerTxt" type="text" />
<input name="Submit" type="submit" value="submit" />
</div>
</form>
</body>
</html>
驗(yàn)證日期字段
? 你需要驗(yàn)證日期字段是否是正確的類型.在大多數(shù)情況下,你也需要驗(yàn)證它們的范圍,如驗(yàn)證它們是否是將來或是過去的時(shí)間.如果你使用服務(wù)器控件來捕獲一個(gè)日期輸入值,同時(shí)你希望這個(gè)值在一個(gè)特定的范圍內(nèi),你可以使用范圍驗(yàn)證控件(RangeValidator)并設(shè)置它允許的類型為Date類型.這個(gè)控件允許你指定一個(gè)特殊的時(shí)間段通過設(shè)置起始的時(shí)刻.如果你需要以今天的時(shí)間作為參照來驗(yàn)證,比如驗(yàn)證一個(gè)時(shí)間是在將來還是過去,你可以使用CustomValidator驗(yàn)證控件。
? 使用CustomValidator控件來驗(yàn)證一個(gè)日期需要設(shè)置ControlToValidate和ErrorMessage屬性,在OnServerValidate事件中指定一個(gè)自定義的驗(yàn)證邏輯方法.下面是示例代碼.
<%@ Page Language="C#" %>
<script runat="server">
void ValidateDateInFuture(object source, ServerValidateEventArgs args)
?
{
DateTime dt;
?
//
Check for valid date and that the date is in the future
if ((DateTime.TryParse(args.Value, out dt) == false) ||?
(dt <= DateTime.Today))
?
{
args.IsValid = false;
}
}
</script>
<html>
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="Label1" Runat="server"?
Text="Future Date:"></asp:Label>
<asp:TextBox ID="futureDatetxt" Runat="server"></asp:TextBox>
<asp:CustomValidator?
ID="CustomValidator1" Runat="server"?
ErrorMessage="Invalid date. Enter a date in the future."
ControlToValidate="futureDatetxt"?
OnServerValidate="ValidateDateInFuture">
</asp:CustomValidator>
<br />
<asp:Button ID="submitBtn" Runat="server" Text="Submit" />
</div>
</form>
</body>
</html>
? 注意 上面的代碼使用的方法DateTime.TryParse是ASP.NET2.0提供的新方法.
? 過濾自由文本字段
? 過濾輸入,你需要使不安全的輸入不被當(dāng)作代碼來對待.例如,你的程序使用戶不能讀取共享數(shù)據(jù)庫內(nèi)的數(shù)據(jù),你首先需要過濾數(shù)據(jù)使它們在輸出的時(shí)候沒有危險(xiǎn).使用HttpUtility.HtmlEncode方法先對輸入值進(jìn)行編碼.
? 允許有限的輸入HTML代碼
在@ Page頁面元素內(nèi)加以下字段ValidateRequest = "false"禁用ASP.NET請求驗(yàn)證?
使用HtmlEncode方法對輸入的字符串進(jìn)行編碼?
使用StringBuilder對象,調(diào)用它的Replace方法對字符中的HTML進(jìn)行替換?
? 下面的代碼給出了這種辦法的示例.此頁面設(shè)置ValidateRequest = "fasle"禁用了ASP.NET請求驗(yàn)證.它的HTML編碼為了顯示簡單的文本格式允許使用<b>和<i>標(biāo)記.
<%@ Page Language="C#" ValidateRequest="false"%>
<script runat="server">
void submitBtn_Click(object sender, EventArgs e)
?
{
?
//
Encode the string input
StringBuilder sb = new StringBuilder(
HttpUtility.HtmlEncode(htmlInputTxt.Text));
?
//
Selectively allow and <i>
sb.Replace("<b>", "<b>");
sb.Replace("</b>", "");
sb.Replace("<i>", "<i>");
sb.Replace("</i>", "");
Response.Write(sb.ToString());
}
</script>
<html>
<body>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="htmlInputTxt" Runat="server"?
TextMode="MultiLine" Width="318px"
Height="168px"></asp:TextBox>
<asp:Button ID="submitBtn" Runat="server"?
Text="Submit" OnClick="submitBtn_Click" />
</div>
</form>
</body>
</html>
? 驗(yàn)證查詢字串的值?
? 驗(yàn)證查詢字串的長度,范圍,格式和類型.通常,你使用一個(gè)合并的正則表達(dá)式來完成以下任務(wù):?
約束輸入值?
設(shè)置明確的范圍檢查條件?
指定輸入的類型并將它轉(zhuǎn)換成ASP.NET平臺下的類型,處理任何由類型轉(zhuǎn)換引發(fā)的異常下面的代碼示例演示了使用Regex類驗(yàn)證由查詢字串傳遞過來的名字字符串?
void Page_Load(object sender, EventArgs e)
{
if (!System.Text.RegularExpressions.Regex.IsMatch(
Request.QueryString["Name"], @"^[a-zA-Z’./s]{1,40}$"))
Response.Write("Invalid name parameter");
else
Response.Write("Name is " + Request.QueryString["Name"]);
}
? 驗(yàn)證Cookie值
? 象查詢字串這樣被保存在Cookie里面的值很容易被用戶修改.同樣地驗(yàn)證這些值的長度,范圍,格式和類型.
驗(yàn)證文件和URL地址
? 如果你的程序允許輸入文件名,文件地址或者文件存放路徑,你需要驗(yàn)證它們的格式是否正確并且根據(jù)你的程序?qū)嶋H情況它指向一個(gè)有效的位置.如果此步驗(yàn)證失敗,你的程序可能會被錯(cuò)誤地要求訪問文件.
? 驗(yàn)證文件路徑
? 為了避免你的程序被用戶利用來訪問文件,防止接受用戶編寫代碼輸入的文件或者文件路徑.例如 :?
如果你接受輸入文件名,使用System.IO.Path.GetFileName方法來取得文件的全稱?
如果你不得不接受輸入文件路徑,使用System.IO.Path.GetFullPath來取得完整的文件路徑?
? 使用MapPath方法防止跨應(yīng)用程序的映射?
? 如果你使用MapPath方法在服務(wù)器上映射一個(gè)提供的虛擬目錄到一個(gè)物理目錄,使用Request.MapPath方法的一個(gè)帶bool參數(shù)的重載版本來防止跨應(yīng)用程序的映射.下面是此項(xiàng)技術(shù)的示例代碼 :
try
{
string mappedPath = Request.MapPath( inputPath.Text,?
Request.ApplicationPath, false);
}
catch (HttpException)
{
?
//
Cross-application mapping attempted
}
? 最終的false參數(shù)將會防止跨應(yīng)用程序的映射.這意味著用戶不允許使用”..”這樣的語法提供一個(gè)不在你所指定的虛擬目錄里面的非法路徑.
? 如果你使用服務(wù)器控件,你可以使用Control.MapPathSecure方法獲取虛擬目錄對應(yīng)的實(shí)際目錄地址.
? Control.MapPathSecure方法在訪問一個(gè)非授權(quán)的文件時(shí)拋出一個(gè)HttpException的異常.需要更多信息,請參看.NET Framework文檔中的Control.MapPathSecure方法介紹.
? 使用代碼訪問安全機(jī)制限制文件輸入輸出
? 管理員可以通過設(shè)置程序使它的可信度為”中”來限制程序向它所在的虛擬目錄讀寫文件的能力..NET代碼安全機(jī)制可以保證程序在它所在的虛擬目錄之外沒有任何的文件訪問權(quán)利.
? 要設(shè)置一個(gè)應(yīng)用程序的信任度為"中",可以在Web.config或者M(jìn)achine.config文件中加入:
<trust level = "Medium" />
? 驗(yàn)證URL
? 你可以用象下面的這樣的正則表達(dá)式來對URL進(jìn)行特征匹配.
^(?:http|https|ftp)://[a-zA-Z0-9/./-]+(?:/:/d{1,5})?(?:[A-Za-z0-9/./;/:/@/&/=/+/$/,/?/]|%u[0-9A-Fa-f]{4}|%[0-9A-Fa-f]{2})*$
? 這只是約束輸入的格式,不驗(yàn)證它是否在應(yīng)用程序可接受的范圍內(nèi).你應(yīng)該驗(yàn)證它是否在你的程序的上下文中有效.例如,您的應(yīng)用程序是否跟你指定的服務(wù)器進(jìn)行通訊?
? 第三步.對不安全代碼進(jìn)行編碼
? 如果您輸入文本輸入到一個(gè)網(wǎng)頁,使用HttpUtility.HtmlEncode方法對它進(jìn)行編碼.如果這些文來自于用戶輸入,數(shù)據(jù)庫或者一個(gè)本地文件,請確保總是這樣做.
? 同樣地,如果您書寫的URL里面包含不安全的字符因?yàn)樗麄儊碜杂谟脩糨斎雰?nèi)容,數(shù)據(jù)庫等,使用HttpUtility.UrlEncode方法進(jìn)行編碼.
? 為了防止存儲數(shù)據(jù)前編碼可能會使存儲的數(shù)據(jù)受到破壞,請確保在將它們顯示出來時(shí)盡可能后面的步驟將它們編碼.
? 使用HtmlEncode對不安全的輸出編碼
? HtmlEncode對HTML標(biāo)記置換成特殊含文的字符串來表示這些符號而又讓瀏覽器不把它們當(dāng)作HTML標(biāo)記來解釋處理.比如."<"被置換成< " (冒號) 被替換成" 這些標(biāo)記被顯示成無害的文本.
<%@ Page Language="C#" ValidateRequest="false" %>
<script runat="server">
void submitBtn_Click(object sender, EventArgs e)
{
Response.Write(HttpUtility.HtmlEncode(inputTxt.Text));
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<body>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="inputTxt" Runat="server"?
TextMode="MultiLine" Width="382px" Height="152px">
</asp:TextBox>
<asp:Button ID="submitBtn" Runat="server" Text="Submit"?
OnClick="submitBtn_Click" />
</div>
</form>
</body>
</html>
? 查看HTML編碼的效果,請建立一個(gè)虛擬目錄將前述的文件放進(jìn)去,運(yùn)行此頁面,在文本框中輸入一些HTML代碼,點(diǎn)擊提交按鈕.例如,下面的輸入被當(dāng)作普通文本來顯示.
Run script and say hello <script>alert(’hello’);</script>?
? 如果你移除調(diào)用HtmlEncode方法,簡單地輸入文本的內(nèi)容,瀏覽器會執(zhí)行代碼并彈出一個(gè)提示框.
? 使用UrlEncode 方法對不安全的URL地址進(jìn)行編碼
? 如果你需要獲取有用戶輸入部分的URL參數(shù),這可能帶來一定的安全風(fēng)險(xiǎn),使用HttpUtility.UrlEncode方法對這個(gè)地址字符串編碼.
HttpUtility.UrlEncode(urlString);
? 第四步.對SQL語句使用命令參數(shù)方式.
? 為了避免注入式攻擊請使用SQL的參數(shù)方式.參數(shù)(Parameters)集合提供類型檢測和長度檢測.如果你使用參數(shù)集合,輸入的內(nèi)容將被當(dāng)作文本值來對待,數(shù)據(jù)庫不會執(zhí)行包含在其中的代碼.使用參數(shù)集方式的一個(gè)額外的好處是,你可以嚴(yán)格限定輸入的類型和長度.如果輸入型超出范圍將會觸發(fā)異常.
? 當(dāng)調(diào)用一個(gè)存儲過程時(shí)使用參數(shù)集
? 下面的代碼片段演示了在調(diào)用存儲過程時(shí)使用參數(shù)集的例子.
SqlDataAdapter myCommand = new SqlDataAdapter("AuthorLogin",?
myConnection);
myCommand.SelectCommand.CommandType = CommandType.StoredProcedure;
SqlParameter parm = myCommand.SelectCommand.Parameters.Add(
"@LoginId", SqlDbType.VarChar, 11);
parm.Value = Login.Text;
? 在創(chuàng)建你自己的SQL語句時(shí)使用參數(shù)集.
? 如果你不能使用存儲過程,你仍然可以使用參數(shù)集,請看下面的代碼.
SqlDataAdapter myCommand = new SqlDataAdapter(
"SELECT au_lname, au_fname FROM Authors WHERE au_id = @au_id", myConnection);
SQLParameter parm = myCommand.SelectCommand.Parameters.Add(
"@au_id" ,SqlDbType.VarChar, 11);
Parm.Value = Login.Text;
? 如果需要獲取更多的如果防止SQL注入攻擊的信息請參看How to : Protect From SQL Injection in ASP.NET
? 第五步.驗(yàn)證ASP.NET的錯(cuò)誤信息沒有被返回到客戶端
? 你可以使用<customErrors>元素來配置客戶端,一般的錯(cuò)誤信息應(yīng)該被程序錯(cuò)誤檢測機(jī)制返回到客戶端.
? 請確認(rèn)已經(jīng)更改web.config中的mode屬性為"remoteOnly",下面是示例.
<customErrors mode = "remoteOnly">
? 安在裝了一個(gè)ASP.NET 的程序之后,你可以按照如下設(shè)定指定客戶端的錯(cuò)誤信息頁面。
<customErrors mode = "on" defaultRedirect = "YourErrorPage.htm">
? 弱輸入校驗(yàn)通常為注入攻擊提供了機(jī)會.下面是常見的利用弱輸入校驗(yàn)或無輸入校驗(yàn)進(jìn)行攻擊的手段.
SQL 注入(SQL injection). 如果你使用用戶的輸入值來動態(tài)構(gòu)造SQL語句,那么數(shù)據(jù)庫可能執(zhí)行攻擊性的有害SQL語句.?
跨站腳本(Cross-site scripting). 跨站腳本攻擊利用網(wǎng)頁驗(yàn)證漏洞注入客戶端腳本.接下來這些代碼被發(fā)送到受信任的客戶端電腦上并被瀏覽器解釋執(zhí)行.因?yàn)檫@些代碼來自受信任的站點(diǎn),所以瀏覽器無法得知這些代碼是有害的.?
未授權(quán)的文件訪問(Unauthorized file access).如果你的代碼從調(diào)用者那里接受輸入,惡意用戶可以看到你對文件的操作過程從而訪問那些受保護(hù)的文件或者使用你的代碼注入非法數(shù)據(jù).?
? 注意 : 注入攻擊可通過使用HTTP或HTTPS Secure Socket Layer(SSL) 連接. 傳輸加密技術(shù)不能用來防御攻擊.
? 通常的輸入驗(yàn)證方法總結(jié)如下.你應(yīng)在所有的需要通過網(wǎng)絡(luò)輸入的地方進(jìn)行驗(yàn)證,比如文本框和其它表單輸入字段, 查詢字串參數(shù),cookies,服務(wù)器端變量和網(wǎng)絡(luò)方法參數(shù).注意,過濾策略應(yīng)該是只允許正確的輸入然后拒絕非法輸入.這是因?yàn)槎x正確的輸入策略比過濾所有的非法輸入要容易,那通常很難包括所有的非法輸入.
? 通入如下幾個(gè)方面驗(yàn)證輸入內(nèi)容:
約束.驗(yàn)證是否輸入的是正確的類型,字符長度,格式和范圍.可以應(yīng)用ASP.NET驗(yàn)證控件來約束服務(wù)器控件輸入.約束其它來源的輸入可以使用正則表達(dá)式和自定義的驗(yàn)證規(guī)則.?
拒絕.檢測已知的有害數(shù)據(jù)輸入并拒絕.?
過濾.有時(shí)候你會希望過濾掉用戶輸入中那些有安全隱患的那些部分.例如,你的程序允許自由格式的輸入,比如備注字段,你會允許特定的安全HTML標(biāo)記象<b>,<i>及其它的HTML標(biāo)記.?
? 步驟提要
? 通過以下步驟保護(hù)你的ASP.NET程序不受注入式攻擊危害 :
第一步.使用ASP.NET請求驗(yàn)證.?
第二步.約束輸入.?
第三步.對不安全的輸出進(jìn)行編碼.?
第四步.對SQL查詢語句使用命令參數(shù).?
第五步.驗(yàn)證ASP.NET的出錯(cuò)信息沒有泄漏至客戶端.?
? 下面的章節(jié)將對這些步驟進(jìn)行詳細(xì)討論.
? 第一步.使用ASP.NET請求驗(yàn)證.
? 默認(rèn)地,ASP.NET 1.1和2.0請求驗(yàn)證會對送至服務(wù)器的數(shù)據(jù)檢測是否含有HTML標(biāo)記元素和保留字符.這可以防止用戶向程序中輸入腳本.請求驗(yàn)證會對照一個(gè)有潛在威脅的字符串列表進(jìn)行匹配,如果發(fā)現(xiàn)異常它會拋出一個(gè)HttpRequestValidationException類型的異常.
? 你可以在你的web.config文件中的<pages>元素中加入validateRequest="false" 或在單獨(dú)的頁面的@Pages元素里面設(shè)置ValidateRequest = "false"來禁用此項(xiàng)功能.
? 如果你想禁用請求驗(yàn)證功能,你可以僅在需要的頁面禁用它.比如你在程序頁面上包含一個(gè)可接受HTML格式輸入的字段.
? 確定在Machine.config文件中請求驗(yàn)證功能被打開.
?
? 請求驗(yàn)證功能在ASP.NET中被默認(rèn)啟用.你可以在Machine.config.comments文件中看到如下的默認(rèn)設(shè)置.
<pages validateRequest = "true" ... />?
? 確認(rèn)你沒有修改你的服務(wù)器的Machine.config和應(yīng)用程序的Web.config文件里的默認(rèn)設(shè)置.
? 測試ASP.NET請求驗(yàn)證
? 你可以測試請求驗(yàn)證的作用.創(chuàng)建一個(gè)ASP.NET頁面通過設(shè)置ValidateRequest = "fasle"禁用請求驗(yàn)證,代碼如下 :?
<%@ Language="C#" ValidateRequest="false" %>
<html>
<script runat="server">
void btnSubmit_Click(Object sender, EventArgs e)
{
?
//
If ValidateRequest is false, then ’hello’ is displayed
?
//
If ValidateRequest is true, then ASP.NET returns an exception
Response.Write(txtString.Text);
}
</script>
<body>
<form id="form1" runat="server">
<asp:TextBox id="txtString" runat="server"?
Text="<script>alert(’hello’);</script>" />
<asp:Button id="btnSubmit" runat="server" OnClick="btnSubmit_Click"?
Text="Submit" />
</form>
</body>
</html>
? 當(dāng)你運(yùn)行頁面的時(shí)候,"Hello"被顯示在一個(gè)消息框中,因?yàn)樵趖xtString中的腳本被執(zhí)行并被客戶端的瀏覽器處理.
? 如果你設(shè)置ValidateRequest = "true" 或者移除ValidateRequest頁面屬性,ASP.NET請求驗(yàn)證會拒絕腳本輸入并拋出一個(gè)象下面這樣的錯(cuò)誤信息.
? A potentially dangerous Request.Form value was detected from the client (txtString="<script>alert(’hello").
? 注意 不要僅僅依賴請求驗(yàn)證功能,而只是把它作為自定驗(yàn)證的輔導(dǎo)手段.
第二步.約束輸入
? 要約束輸入通過如下方法 :
使用服務(wù)器端的輸入驗(yàn)證.不要依賴于客戶端的驗(yàn)證,因?yàn)樗苋菀拙捅焕@過.使用客戶端驗(yàn)證是為了減少頁面返住次數(shù)提升性能,改進(jìn)用戶體驗(yàn).?
驗(yàn)證輸入的長度,范圍,格式和類型.確保輸入內(nèi)容是符合要求的正確內(nèi)容.?
使用強(qiáng)數(shù)據(jù)類型.為數(shù)字類型的輸入指定如Integer或者Double的類型.為字符輸入指定為String數(shù)據(jù)類型.為日期時(shí)間輸入指定DateTime類型.?
? 要驗(yàn)證表單里面的HTML控件輸入字段,在服務(wù)器端代碼中進(jìn)行驗(yàn)證,使用Regex正則表達(dá)式類型可以幫助約束字符輸入.下面的章節(jié)介紹如何約束普通輸入類型的變量.
? 驗(yàn)證字符串字段
要驗(yàn)證字符串字段,如姓名,地址,傳真,生份證號碼,使用正則表達(dá)式.?
約束可接受的字符范圍.?
啟動格式規(guī)則.例如,基于模式的字段如稅號,郵編,郵遞區(qū)號需要規(guī)定的字符模式.?
驗(yàn)證長度.?
? 使用正則表達(dá)式驗(yàn)證控件(RegularExpresionValidator)
? 要使用則表達(dá)式驗(yàn)證控件需要設(shè)置待驗(yàn)證的控件名(ControlToValidate),驗(yàn)證表達(dá)式(ValidationExpression)和出錯(cuò)提示(ErrorMessage).相關(guān)的屬性設(shè)置請看下面的代碼示例.
<form id="WebForm" method="post" runat="server">
<asp:TextBox id="txtName" runat="server"></asp:TextBox>
<asp:RegularExpressionValidator id="nameRegex" runat="server"?
ControlToValidate="txtName"?
ValidationExpression="^[a-zA-Z’./s]{1,40}$"?
ErrorMessage="Invalid name">
</asp:regularexpressionvalidator>
</form>
? 在上面的代碼中,正則表達(dá)式被用于限定輸入的名字為字母(允許大寫字母和小寫字母),空格,單名省略號象O’Dell和句點(diǎn).此外,輸入的字符長度被限定在40個(gè)字符.
? 注意 正則表達(dá)式驗(yàn)證控件(RegularExpressionValidator)會自動加入脫字符(^)和美元符號($)作為開始和結(jié)束的分隔符.如果你沒有在自定義的表達(dá)式中加入他們那么最好加入.加入分隔符只是為了讓你的表達(dá)式得到想要的那部分?jǐn)?shù)據(jù)內(nèi)容.
? 使用正則表達(dá)式類(Regex Class)
? 如果你沒有使用服務(wù)器端的控件(意味著你不能使用驗(yàn)證控件),或者你需要其它的輸入字段源而非表單字段(比如查詢字串參數(shù)和cookies),那么你可以使用正則表達(dá)式類(Regex class).
? 使用正則表達(dá)式類
加入使用using前綴的語句導(dǎo)入System.Text.RegularExpressions命名空間.?
確認(rèn)正則表達(dá)式包含"^"和"$"(字串開始處,字串結(jié)束處).?
調(diào)用Regex類的IsMatch方法,下面是代碼示例.?
//
Instance method:
Regex reg = new Regex(@"^[a-zA-Z’./s]{1,40}$");
Response.Write(reg.IsMatch(txtName.Text));
//
Static method:
if (!Regex.IsMatch(txtName.Text,@"^[a-zA-Z’./s]{1,40}$"))?
{
?
//
Name does not match expression
}
? 如果你不能把經(jīng)常使用的正則表達(dá)式緩存起來,你應(yīng)該使用IsMatch靜態(tài)方法來改進(jìn)性能防止不必要的對象創(chuàng)建過程.
? 驗(yàn)證數(shù)字字段
? 在大多數(shù)情況下,應(yīng)該驗(yàn)證數(shù)字的輸入和范圍.使用服務(wù)器控件驗(yàn)證數(shù)字字段的輸入和范圍,使用RangeValidator控件.RangeValidator支持貨幣,日期,整型,雙精度和字符串類型的數(shù)據(jù).
? 使用RangeValidator控件需要設(shè)置需要驗(yàn)證的控件名(ControlToValidate),類型(Type),最小值(MinimumValue),最大值(MaximumValue),和出錯(cuò)提示信息(ErrorMessage)屬性.下面是代碼示例 :?
<asp:RangeValidator?
ID="RangeValidator1"?
Runat="server"?
ErrorMessage="Invalid range. Number must be between 0 and 255."
ControlToValidate="rangeInput"?
MaximumValue="255"?
MinimumValue="0" Type="Integer" />
? 如果你沒使用服務(wù)器控件,你可以將輸入值轉(zhuǎn)化成整型再進(jìn)行驗(yàn)證來完成對數(shù)字的范圍驗(yàn)證.例如,要驗(yàn)證一個(gè)整數(shù)是否合法,使用ASP.NET2.0提供的新方法Int32.TryParse將輸入值轉(zhuǎn)化為System.Int32的變量類型.這個(gè)方法會在轉(zhuǎn)換失敗時(shí)返回false.
Int32 i;
if (Int32.TryParse(txtInput.Text, out i) == false)
{
?
//
Conversion failed
}
? 如果你使用早先的ASP.NET版本,可以在try/catch語句塊中 使用Int32.Parse或者Convert.ToInt32方法并可以在轉(zhuǎn)換失敗時(shí)處理拋出的FormatException錯(cuò)誤.
? 下面的示例代碼演示了如何驗(yàn)證來自HTML文本框的整數(shù)類型的類型和范圍.
<%@ Page Language="C#" %>
<script runat="server">
void Page_Load(object sender, EventArgs e)
?
{
if (Request.RequestType == "POST")
?
{
int i;
if (Int32.TryParse(Request.F
orm["integerTxt"], out i) == true)
?
{
?
//
TryParse returns true if the conversion succeeds
if ((0 <= i && i <= 255) == true)
?
{
Response.Write("Input data is valid.");
}
else
Response.Write("Input data is out of range");
}
else
Response.Write("Input data is not an integer");
}
}
?
</script>
<html>
<body>
<form id="form1" action="NumericInput.aspx" method="post">
<div>
Enter an integer between 0 and 255:
<input name="integerTxt" type="text" />
<input name="Submit" type="submit" value="submit" />
</div>
</form>
</body>
</html>
驗(yàn)證日期字段
? 你需要驗(yàn)證日期字段是否是正確的類型.在大多數(shù)情況下,你也需要驗(yàn)證它們的范圍,如驗(yàn)證它們是否是將來或是過去的時(shí)間.如果你使用服務(wù)器控件來捕獲一個(gè)日期輸入值,同時(shí)你希望這個(gè)值在一個(gè)特定的范圍內(nèi),你可以使用范圍驗(yàn)證控件(RangeValidator)并設(shè)置它允許的類型為Date類型.這個(gè)控件允許你指定一個(gè)特殊的時(shí)間段通過設(shè)置起始的時(shí)刻.如果你需要以今天的時(shí)間作為參照來驗(yàn)證,比如驗(yàn)證一個(gè)時(shí)間是在將來還是過去,你可以使用CustomValidator驗(yàn)證控件。
? 使用CustomValidator控件來驗(yàn)證一個(gè)日期需要設(shè)置ControlToValidate和ErrorMessage屬性,在OnServerValidate事件中指定一個(gè)自定義的驗(yàn)證邏輯方法.下面是示例代碼.
<%@ Page Language="C#" %>
<script runat="server">
void ValidateDateInFuture(object source, ServerValidateEventArgs args)
?
{
DateTime dt;
?
//
Check for valid date and that the date is in the future
if ((DateTime.TryParse(args.Value, out dt) == false) ||?
(dt <= DateTime.Today))
?
{
args.IsValid = false;
}
}
</script>
<html>
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="Label1" Runat="server"?
Text="Future Date:"></asp:Label>
<asp:TextBox ID="futureDatetxt" Runat="server"></asp:TextBox>
<asp:CustomValidator?
ID="CustomValidator1" Runat="server"?
ErrorMessage="Invalid date. Enter a date in the future."
ControlToValidate="futureDatetxt"?
OnServerValidate="ValidateDateInFuture">
</asp:CustomValidator>
<br />
<asp:Button ID="submitBtn" Runat="server" Text="Submit" />
</div>
</form>
</body>
</html>
? 注意 上面的代碼使用的方法DateTime.TryParse是ASP.NET2.0提供的新方法.
? 過濾自由文本字段
? 過濾輸入,你需要使不安全的輸入不被當(dāng)作代碼來對待.例如,你的程序使用戶不能讀取共享數(shù)據(jù)庫內(nèi)的數(shù)據(jù),你首先需要過濾數(shù)據(jù)使它們在輸出的時(shí)候沒有危險(xiǎn).使用HttpUtility.HtmlEncode方法先對輸入值進(jìn)行編碼.
? 允許有限的輸入HTML代碼
在@ Page頁面元素內(nèi)加以下字段ValidateRequest = "false"禁用ASP.NET請求驗(yàn)證?
使用HtmlEncode方法對輸入的字符串進(jìn)行編碼?
使用StringBuilder對象,調(diào)用它的Replace方法對字符中的HTML進(jìn)行替換?
? 下面的代碼給出了這種辦法的示例.此頁面設(shè)置ValidateRequest = "fasle"禁用了ASP.NET請求驗(yàn)證.它的HTML編碼為了顯示簡單的文本格式允許使用<b>和<i>標(biāo)記.
<%@ Page Language="C#" ValidateRequest="false"%>
<script runat="server">
void submitBtn_Click(object sender, EventArgs e)
?
{
?
//
Encode the string input
StringBuilder sb = new StringBuilder(
HttpUtility.HtmlEncode(htmlInputTxt.Text));
?
//
Selectively allow and <i>
sb.Replace("<b>", "<b>");
sb.Replace("</b>", "");
sb.Replace("<i>", "<i>");
sb.Replace("</i>", "");
Response.Write(sb.ToString());
}
</script>
<html>
<body>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="htmlInputTxt" Runat="server"?
TextMode="MultiLine" Width="318px"
Height="168px"></asp:TextBox>
<asp:Button ID="submitBtn" Runat="server"?
Text="Submit" OnClick="submitBtn_Click" />
</div>
</form>
</body>
</html>
? 驗(yàn)證查詢字串的值?
? 驗(yàn)證查詢字串的長度,范圍,格式和類型.通常,你使用一個(gè)合并的正則表達(dá)式來完成以下任務(wù):?
約束輸入值?
設(shè)置明確的范圍檢查條件?
指定輸入的類型并將它轉(zhuǎn)換成ASP.NET平臺下的類型,處理任何由類型轉(zhuǎn)換引發(fā)的異常下面的代碼示例演示了使用Regex類驗(yàn)證由查詢字串傳遞過來的名字字符串?
void Page_Load(object sender, EventArgs e)
{
if (!System.Text.RegularExpressions.Regex.IsMatch(
Request.QueryString["Name"], @"^[a-zA-Z’./s]{1,40}$"))
Response.Write("Invalid name parameter");
else
Response.Write("Name is " + Request.QueryString["Name"]);
}
? 驗(yàn)證Cookie值
? 象查詢字串這樣被保存在Cookie里面的值很容易被用戶修改.同樣地驗(yàn)證這些值的長度,范圍,格式和類型.
驗(yàn)證文件和URL地址
? 如果你的程序允許輸入文件名,文件地址或者文件存放路徑,你需要驗(yàn)證它們的格式是否正確并且根據(jù)你的程序?qū)嶋H情況它指向一個(gè)有效的位置.如果此步驗(yàn)證失敗,你的程序可能會被錯(cuò)誤地要求訪問文件.
? 驗(yàn)證文件路徑
? 為了避免你的程序被用戶利用來訪問文件,防止接受用戶編寫代碼輸入的文件或者文件路徑.例如 :?
如果你接受輸入文件名,使用System.IO.Path.GetFileName方法來取得文件的全稱?
如果你不得不接受輸入文件路徑,使用System.IO.Path.GetFullPath來取得完整的文件路徑?
? 使用MapPath方法防止跨應(yīng)用程序的映射?
? 如果你使用MapPath方法在服務(wù)器上映射一個(gè)提供的虛擬目錄到一個(gè)物理目錄,使用Request.MapPath方法的一個(gè)帶bool參數(shù)的重載版本來防止跨應(yīng)用程序的映射.下面是此項(xiàng)技術(shù)的示例代碼 :
try
{
string mappedPath = Request.MapPath( inputPath.Text,?
Request.ApplicationPath, false);
}
catch (HttpException)
{
?
//
Cross-application mapping attempted
}
? 最終的false參數(shù)將會防止跨應(yīng)用程序的映射.這意味著用戶不允許使用”..”這樣的語法提供一個(gè)不在你所指定的虛擬目錄里面的非法路徑.
? 如果你使用服務(wù)器控件,你可以使用Control.MapPathSecure方法獲取虛擬目錄對應(yīng)的實(shí)際目錄地址.
? Control.MapPathSecure方法在訪問一個(gè)非授權(quán)的文件時(shí)拋出一個(gè)HttpException的異常.需要更多信息,請參看.NET Framework文檔中的Control.MapPathSecure方法介紹.
? 使用代碼訪問安全機(jī)制限制文件輸入輸出
? 管理員可以通過設(shè)置程序使它的可信度為”中”來限制程序向它所在的虛擬目錄讀寫文件的能力..NET代碼安全機(jī)制可以保證程序在它所在的虛擬目錄之外沒有任何的文件訪問權(quán)利.
? 要設(shè)置一個(gè)應(yīng)用程序的信任度為"中",可以在Web.config或者M(jìn)achine.config文件中加入:
<trust level = "Medium" />
? 驗(yàn)證URL
? 你可以用象下面的這樣的正則表達(dá)式來對URL進(jìn)行特征匹配.
^(?:http|https|ftp)://[a-zA-Z0-9/./-]+(?:/:/d{1,5})?(?:[A-Za-z0-9/./;/:/@/&/=/+/$/,/?/]|%u[0-9A-Fa-f]{4}|%[0-9A-Fa-f]{2})*$
? 這只是約束輸入的格式,不驗(yàn)證它是否在應(yīng)用程序可接受的范圍內(nèi).你應(yīng)該驗(yàn)證它是否在你的程序的上下文中有效.例如,您的應(yīng)用程序是否跟你指定的服務(wù)器進(jìn)行通訊?
? 第三步.對不安全代碼進(jìn)行編碼
? 如果您輸入文本輸入到一個(gè)網(wǎng)頁,使用HttpUtility.HtmlEncode方法對它進(jìn)行編碼.如果這些文來自于用戶輸入,數(shù)據(jù)庫或者一個(gè)本地文件,請確保總是這樣做.
? 同樣地,如果您書寫的URL里面包含不安全的字符因?yàn)樗麄儊碜杂谟脩糨斎雰?nèi)容,數(shù)據(jù)庫等,使用HttpUtility.UrlEncode方法進(jìn)行編碼.
? 為了防止存儲數(shù)據(jù)前編碼可能會使存儲的數(shù)據(jù)受到破壞,請確保在將它們顯示出來時(shí)盡可能后面的步驟將它們編碼.
? 使用HtmlEncode對不安全的輸出編碼
? HtmlEncode對HTML標(biāo)記置換成特殊含文的字符串來表示這些符號而又讓瀏覽器不把它們當(dāng)作HTML標(biāo)記來解釋處理.比如."<"被置換成< " (冒號) 被替換成" 這些標(biāo)記被顯示成無害的文本.
<%@ Page Language="C#" ValidateRequest="false" %>
<script runat="server">
void submitBtn_Click(object sender, EventArgs e)
{
Response.Write(HttpUtility.HtmlEncode(inputTxt.Text));
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<body>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="inputTxt" Runat="server"?
TextMode="MultiLine" Width="382px" Height="152px">
</asp:TextBox>
<asp:Button ID="submitBtn" Runat="server" Text="Submit"?
OnClick="submitBtn_Click" />
</div>
</form>
</body>
</html>
? 查看HTML編碼的效果,請建立一個(gè)虛擬目錄將前述的文件放進(jìn)去,運(yùn)行此頁面,在文本框中輸入一些HTML代碼,點(diǎn)擊提交按鈕.例如,下面的輸入被當(dāng)作普通文本來顯示.
Run script and say hello <script>alert(’hello’);</script>?
? 如果你移除調(diào)用HtmlEncode方法,簡單地輸入文本的內(nèi)容,瀏覽器會執(zhí)行代碼并彈出一個(gè)提示框.
? 使用UrlEncode 方法對不安全的URL地址進(jìn)行編碼
? 如果你需要獲取有用戶輸入部分的URL參數(shù),這可能帶來一定的安全風(fēng)險(xiǎn),使用HttpUtility.UrlEncode方法對這個(gè)地址字符串編碼.
HttpUtility.UrlEncode(urlString);
? 第四步.對SQL語句使用命令參數(shù)方式.
? 為了避免注入式攻擊請使用SQL的參數(shù)方式.參數(shù)(Parameters)集合提供類型檢測和長度檢測.如果你使用參數(shù)集合,輸入的內(nèi)容將被當(dāng)作文本值來對待,數(shù)據(jù)庫不會執(zhí)行包含在其中的代碼.使用參數(shù)集方式的一個(gè)額外的好處是,你可以嚴(yán)格限定輸入的類型和長度.如果輸入型超出范圍將會觸發(fā)異常.
? 當(dāng)調(diào)用一個(gè)存儲過程時(shí)使用參數(shù)集
? 下面的代碼片段演示了在調(diào)用存儲過程時(shí)使用參數(shù)集的例子.
SqlDataAdapter myCommand = new SqlDataAdapter("AuthorLogin",?
myConnection);
myCommand.SelectCommand.CommandType = CommandType.StoredProcedure;
SqlParameter parm = myCommand.SelectCommand.Parameters.Add(
"@LoginId", SqlDbType.VarChar, 11);
parm.Value = Login.Text;
? 在創(chuàng)建你自己的SQL語句時(shí)使用參數(shù)集.
? 如果你不能使用存儲過程,你仍然可以使用參數(shù)集,請看下面的代碼.
SqlDataAdapter myCommand = new SqlDataAdapter(
"SELECT au_lname, au_fname FROM Authors WHERE au_id = @au_id", myConnection);
SQLParameter parm = myCommand.SelectCommand.Parameters.Add(
"@au_id" ,SqlDbType.VarChar, 11);
Parm.Value = Login.Text;
? 如果需要獲取更多的如果防止SQL注入攻擊的信息請參看How to : Protect From SQL Injection in ASP.NET
? 第五步.驗(yàn)證ASP.NET的錯(cuò)誤信息沒有被返回到客戶端
? 你可以使用<customErrors>元素來配置客戶端,一般的錯(cuò)誤信息應(yīng)該被程序錯(cuò)誤檢測機(jī)制返回到客戶端.
? 請確認(rèn)已經(jīng)更改web.config中的mode屬性為"remoteOnly",下面是示例.
<customErrors mode = "remoteOnly">
? 安在裝了一個(gè)ASP.NET 的程序之后,你可以按照如下設(shè)定指定客戶端的錯(cuò)誤信息頁面。
<customErrors mode = "on" defaultRedirect = "YourErrorPage.htm">
總結(jié)
以上是生活随笔為你收集整理的asp.net中防止攻击的方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [常见错误]Python.h: No s
- 下一篇: ASP.NET MVC 3 RTM