提高 WEB 应用程序安全: 威胁和对策: 更正和备注

文章翻译 文章翻译
文章编号: 867600 - 查看本文应用于的产品
展开全部 | 关闭全部

概要

本文包含注释、 更正,和与 Microsoft 模式和实践简介册的已知错误的信息提高 Web 应用程序安全: 威胁和对策,ISBN 0 7356 1842年 9

我们发现错误时,将更新的简介册的 web 版本。您可能会发现多个或全部下列错误已经在 MSDN 上的该简介册的 web 版本中更正。

包括以下主题:
  • 页面 273,第 10 章: 构建安全的 ASP.NET 网页和控件,节: 数据绑定控件完成的节
  • 页面 441,第 16 章: 保护 Web 服务器,节: 禁用 NetBIOS 和 SMB

更多信息

页面 273、 第 10 章: 构建安全的 ASP.NET 网页和控件,节: 数据绑定控件完成节
http://msdn2.microsoft.com/en-us/library/aa302426.aspx

更改:

数据绑定 Web 控件未对输出进行编码。对输出进行编码的唯一控件时其 TextMode 属性设置为多行文本框控件。如果您将任何其他控件绑定到有恶意 XSS 代码的数据时,将在客户端上执行代码。如此一来从一个数据库中检索数据,并且您不能为特定的数据是否有效 (可能是因为它是与其他应用程序共享的数据库),将它传递给客户端之前对数据进行编码。

To:

数据绑定的控件都是可绑定到数据组件继承一个公共的 web 控件数据源属性。若要说几个,您会发现 DataGrid、 列表框和 DropDownList 要经常使用。 不是所有的数据绑定的控件执行编码时显示的数据检索从绑定的数据组件 ; 因此,将执行编码上不受信任的数据组件,以防止 XSS 攻击您的责任。例如对于数据组件不能在不同的应用程序共享单个数据库方案中是受信任。如果攻击者能够插入到数据库 (按实例滥用该的应用程序之一中存在一个漏洞) 的恶意 XSS 代码使用非编码的 web 控件绑定到该的所有应用程序将变为易受攻击。只应避免编码如果您可以确定将输出从数据组件总是会有效。

不执行编码的数据绑定控件的示例有 DataGrid、 DataList、 RadioButtonList 和 CheckBoxList。执行编码为一个数据绑定的控件可能会有所不同具体取决于每个特定的控件。例如对于为一个 DataGrid 控件,您有以下选项:
  • 所有的列变成模板和手动在每个调用 DataBinder.Eval 使用 HtmlEncode()/UrlEncode()
  • 重写的数据绑定方法如 OnDatabinding 或 OnItemDataBound 之一,并执行对其项目进行编码。下面的示例阐释了如何以通过以下任一方法对其项目进行编码会重写的 DataGrid 控件 OnItemDataBound 方法使用 HtmlEncode() 或 UrlEncode() 需要时:

...
[DefaultProperty("Text"),
  ToolboxData("<{0}:DataGrid runat=server></{0}:DataGrid>")]
 
public class DataGrid : System.Web.UI.WebControls.DataGrid
{
    /// <summary>
    /// The ItemDataBound event is raised after an item is data bound to the DataGrid
    /// control. This event provides you with the last opportunity to access the data
    /// item before it is displayed on the client. After this event is raised, the data
    /// item is nulled out and no longer available. - .NET Framework Class Library
    /// </summary>
    /// <param name="e"></param>
    protected override void OnItemDataBound(DataGridItemEventArgs e)
    {
      base.OnItemDataBound (e);
 
      switch (e.Item.ItemType)
      {
        case ListItemType.Item:
        case ListItemType.AlternatingItem:
        case ListItemType.EditItem:
        case ListItemType.SelectedItem:
        case ListItemType.Footer:
        case ListItemType.Header:
        case ListItemType.Pager:  
          // even though not all of these ListItemTypes are data bound,
          // perform HtmlEncode or UrlEncode on each control. If there are
          // no controls, we perform HtmlEncode on any available text.
          // Also, don't let &nbsp;'s be encoded.
          TableCellCollection cCells = e.Item.Cells;
          foreach (TableCell tc in cCells)
          {
            if (tc.Controls.Count > 0)
            {
              foreach (Control ctrl in tc.Controls)
              {
                
                // don't perform HtmlEncode on URL's
                if (ctrl is HyperLink)
                {
                  HyperLink hLnk = (HyperLink)ctrl;
 
                  if (hLnk.Text.Length > 0)
                    hLnk.Text = HttpUtility.HtmlEncode(hLnk.Text);
                  if (hLnk.NavigateUrl.Length > 0)
                    hLnk.NavigateUrl = HttpUtility.UrlEncode(hLnk.NavigateUrl);
                }
                else if (ctrl is LinkButton)
                {
                  LinkButton lButton = (LinkButton)ctrl;
 
                  if (lButton.Text.Length > 0)
                    lButton.Text = HttpUtility.HtmlEncode(lButton.Text);
                }
                else if (ctrl is Button)
                {
                  Button cButton = (Button)ctrl;
 
                  if (cButton.Text.Length > 0)
                    cButton.Text = HttpUtility.HtmlEncode(cButton.Text);
                }
              }
            } 
            else 
            {              
              // there are no controls in the table cell
              // HTMLEncode any available text
              if (tc.Text.Length > 0) 
              {
                if ("&nbsp;" != tc.Text) 
                  tc.Text = HttpUtility.HtmlEncode(tc.Text);
              }
            }
          }
          break;
        
        default:
          break;
      }
     }
   }
...

页面 441、 第 16 章: 确保 Web 服务器的安全节: 禁用 NetBIOS 和 SMB
http://msdn2.microsoft.com/en-us/library/aa302432.aspx

添加下面的备注:

注意: 在生产环境中实施它们之前测试所做的更改。禁用共享或 $ NetBIOS 会产生负面影响适合您的方案的可管理性。例如对于 IIS 使用依赖于 NetBIOS NetUserChangePassword API。如果您允许用户更改通过 IIS 的密码,这将不再起作用。

属性

文章编号: 867600 - 最后修改: 2007年5月8日 - 修订: 1.4
这篇文章中的信息适用于:
  • MSPRESS Improving Web Application Security: Threats and Countermeasures, ISBN 0-7356-1842-9
关键字:?
kbmt kbdocfix kbdocerr KB867600 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 867600
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com