在ASP.NET中防止注入攻击[翻译]
应用范围:
概要:
文本主要介绍如何校验用户输入从而防止注入式攻击.校验用户输入是非常必要的,几乎所有程序级的攻击都包含恶意输入的手殿
你应该校验包括字殿查询字串参数,Cookie等一切用户输入项来保护你的程序免受注入攻凿你得假设所有的用户输入都是恶意皿确保在服务器端对所有的用户输入进行校验.使用基于客户端的验证可以减少页面的住返次敿改进性能,改善用户体验,但是不要仅仅依赖于此,因为客户端的验证很容易就可以被黑客骗过去.
为了验证输入内容,你应该为每一个输入字段定义可接受的输入规刿比较好的作法是从输入字段的长庿范围,格式,类型来作约束.使用可接受的字符约束列表而不是非法字符列表来约束输入.使用非法字符列表约束的方式不奿是因为你几乎不可能过滤所有的有害输入.
如果你需要接受HTML字符输入,最好使用HtmlEncode之类的方法将它进行编码确保安全再将它们显示出板
内容:
目的
总括
分步实施提要
第一歿 使用ASP.NET 请求校验.
第二歿 使用权用约束输入.
第三歿 对不安全的输入进行编砿
第四歿 对Sql语句使用命令参数方式.
第五歿 验证ASP.NET的错误没有被返回客户竿
额外的资溿/STRONG>
目的:
概述 :
你应该在程序中验证所有的不信任输兿你应该假定所有的用户输入都是非法皿用户可以在应用程序中提供表单字段,查询字串,客户端cookies和浏览器环境值比如用户代理字串和IP地址筿
弱输入校验通常为注入攻击提供了机会.下面是常见的利用弱输入校验或无输入校验进行攻击的手段.
注意 : 注入攻击可通过使用HTTP或HTTPS Secure Socket Layer(SSL) 连接. 传输加密技术不能用来防御攻凿
通常的输入验证方法总结如下.你应在所有的需要通过网络输入的地方进行验诿比如文本框和其它表单输入字段, 查询字串参数,cookies,服务器端变量和网络方法参敿注意,过滤策略应该是只允许正确的输入然后拒绝非法输兿这是因为定义正确的输入策略比过滤所有的非法输入要容昿那通常很难包括所有的非法输入.
通入如下几个方面验证输入内容:
步骤提要
通过以下步骤保护你的ASP.NET程序不受注入式攻击危宿:
下面的章节将对这些步骤进行详细讨访
第一歿使用ASP.NET请求验证.
默认圿ASP.NET 1.1咿.0请求验证会对送至服务器的数据检测是否含有HTML标记元素和保留字笿这可以防止用户向程序中输入脚朿请求验证会对照一个有潜在威胁的字符串列表进行匹配,如果发现异常它会抛出一个HttpRequestValidationException类型的异帿
你可以在你的web.config文件中的<pages>元素中加兿STRONG>validateRequest="false" 或在单独的页面的@Pages元素里面设置ValidateRequest = "false"来禁用此项功胿
如果你想禁用请求验证功能,你可以仅在需要的页面禁用宿比如你在程序页面上包含一个可接受HTML格式输入的字殿
确定在Machine.config文件中请求验证功能被打开.
请求验证功能在ASP.NET中被默认启用.你可以在Machine.config.comments文件中看到如下的默认设置.
<pages validateRequest = "true" ... />
确认你没有修改你的服务器的Machine.config和应用程序的Web.config文件里的默认设置.
测试ASP.NET请求验证
你可以测试请求验证的作用.创建一个ASP.NET页面通过设置ValidateRequest = "fasle"禁用请求验证,代码如下 :
 <%@ Language="C#" ValidateRequest="false" %>
<%@ Language="C#" ValidateRequest="false" %> <html>
<html> <script runat="server">
 <script runat="server"> void btnSubmit_Click(Object sender, EventArgs e)
  void btnSubmit_Click(Object sender, EventArgs e) {
  { // If ValidateRequest is false, then 'hello' is displayed
    // If ValidateRequest is false, then 'hello' is displayed // If ValidateRequest is true, then ASP.NET returns an exception
    // If ValidateRequest is true, then ASP.NET returns an exception Response.Write(txtString.Text);
    Response.Write(txtString.Text); }
  } </script>
 </script> <body>
 <body> <form id="form1" runat="server">
  <form id="form1" runat="server"> <asp:TextBox id="txtString" runat="server"
    <asp:TextBox id="txtString" runat="server"  Text="<script>alert('hello');</script>" />
                 Text="<script>alert('hello');</script>" /> <asp:Button id="btnSubmit" runat="server" OnClick="btnSubmit_Click"
    <asp:Button id="btnSubmit" runat="server" OnClick="btnSubmit_Click"  Text="Submit" />
                 Text="Submit" /> </form>
  </form> </body>
 </body> </html>
</html>
当你运行页面的时倿"Hello"被显示在一个消息框丿因为圿STRONG>txtString中的脚本被执行并被客户端的浏览器处理.
如果你设罿STRONG>ValidateRequest = "true" 或者移陿STRONG>ValidateRequest页面属怿ASP.NET请求验证会拒绝脚本输入并抛出一个象下面这样的错误信恿
 A potentially dangerous Request.Form value was detected from the client (txtString="<script>alert('hello
A potentially dangerous Request.Form value was detected from the client (txtString="<script>alert('hello ").
").
注意 不要仅仅依赖请求验证功能,而只是把它作为自定验证的辅导手段.
第二歿约束输入
要约束输入通过如下方法 :
要验证表单里面的HTML控件输入字段,在服务器端代码中进行验证,使用Regex正则表达式类型可以帮助约束字符输兿下面的章节介绍如何约束普通输入类型的变量.
验证字符串字殿/P>
使用正则表达式验证控仿RegularExpresionValidator)
要使用则表达式验证控件需要设置待验证的控件名(ControlToValidate),验证表达弿ValidationExpression)和出错提礿ErrorMessage).相关的属性设置请看下面的代码示例.
 <form id="WebForm" method="post" runat="server">
<form id="WebForm" method="post" runat="server"> <asp:TextBox id="txtName" runat="server"></asp:TextBox>
  <asp:TextBox id="txtName" runat="server"></asp:TextBox> <asp:RegularExpressionValidator id="nameRegex" runat="server"
  <asp:RegularExpressionValidator id="nameRegex" runat="server"  ControlToValidate="txtName"
        ControlToValidate="txtName"  ValidationExpression="^[a-zA-Z'.\s]{1,40}$"
        ValidationExpression="^[a-zA-Z'.\s]{1,40}$"  ErrorMessage="Invalid name">
        ErrorMessage="Invalid name"> </asp:regularexpressionvalidator>
  </asp:regularexpressionvalidator> </form>
</form>
在上面的代码丿正则表达式被用于限定输入的名字为字母(允许大写字母和小写字毿,空格,单名省略号象O'Dell和句炿此外,输入的字符长度被限定圿0个字笿
注意 正则表达式验证控仿RegularExpressionValidator)会自动加入脱字符(^)和美元符叿$)作为开始和结束的分隔符.如果你没有在自定义的表达式中加入他们那么最好加兿加入分隔符只是为了让你的表达式得到想要的那部分数据内宿
使用正则表达式类(Regex Class)
如果你没有使用服务器端的控件(意味着你不能使用验证控仿,或者你需要其它的输入字段源而非表单字段(比如查询字串参数和cookies),那么你可以使用正则表达式籿Regex class).
使用正则表达式类
- 加入使用using前缀的语句导入System.Text.RegularExpressions命名空间.
- 确认正则表达式包吿^"咿$"(字串开始处,字串结束夿.
- 调用Regex类的IsMatch方法,下面是代码示便
 // Instance method:
// Instance method: Regex reg = new Regex(@"^[a-zA-Z'.\s]{1,40}$");
Regex reg = new Regex(@"^[a-zA-Z'.\s]{1,40}$"); Response.Write(reg.IsMatch(txtName.Text));
Response.Write(reg.IsMatch(txtName.Text));
 // Static method:
// Static method: if (!Regex.IsMatch(txtName.Text,@"^[a-zA-Z'.\s]{1,40}$"))
if (!Regex.IsMatch(txtName.Text,@"^[a-zA-Z'.\s]{1,40}$"))  {
{ // Name does not match expression
  // Name does not match expression }
}
如果你不能把经常使用的正则表达式缓存起来,你应该使用IsMatch静态方法来改进性能防止不必要的对象创建过程.
验证数字字段
在大多数情况丿应该验证数字的输入和范围.使用服务器控件验证数字字段的输入和范囿使用RangeValidator控件.RangeValidator支持货币,日期,整型,双精度和字符串类型的数据.
使用RangeValidator控件需要设置需要验证的控件吿ControlToValidate),类型_STRONG>Type),最小倿MinimumValue),最大倿MaximumValue),和出错提示信息(ErrorMessage)属性.下面是代码示便:
 <asp:RangeValidator
<asp:RangeValidator  ID="RangeValidator1"
       ID="RangeValidator1"  Runat="server"
       Runat="server"  ErrorMessage="Invalid range. Number must be between 0 and 255."
       ErrorMessage="Invalid range. Number must be between 0 and 255." ControlToValidate="rangeInput"
       ControlToValidate="rangeInput"  MaximumValue="255"
       MaximumValue="255"  MinimumValue="0" Type="Integer" />
       MinimumValue="0" Type="Integer" />
如果你没使用服务器控件,你可以将输入值转化成整型再进行验证来完成对数字的范围验证.例如,要验证一个整数是否合法,使用ASP.NET2.0提供的新方法Int32.TryParse将输入值转化为System.Int32的变量类垿这个方法会在转换失败时返回false.
 Int32 i;
Int32 i; if (Int32.TryParse(txtInput.Text, out i) == false)
if (Int32.TryParse(txtInput.Text, out i) == false) {
{ // Conversion failed
  // Conversion failed }
}
如果你使用早先的ASP.NET版本,可以在try/catch语句块中 使用Int32.Parse或耿STRONG>Convert.ToInt32方法并可以在转换失败时处理抛出的FormatException错误.
下面的示例代码演示了如何验证来自HTML文本框的整数类型的类型和范围.
 <%@ Page Language="C#" %>
<%@ Page Language="C#" %>
 <script runat="server">
<script runat="server">
 void Page_Load(object sender, EventArgs e)
  void Page_Load(object sender, EventArgs e) {
  { if (Request.RequestType == "POST")
    if (Request.RequestType == "POST") {
    { int i;
      int i; if (Int32.TryParse(Request.Form["integerTxt"], out i) == true)
      if (Int32.TryParse(Request.Form["integerTxt"], out i) == true) {
      { // TryParse returns true if the conversion succeeds
        // TryParse returns true if the conversion succeeds if ((0 <= i && i <= 255) == true)
        if ((0 <= i && i <= 255) == true) {
        { Response.Write("Input data is valid.");
          Response.Write("Input data is valid."); }
        } else
        else Response.Write("Input data is out of range");
          Response.Write("Input data is out of range"); }
      } else
      else Response.Write("Input data is not an integer");
        Response.Write("Input data is not an integer"); }
    } }
  } 
    </script>
</script>
 <html>
<html> <body>
  <body> <form id="form1" action="NumericInput.aspx" method="post">
    <form id="form1" action="NumericInput.aspx" method="post"> <div>
      <div> Enter an integer between 0 and 255:
        Enter an integer between 0 and 255: <input name="integerTxt" type="text" />
        <input name="integerTxt" type="text" /> <input name="Submit" type="submit" value="submit" />
        <input name="Submit" type="submit" value="submit" /> </div>
      </div> </form>
    </form> </body>
  </body> </html>
</html>
验证日期字段
你需要验证日期字段是否是正确的类垿在大多数情况丿你也需要验证它们的范围,如验证它们是否是将来或是过去的时闿如果你使用服务器控件来捕获一个日期输入倿同时你希望这个值在一个特定的范围冿你可以使用范围验证控仿RangeValidator)并设置它允许的类型为Date类型.这个控件允许你指定一个特殊的时间段通过设置起始的时刿如果你需要以今天的时间作为参照来验证,比如验证一个时间是在将来还是过县你可以使甿STRONG>CustomValidator验证控件.使用CustomValidator控件来验证一个日期需要设置ControlToValidate和ErrorMessage属怿在OnServerValidate事件中指定一个自定义的验证逻辑方法.下面是示例代砿
 <%@ Page Language="C#" %>
<%@ Page Language="C#" %>
 <script runat="server">
<script runat="server">
 void ValidateDateInFuture(object source, ServerValidateEventArgs args)
 void ValidateDateInFuture(object source, ServerValidateEventArgs args) {
 { DateTime dt;
   DateTime dt;
 // Check for valid date and that the date is in the future
   // Check for valid date and that the date is in the future if ((DateTime.TryParse(args.Value, out dt) == false) ||
   if ((DateTime.TryParse(args.Value, out dt) == false) ||  (dt <= DateTime.Today))
       (dt <= DateTime.Today)) {
   { args.IsValid = false;
     args.IsValid = false; }
   } }
 }
 </script>
</script>
 <html>
<html> <body>
  <body> <form id="form1" runat="server">
    <form id="form1" runat="server"> <div>
      <div> <asp:Label ID="Label1" Runat="server"
        <asp:Label ID="Label1" Runat="server"  Text="Future Date:"></asp:Label>
                   Text="Future Date:"></asp:Label> <asp:TextBox ID="futureDatetxt" Runat="server"></asp:TextBox>
        <asp:TextBox ID="futureDatetxt" Runat="server"></asp:TextBox> <asp:CustomValidator
        <asp:CustomValidator  ID="CustomValidator1" Runat="server"
              ID="CustomValidator1" Runat="server"  ErrorMessage="Invalid date. Enter a date in the future."
              ErrorMessage="Invalid date. Enter a date in the future." ControlToValidate="futureDatetxt"
              ControlToValidate="futureDatetxt"   OnServerValidate="ValidateDateInFuture">
              OnServerValidate="ValidateDateInFuture"> </asp:CustomValidator>
        </asp:CustomValidator> <br />
        <br /> <asp:Button ID="submitBtn" Runat="server" Text="Submit"  />
        <asp:Button ID="submitBtn" Runat="server" Text="Submit"  /> </div>
      </div> </form>
    </form> </body>
  </body> </html>
</html>
注意 上面的代码使用的方法DateTime.TryParse是ASP.NET2.0提供的新方法.
过滤自由文本字段
过滤输入,你需要使不安全的输入不被当作代码来对徿例如,你的程序使用户不能读取共享数据库内的数据,你首先需要过滤数据使它们在输出的时候没有危陿使用HttpUtility.HtmlEncode方法先对输入值进行编砿
允许有限的输入HTML代码
- 在@ Page页面元素内加以下字段ValidateRequest = "false"禁用ASP.NET请求验证
- 使用HtmlEncode方法对输入的字符串进行编砿
- 使用StringBuilder对象,调用它的Replace方法对字符中的HTML进行替换
下面的代码给出了这种办法的示便此页面设罿STRONG>ValidateRequest = "fasle"禁用了ASP.NET请求验证.它的HTML编码为了显示简单的文本格式允许使用<b>咿lt;i>标记.
 <%@ Page Language="C#" ValidateRequest="false"%>
<%@ Page Language="C#" ValidateRequest="false"%>
 <script runat="server">
<script runat="server">
 void submitBtn_Click(object sender, EventArgs e)
  void submitBtn_Click(object sender, EventArgs e) {
  { // Encode the string input
    // Encode the string input StringBuilder sb = new StringBuilder(
    StringBuilder sb = new StringBuilder( HttpUtility.HtmlEncode(htmlInputTxt.Text));
                            HttpUtility.HtmlEncode(htmlInputTxt.Text)); // Selectively allow  and <i>
    // Selectively allow  and <i> sb.Replace("<b>", "<b>");
    sb.Replace("<b>", "<b>"); sb.Replace("</b>", "");
    sb.Replace("</b>", ""); sb.Replace("<i>", "<i>");
    sb.Replace("<i>", "<i>"); sb.Replace("</i>", "");
    sb.Replace("</i>", ""); Response.Write(sb.ToString());
    Response.Write(sb.ToString()); }
  } </script>
</script>
 <html>
<html> <body>
  <body> <form id="form1" runat="server">
    <form id="form1" runat="server"> <div>
      <div> <asp:TextBox ID="htmlInputTxt" Runat="server"
        <asp:TextBox ID="htmlInputTxt" Runat="server"  TextMode="MultiLine" Width="318px"
                     TextMode="MultiLine" Width="318px" Height="168px"></asp:TextBox>
                     Height="168px"></asp:TextBox> <asp:Button ID="submitBtn" Runat="server"
        <asp:Button ID="submitBtn" Runat="server"  Text="Submit" OnClick="submitBtn_Click" />
                     Text="Submit" OnClick="submitBtn_Click" /> </div>
      </div> </form>
    </form> </body>
  </body> </html>
</html>
验证查询字串的倿/STRONG>
验证查询字串的长庿范围,格式和类垿通常,你使用一个合并的正则表达式来完成以下任务:
 void Page_Load(object sender, EventArgs e)
void Page_Load(object sender, EventArgs e) {
{ if (!System.Text.RegularExpressions.Regex.IsMatch(
  if (!System.Text.RegularExpressions.Regex.IsMatch( Request.QueryString["Name"], @"^[a-zA-Z'.\s]{1,40}$"))
       Request.QueryString["Name"], @"^[a-zA-Z'.\s]{1,40}$")) Response.Write("Invalid name parameter");
    Response.Write("Invalid name parameter"); else
  else Response.Write("Name is " + Request.QueryString["Name"]);
    Response.Write("Name is " + Request.QueryString["Name"]); }
}
验证Cookie倿/STRONG>
象查询字串这样被保存在Cookie里面的值很容易被用户修政同样地验证这些值的长度,范围,格式和类垿
验证文件和URL地址
如果你的程序允许输入文件吿文件地址或者文件存放路徿你需要验证它们的格式是否正确并且根据你的程序实际情况它指向一个有效的位置.如果此步验证失败,你的程序可能会被错误地要求访问文仿
验证文件路径
为了避免你的程序被用户利用来访问文件,防止接受用户编写代码输入的文件或者文件路徿例如 :
使用MapPath方法防止跨应用程序的映射
如果你使用MapPath方法在服务器上映射一个提供的虚拟目录到一个物理目彿使用Request.MapPath方法的一个带bool参数的重载版本来防止跨应用程序的映射.下面是此项技术的示例代码 :
 try
try {
{ string mappedPath = Request.MapPath( inputPath.Text,
  string mappedPath = Request.MapPath( inputPath.Text,  Request.ApplicationPath, false);
                                       Request.ApplicationPath, false); }
} catch (HttpException)
catch (HttpException) {
{ // Cross-application mapping attempted
  // Cross-application mapping attempted }
}
最终的false参数将会防止跨应用程序的映射.这意味着用户不允许使用".."这样的语法提供一个不在你所指定的虚拟目录里面的非法路径_/P>
如果你使用服务器控件,你可以使用Control.MapPathSecure方法获取虚拟目录对应的实际目录地址_BR>Control.MapPathSecure方法在访问一个非授权的文件时抛出一个HttpException的异常.需要更多信息,请参眿NET Framework文档中的Control.MapPathSecure方法介绍_/P>
使用代码访问安全机制限制文件输入输出
管理员可以通过设置程序使它的可信度为"中"来限制程序向它所在的虚拟目录读写文件的能力..NET代码安全机制可以保证程序在它所在的虚拟目录之外没有任何的文件访问权刿
要设置一个应用程序的信任度为"丿,可以在Web.config或者Machine.config文件中加兿
<trust level = "Medium" />
验证URL
你可以用象下面的这样的正则表达式来对URL进行特征匹配.
^(?: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})*$
这只是约束输入的格式,不验证它是否在应用程序可接受的范围内.你应该验证它是否在你的程序的上下文中有效.例如,您的应用程序是否跟你指定的服务器进行通讯?
第三歿对不安全代码进行编码
如果您输入文本输入到一个网顿使用HttpUtility.HtmlEncode方法对它进行编码.如果这些文来自于用户输入,数据库或者一个本地文仿请确保总是这样偿
同样圿如果您书写的URL里面包含不安全的字符因为他们来自于用户输入内宿数据库等,使用HttpUtility.UrlEncode方法进行编码.
为了防止存储数据前编码可能会使存储的数据受到破坏,请确保在将它们显示出来时尽可能后面的步骤将它们编砿
使用HtmlEncode对不安全的输出编砿/P>
HtmlEncode对HTML标记置换成特殊含文的字符串来表示这些符号而又让浏览器不把它们当作HTML标记来解释处琿比如."<"被置换成< " (冒号) 被替换成" 这些标记被显示成无害的文朿
 <%@ Page Language="C#" ValidateRequest="false" %>
<%@ Page Language="C#" ValidateRequest="false" %>
 <script runat="server">
<script runat="server"> void submitBtn_Click(object sender, EventArgs e)
  void submitBtn_Click(object sender, EventArgs e) {
  { Response.Write(HttpUtility.HtmlEncode(inputTxt.Text));
      Response.Write(HttpUtility.HtmlEncode(inputTxt.Text)); }
  } </script>
</script>
 <html xmlns="http://www.w3.org/1999/xhtml" >
<html xmlns="http://www.w3.org/1999/xhtml" > <body>
  <body> <form id="form1" runat="server">
    <form id="form1" runat="server"> <div>
      <div> <asp:TextBox ID="inputTxt" Runat="server"
        <asp:TextBox ID="inputTxt" Runat="server"  TextMode="MultiLine" Width="382px" Height="152px">
             TextMode="MultiLine" Width="382px" Height="152px"> </asp:TextBox>
        </asp:TextBox> <asp:Button ID="submitBtn" Runat="server" Text="Submit"
        <asp:Button ID="submitBtn" Runat="server" Text="Submit"  OnClick="submitBtn_Click" />
                    OnClick="submitBtn_Click" /> </div>
      </div> </form>
    </form> </body>
  </body> </html>
</html>
查看HTML编码的效枿请建立一个虚拟目录将前述的文件放进去,运行此页靿在文本框中输入一些HTML代码,点击提交按钮.例如,下面的输入被当作普通文本来显示.
Run script and say hello <script>alert('hello');</script>
如果你移除调用HtmlEncode方法,简单地输入文本的内宿浏览器会执行代码并弹出一个提示框.
使用UrlEncode 方法对不安全的URL地址进行编码
如果你需要获取有用户输入部分的URL参数,这可能带来一定的安全风险,使用HttpUtility.UrlEncode方法对这个地址字符串编砿
HttpUtility.UrlEncode(urlString);
第四歿对SQL语句使用命令参数方式.
为了避免注入式攻击请使用SQL的参数方弿参数(Parameters)集合提供类型检测和长度检浿如果你使用参数集吿输入的内容将被当作文本值来对待,数据库不会执行包含在其中的代砿使用参数集方式的一个额外的好处昿你可以严格限定输入的类型和长庿如果输入型超出范围将会触发异帿
当调用一个存储过程时使用参数雿/STRONG>
下面的代码片段演示了在调用存储过程时使用参数集的例子.
 SqlDataAdapter myCommand = new SqlDataAdapter("AuthorLogin",
SqlDataAdapter myCommand = new SqlDataAdapter("AuthorLogin",  myConnection);
                                     myConnection); myCommand.SelectCommand.CommandType = CommandType.StoredProcedure;
myCommand.SelectCommand.CommandType = CommandType.StoredProcedure; SqlParameter parm = myCommand.SelectCommand.Parameters.Add(
SqlParameter parm = myCommand.SelectCommand.Parameters.Add( "@LoginId", SqlDbType.VarChar, 11);
                                       "@LoginId", SqlDbType.VarChar, 11); parm.Value = Login.Text;
parm.Value = Login.Text;
在创建你自己的SQL语句时使用参数集.
如果你不能使用存储过稿你仍然可以使用参数集,请看下面的代砿
 SqlDataAdapter myCommand = new SqlDataAdapter(
SqlDataAdapter myCommand = new SqlDataAdapter( "SELECT au_lname, au_fname FROM Authors WHERE au_id = @au_id", myConnection);
"SELECT au_lname, au_fname FROM Authors WHERE au_id = @au_id", myConnection); SQLParameter parm = myCommand.SelectCommand.Parameters.Add(
SQLParameter parm = myCommand.SelectCommand.Parameters.Add( "@au_id" ,SqlDbType.VarChar, 11);
                           "@au_id" ,SqlDbType.VarChar, 11); Parm.Value = Login.Text;
Parm.Value = Login.Text;
如果需要获取更多的如果防止SQL注入攻击的信息请参看How to : Protect From SQL Injection in ASP.NET
第五歿验证ASP.NET的错误信息没有被返回到客户端
你可以使甿lt;customErrors>元素来配置客户端,一般的错误信息应该被程序错误检测机制返回到客户竿
请确认已经更改web.config中的mode属性为"remoteOnly",下面是示便
<customErrors mode = "remoteOnly">
安在装了一个ASP.NET 的程序之后,你可以按照如下设定指定客户端的错误信息页面〿/P>
<customErrors mode = "on" defaultRedirect = "YourErrorPage.htm">
额外的资源,请查看相关主题内宿_/STRONG>
 
                    
                     
                    
                 
                    
                
 
   
     
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号