我们对代码进行了安全审计,他们提到我们的代码容易受到外部实体(XXE)攻击.我使用以下代码-

string OurOutputXMLString=
"<ce><input><transaction><length>00000</length><tran_type>Login</tran_type></transaction><user><user_id>ce_userid</user_id><subscriber_name>ce_subscribername</subscriber_name><subscriber_id>ce_subscriberid</subscriber_id><group_id>ce_groupid</group_id><permissions></permissions></user><consumer><login_details><username>UnitTester9</username><password>pDhE5AsKBHw85Sqgg6qdKQ==</password><pin>tOlkiae9epM=</pin></login_details></consumer></input></ce>"

 XmlDocument xmlDoc = new XmlDocument();
 xmlDoc.LoadXml(OurOutputXMLString);

在审计报告中,他们说它失败了,因为XML实体可以包含可以在预期控制之外解析的URL.XML实体解析器将try 解析和检索外部引用.如果攻击者控制的XML可以提交给这些函数之一,则攻击者可以访问有关内部网络、本地文件系统或其他敏感数据的信息. 为了避免这种情况,我编写了以下代码,但它不起作用.

MemoryStream stream =
    new MemoryStream(System.Text.Encoding.Default.GetBytes(OurOutputXMLString));

XmlReaderSettings settings = new XmlReaderSettings();

settings.DtdProcessing = DtdProcessing.Prohibit;
settings.MaxCharactersFromEntities = 6000;
XmlReader reader = XmlReader.Create(stream, settings);
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(reader);

但我可以在这里看到,reader没有任何值可以加载到xmlDoc(XmlDocument)中.

推荐答案

外部资源通过XmlDocument.XmlResolver物业提供的XmlResolver解决.如果XML文档**不应包含任何外部资源**(例如DTD或模式),只需将此属性设置为null:

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.XmlResolver = null;
xmlDoc.LoadXml(OurOutputXMLString);

如果您想筛选这些URL的来源(例如,只允许某些域),只需从XmlUrlResolver派生自己的类并重写ResolveUri()方法即可.在那里,您可以判断URL是什么,并对其进行清理(例如,您可以只允许本地网络内的URL或来自受信任来源的URL).

例如:

class CustomUrlResovler : XmlUrlResolver
{
    public override Uri ResolveUri(Uri baseUri, string relativeUri)
    {
        Uri uri = new Uri(baseUri, relativeUri);
        if (IsUnsafeHost(uri.Host))
            return null;

        return base.ResolveUri(baseUri, relativeUri);
    }

    private bool IsUnsafeHost(string host)
    {
        return false; 
    }
}

其中IsUnsafeHost()是判断给定主机是否被允许的自定义函数.请看这里的this post,以了解一些 idea .只需从ResolveUri()save返回null,即可从此类攻击中返回您的代码.如果允许URI,您只需返回默认的XmlUrlResolver.ResolveUri()实现即可.

要使用它,请执行以下操作:

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.XmlResolver = new CustomUrlResolver();
xmlDoc.LoadXml(OurOutputXMLString);

有关如何解析XML外部资源的更多详细信息,请阅读MS Docs上的Resolving External Resources.如果您的代码比这个示例更复杂,那么您肯定应该阅读Remarks section for XmlDocument.XmlResolver属性.

Asp.net相关问答推荐

502 DotNet WebApplication的网关nginx已损坏

WebAPI 请求流支持

如何使用 json 将复杂类型传递给 ASP.NET MVC 控制器

在视图 Mvc.net 中访问路由值

我可以在 Visual Studio 2010 中将任务列表项添加到 csHTML 吗?

正在检索组件的 COM 类工厂......错误:80070005 访问被拒绝. (来自 HRESULT 的异常:0x80070005 (E_ACCESSDENIED))

我应该如何在类和应用层之间传递数据?

是否应该将 project.lock.json 文件签入源代码管理? (ASP.NET 核心 1.0)

Asp.net 中的下拉列表验证使用必填字段验证器

LINQ to Entities 无法识别 MVC 4 中的System.String ToString()方法

带有完整内存错误的 WCF 服务(内存门判断失败,因为可用内存) - 如何解决

设置 Response.Status 生成HTTP 状态字符串无效异常

从 IFrame 重定向父页面

带有 ASP.NET WebMethod 的 Jquery AJAX 返回整个页面

如何从 Web API 应用程序返回 PDF

回发不适用于 aspx 页面作为默认文档

Web API 必填参数

System.Reflection.Assembly.LoadFile 锁定文件

以编程方式滚动到锚标记

Request.UserHostAddress 和 Request.ServerVariables["REMOTE_ADDR"].ToString() 有什么区别