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

文章翻譯 文章翻譯
文章編號: 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 密碼,這將無法再運作。

屬性

文章編號: 867600 - 上次校閱: 2007年5月8日 - 版次: 1.4
這篇文章中的資訊適用於:
  • MSPRESS Improving Web Application Security: Threats and Countermeasures, ISBN 0-7356-1842-9
關鍵字:?
kbmt kbdocfix kbdocerr KB867600 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本: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