簡體   English   中英

從URL讀取XML並保護它

[英]read XML from URL and secure it

我有一個關於安全性的一般性問題。 我有自己的Web應用程序,我想通過閱讀XML來顯示另一個網站的數據。

但是從外部資源解析XML是不安全的,頁面可能包含有害腳本或其他內容。 解析xml並避免所有可能損害我的網站的腳本的操作。

這是我的解析,但不安全!

        XmlDocument doc1 = new XmlDocument();
        doc1.Load(url);
        XmlElement root = doc1.DocumentElement;
        XmlNodeList nodes = root.SelectNodes("/response/current_observation");

        foreach (XmlNode node in nodes)
        {
            string tempf = node["node1"].InnerText;
            string tempc = node["node2"].InnerText;


            label2.Text = tempf;
            label4.Text = tempc;

將數據讀取到一個類中,然后在我的應用程序中顯示它可能是解決方案?

您可以查看本文: 如何防止跨站點腳本安全問題

從文章:


問題

根本的問題是許多網頁顯示未經驗證的輸入。 如果輸入未經驗證,則可以將惡意腳本嵌入到輸入中。 如果服務器端腳本隨后顯示此未經驗證的輸入,則該腳本在瀏覽器上運行,就像受信任的站點生成了它一樣。

后果

如果未驗證對動態網頁的輸入,則可能會遇到以下問題:

  • 數據完整性可能會受到損害。
  • 可以設置和讀取Cookie。
  • 用戶輸入可以被攔截。
  • 客戶端可以在可信源的上下文中執行惡意腳本。

哪些網頁有風險? 本質上,該問題會影響基於未經驗證的輸入的動態頁面創建。 典型示例包括以下類型的網頁:

  • 根據用戶輸入返回結果頁面的搜索引擎。
  • 登錄頁面將用戶帳戶存儲在數據庫,Cookie等中,然后將用戶名寫出到客戶端。
  • 用於處理信用卡信息的Web表單。

預防

本節介紹了幾種防止跨站點腳本安全攻擊的方法。 評估您的具體情況,以確定哪種技術最適合您。 重要的是要注意,在所有技術中,您都是在驗證從輸入而非可信腳本接收的數據。 本質上,預防意味着您通過對例程輸入進行健全性檢查來遵循良好的編碼習慣。

以下列表概述了防止跨站點腳本攻擊的一般方法:

  • 根據輸入參數對輸出進行編碼。
  • 過濾特殊字符的輸入參數。
  • 根據輸入參數過濾輸出特殊字符。

篩選或編碼時,必須為網頁指定字符集,以確保篩選器正在檢查適當的特殊字符。 插入到您的Web頁中的數據應篩選出基於特定字符集被認為是特殊的字節序列。 一個流行的字符集是ISO 8859-1,它是HTML和HTTP早期版本中的默認字符集。 更改這些參數時,必須考慮本地化問題。

根據特殊字符的輸入參數對輸出進行編碼

對以HTML格式寫出的輸入進行編碼。 此技術對輸入過程中由於某些原因未驗證的數據有效。 通過使用URLEncodeHTMLEncode ,可以防止執行惡意腳本。

以下代碼段演示了如何使用Active Server Pages(ASP)頁面中的URLEncodeHTMLEncode

<%
      var BaseURL = http://www.example.com/search2.asp?searchagain=;
      Response.write("<a href=\"" + BaseUrl +
      Server.URLEncode(Request.QueryString("SearchString")) +
      "\">click-me</a>");
%>
<% Response.Write("Hello visitor <I>" +
      Server.HTMLEncode(Request.Form("UserName")) +
      "</I>");
%>

如果對HTML和URL進行編碼,則可能需要指定代碼頁,就像過濾數據時一樣。

重要的是要注意,在將要顯示的字符串上調用HTMLEncode將阻止執行其中的任何腳本,從而避免了該問題。 過濾特殊字符的輸入參數

過濾輸入的方法是從輸入中刪除一些或所有特殊字符。 特殊字符是使腳本能夠在HTML流中生成的字符。 特殊字符包括以下內容:

< > " ' % ; ) ( & + -

請注意,您的個人情況可能需要過濾除特殊字符之外的其他字符或字符串。

盡管過濾可能是一種有效的技術,但有一些警告:

  • 過濾可能不適用於某些輸入。 例如,在從HTML表單接收輸入的方案中,您可以選擇編碼之類的方法(請參見下文)。
  • 實際上,可能需要將一些過濾的字符輸入到服務器端腳本中。

以下使用JavaScript編寫的示例過濾器演示了如何刪除特殊字符:

function RemoveBad(strTemp) { 
    strTemp = strTemp.replace(/\<|\>|\"|\'|\%|\;|\(|\)|\&|\+|\-/g,""); 
    return strTemp;
} 

以下代碼在存儲用戶供以后使用之前處理用戶輸入。

<% Session("StoredPreference") = RemoveBad(Request.Cookies("UserColor"));
         var TempStr = RemoveBad(Request.QueryString("UserName"));

根據輸入參數過濾輸出特殊字符

該技術類似於過濾輸入,除了過濾輸入給客戶端的字符。 盡管這可能是一種有效的技術,但對於寫出HTML元素的網頁可能會帶來問題。

例如,在寫出<TABLE>元素的頁面上,刪除特殊字符的通用函數會去除<和>字符,從而破壞<TABLE>標記。 因此,為了使該技術有用,您將僅過濾傳入的數據或用戶先前輸入並存儲在數據庫中的數據。

惡意數據的可能來源

雖然此問題適用於使用輸入來動態生成HTML的任何頁面,但以下是一些可能的惡意數據源,可幫助您檢查潛在的安全風險:

  • 請求參數
  • 餅干
  • 發布數據
  • URL和URL片段,例如PATH_INFO
  • 從用戶檢索的以某種方式(例如數據庫)保留的數據

結論

總之,以下是有關跨站點腳本安全問題的要記住的關鍵點:

  • 該問題會影響基於未經驗證的輸入的動態頁面創建。
  • 忽略輸入數據的完整性檢查可能會帶來意外的安全隱患。 通過良好的開發標准(例如輸入驗證)可以避免此問題。
  • 您需要在每個站點,頁面甚至現場的基礎上評估解決方案,並使用一種有意義的技術。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM