繁体   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