从URL读取XML并保护它

时间:2014-11-15 11:49:29

标签: c# .net xml security xml-parsing

我有一个普遍的问题,关于安全问题。 我有自己的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;

要将数据读入类中,然后在我的应用程序中显示它可能是解决方案??

1 个答案:

答案 0 :(得分:2)

您可以查看这篇文章: How to prevent cross-site scripting security issues

来自文章:


问题

根本问题是许多网页显示未经验证的输入。如果未验证输入,则可以在输入中嵌入恶意脚本。如果服务器端脚本随后显示此未经验证的输入,则该脚本将在浏览器上运行,就像可信站点生成它一样。

分枝

如果未验证对动态网页的输入,则可能会遇到以下问题:

  • 数据完整性可能会受到影响。
  • 可以设置和阅读Cookie。
  • 可以拦截用户输入。
  • 恶意脚本可以由客户端在上下文中执行 值得信赖的来源。

哪些网页存在风险?本质上,该问题会影响基于未经验证的输入的动态页面创建。典型示例包括以下类型的网页:

  • 根据用户输入返回结果页面的搜索引擎。
  • 用于在数据库,Cookie等中存储用户帐户的登录页面 然后将用户名写入客户端。
  • 处理信用卡信息的网络表单。

预防

本节介绍了一些防止跨站点脚本安全攻击的方法。评估您的具体情况,以确定哪种技术最适合您。请务必注意,在所有技术中,您都要验证从输入而非可信脚本收到的数据。从本质上讲,预防意味着您可以通过对您的例程输入进行健全性检查来遵循良好的编码实践。

以下列表概述了防止跨站点脚本攻击的一般方法:

  • 根据输入参数对输出进行编码。
  • 过滤特殊字符的输入参数。
  • 根据特殊字符的输入参数过滤输出。

过滤或编码时,必须为网页指定字符集,以确保过滤器正在检查相应的特殊字符。插入到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>个元素的页面上,删除特殊字符的泛型函数会剥离&lt;和&gt;字符,它会破坏<TABLE>标记。因此,为了使此技术有用,您只能过滤传入的数据或用户先前输入并存储在数据库中的数据。

可能的恶意数据来源

虽然问题适用于使用输入动态生成HTML的任何页面,但以下是一些可能的恶意数据来源,可帮助您检查潜在的安全风险:

  • 查询字符串
  • 缓存
  • 发布数据
  • 网址和网址,例如PATH_INFO
  • 从以某种方式持久化的用户检索的数据,例如 在数据库中

<强>结论

总之,以下是关于跨站点脚本安全问题需要记住的关键点:

  • 该问题会影响基于非输入的动态页面创建 验证。
  • 对输入数据进行完整性检查可能会产生意外的安全性 影响。通过良好的发展可以预防这个问题 输入验证等标准。
  • 您需要在每个站点,页面甚至字段上评估解决方案 基础并使用一种有意义的技术。