改善 WEB 應用程式安全性: 潛在威脅反制 AND 措施: 校正和註解

重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。

按一下這裡查看此文章的英文版本:867600
本文已封存。本文係以「現狀」提供且不會再更新。
結論
這份文件包含註解、 更正,與 Microsoft 圖樣 (& I) 作法書籍與相關的已知錯誤的相關資訊增強 Web 應用程式的安全性: 潛在威脅及因應對策 》,ISBN 0-7356-1842年-9

我們找到的任何錯誤,會更新網頁版本的活頁簿。您可能會發現許多或所有的下面錯誤已經在 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 屬性設定為多時,唯一編碼輸出的控制項將為 TextBox 控制項。如果您將任何其他控制項繫結至含有惡意 XSS 程式碼的資料時,會在用戶端上執行程式碼。如此一來從資料庫擷取資料,您無法確定資料是否有效 (或許是因為它是與其他應用程式共用的資料庫),編碼資料之前將傳回給用戶端。

To:

資料繫結的控制項都是可繫結至透過繼承的公用資料元件的 Web 控制項 ‘ 資料來源 ’ 屬性。若要提一些,您會發現 DataGrid、 清單方塊和 DropDownList 要經常使用。 並非所有資料繫結的控制項執行時顯示資料的編碼方式都擷取從繫結的資料元件 ; 它會因此,您執行非受信任的資料元件上編碼以防止 XSS 攻擊的責任。比方說資料元件不能信任在不同的應用程式都共用單一資料庫的案例中。如果攻擊者能夠藉由執行個體濫用的其中一個應用程式中的弱點) 中插入資料庫的惡意 XSS 程式碼使用非編碼 Web 控制項的繫結到它的所有應用程式將會關閉易受攻擊。僅避免如果可為特定資料元件從輸出都是有效的編碼方式。

不要執行編碼的資料繫結控制項的例子有 DataGrid、 資料清單、 RadioButtonList 及 CheckBoxList。執行資料的編碼方式繫結的控制項可能會有所不同每個特定的控制項。比方說,DataGrid 控制項,有下列選項:
  • 將所有資料行變成範本,以手動方式使用 [DataBinder.Eval 的每一個呼叫上的 [HtmlEncode()/UrlEncode()
  • 覆寫其 DataBinding] 方法如 OnDatabinding 或 OnItemDataBound 之一,並執行其項目上的編碼方式。下列範例說明如何覆寫 OnItemDataBound 方法的 DataGrid 控制項才能進行編碼及其項目由任一個使用 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 會使用 NetUserChangePassword API 它 NetBIOS 而定。如果您允許使用者變更透過 IIS 密碼,這將無法再運作。

0-7356-1842年-9 0735618429 Web 應用程式安全性

警告:本文為自動翻譯

內容

文章識別碼:867600 - 最後檢閱時間:01/11/2015 06:17:55 - 修訂: 1.4

MSPRESS Improving Web Application Security: Threats and Countermeasures, ISBN 0-7356-1842-9

  • kbnosurvey kbarchive kbmt kbdocfix kbdocerr KB867600 KbMtzh
意見反應