热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

五、XML外部实体

五、XML 外部实体可扩展标记语言(XML)是用于定义数据的标准标记语言。XML 也是 ASP.NET Core web 应用可

五、XML 外部实体

可扩展标记语言XML)是用于定义数据的标准标记语言。XML 也是 ASP.NET Core web 应用可以用来解析信息的格式。为了实现这一点,开发人员可以使用框架中随时可用的任意数量的.NET XML 解析器。

作为输入源的 XML 很可能容易被恶意数据注入。名为XML 外部实体XXE的功能允许 XML 使用 URL 或文件路径定义自定义实体。这种用 XML 表示外部实体的能力可能被滥用或利用。不受限制的外部实体引用可使攻击者将敏感信息和文件发送到应用的受信任域之外,并发送到行为人控制的服务器。此漏洞的存在可能导致拒绝服务DoS攻击,使整个应用无法访问,因为请求泛滥,或文件包含攻击,对手可以未经授权访问文件。

为了确保代码的安全性并防止这些类型的基于 XML 的注入攻击,必须使用XML 模式XSD验证 XML。XSD 的使用确保了 XML 与所需格式的一致性。此外,必须仔细配置和设置要使用的.NET 解析器,以避免 XML 解析器出现任何意外行为。

在本章中,我们将介绍以下配方:


  • 启用 XML 验证

  • XmlDocument固定 XXE 注入液

  • XmlTextReader固定 XXE 注入液

  • LINQXML固定 XXE 注入

这些方法将教会我们如何向 ASP.NET Core web 应用添加 XML 模式验证,以及如何修复代码中允许注入和处理外部 XML 实体的各种漏洞。

技术要求

这本书是为配合 VisualStudio 代码、Git 和.NET5.0 而编写和设计的。ASP.NET Core Razor 页面中提供了配方中的代码示例。示例解决方案还使用 SQLite 作为数据库引擎,以简化设置。本章的完整代码示例可在上找到 https://github.com/PacktPublishing/ASP.NET-Core-Secure-Coding-Cookbook/tree/main/Chapter05 。

启用 XML 验证

一个XSD指定了 XML 的组成方式。模式有助于定义 XML 结构,并防止不需要的元素、属性和文本。如果没有 XSD,.NET 解析器将盲目处理 XML 数据,并增加代码中 XXE 注入漏洞的风险。

本食谱将教您如何创建使用 XSD 和验证 XML 数据的方法。

准备好了吗

为了完成本章中的菜谱,我们需要一个示例网上银行应用。

打开命令 shell 并通过克隆 ASP.NET Secure Codeing Cookbook 存储库下载示例网上银行应用,如下所示:

git clone https://github.com/PacktPublishing/ASP.NET-Core-Secure-Coding-Cookbook.git

运行示例应用以验证没有生成或编译错误。在命令 shell 中,导航到位于\Chapter05\missing-validation\before\OnlineBankingApp的示例应用文件夹,并运行以下命令:

dotnet build

dotnet build命令将构建示例OnlineBankingApp项目及其依赖项。

怎么做…

让我们来看看这个食谱的步骤:


  1. 在“开始练习”文件夹中,通过键入以下命令来启动 Visual Studio 代码:

    cs
    code .


  2. Under the wwwroot directory, right-click and select New File. Name the file Knowledgebase.xsd:

    Figure 5.1 – Adding a new file

    图 5.1–添加新文件


  3. Knowledgebase.xsd文件中添加以下标记(该xsd文件的全部内容可在\Chapter05\missing-validation\after\OnlineBankingApp下的已完成练习文件夹中找到):

    cs











    />




    // markup removed for brevity


  4. 既然我们已经创建了模式,我们将使用这个xsd文件来验证Knowledgebase.xml的格式,它包含我们知识库的数据。


  5. 打开\Services\KnowledgebaseServices.cs并添加对以下命名空间的引用:

    cs
    using System.Xml.Schema;
    using System.IO;


  6. 这些名称空间允许您使用验证 XML 模式所需的类,并为 XML 文件上的文件输入输出操作提供一些方法。


  7. 我们需要重构Search方法中的代码,以便它可以使用我们在步骤 3中创建的模式。在声明webroot变量的位置之后和声明file的位置之前插入以下代码:

    cs
    var webRoot = _env.WebRootPath;
    var schemaSet = new XmlSchemaSet();
    var xsdFile = System.IO.Path.Combine(webRoot, "Knowledgebase.xsd");
    using (System.IO.FileStream stream = File.OpenRead(xsdFile))
    {
    schemaSet.Add(XmlSchema.Read(stream, (s, e) =>
    {
    var x = e.Message;
    }));
    }
    XmlReaderSettings settings = new XmlReaderSettings();
    settings.ValidatiOnType= ValidationType.Schema;
    settings.Schemas = schemaSet;
    settings.DtdProcessing = DtdProcessing.Ignore;
    var file = System.IO.Path.Combine(webRoot, "Knowledgebase.xml");


  8. 声明一个XmlReader对象,该对象将以filesettings作为前面代码行中的参数:

    cs
    XmlReader reader = XmlReader.Create(file, settings);


  9. Modify this line of code so that the XmlDocument instance will load the reader instead of the file:

    cs
    xmlDoc.Load(reader);

    XmlDocument对象现在加载XmlReader,其中包括模式验证。



它是如何工作的…

knowledgebase.xsd文件包含knowledgebase.xml中允许的有效元素和属性。这个 XSD 还描述了元素的预期数据类型。例如,期望sensitivity元素为string数据类型。knowledgebase.xml文件应遵循此格式。否则,验证过程将失败。

我们在\Services\KnowledgebaseServices.cs中添加了对System.Xml.Schema名称空间的引用,该名称空间包含我们需要验证的类。从这个引用中,我们使用了XmlSchemaSet类来存储knowledgebase.xsd模式。XmlSchemaSet类可以包含多个模式,但我们的配方将只使用一个模式。

然后,我们用File.OpenRead(xsdFile)方法创建了一个FileStream对象。xsdFile对象表示knowledgebase.xsd并作为参数传递给File.OpenRead。然后将FileStream对象提供给XmlSchema.Read方法,并将knowledgebase.xsd添加到schemaSet集合中。

XmlReaderSettings属性的ValidationType被赋值为ValidationType.Schema,该值设置新的XmlReader以使用 XSD 模式执行验证。

通过XmlReader.Create方法,我们使用前面几行中定义的XmlReaderSettings属性创建了XmlReaderreader实例。最后,我们将 reader 对象传递给XmlDocument实例,让应用开始解析knowledgebase.xml文件。

笔记

与 XML 类似,XSD 也可以具有外部引用,并且可以来自不受信任的资源。需要进行额外的验证,以确保源是可信的,并且您没有使用来自恶意 XSD 的恶意字符串。

还有更多…

XML 的另一种形式是可扩展样式表语言转换,或者简称为的XSLT。该语言用于将 XML 文档转换为其他文档格式,如纯文本文件或 HTML。

您可以使用System.Xml.Xsl命名空间中的XslCompiledTransform类将 XSLT 加载到 ASP.NET web 应用中。调用LoadTransform方法加载 XSLT 并将其转换为特定格式:

XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load("Knowledgebase.xsl");
xslt.Transform("Knowledgebase.xml", "Knowledgebase.html");

然而,与任何形式的输入一样,XSLT 也可能被污染或破坏以加载恶意的 XXE。要安全地编译 XSLT,请传递一个null``XmlResolver来停止解析外部资源,并将 XmlReaderSetting 的DtdProcessing设置为Ignore

为了防止 XSLT 嵌入脚本块和使用危险的document()函数,我们将 XSLT 设置的EnableScriptEnableDocumentFunction设置为false

XslCompiledTransform xslt = new XslCompiledTransform();
XmlReaderSettings settings = new XmlReaderSettings();
settings.DtdProcessing = DtdProcessing.Ignore;
var file = System.IO.Path.Combine(webRoot, "Knowledgebase.xsl");
XmlReader reader = XmlReader.Create(file, settings);
XsltSettings xsltSettings = new XsltSettings();
xsltSettings.EnableDocumentFunction = false;
xsltSettings.EnableScript = false;
xslt.Load(reader, xsltSettings, null);

笔记

默认情况下,EnableDocumentFunctionEnableScript属性被禁用并设置为false

在将这些对象传递到重载的Load方法之前,使用正确的设置配置这些对象有助于防止 XSLT 注入和 XXE 攻击。

用 XmlDocument 固定 XXE 注入剂

XmlDocument类实际上是.NET 应用的 XML 解析器。这个 XML 解析器对象通常用于加载、修改和删除内存中的 XML。它有一个XmlResolver属性,允许使用外部 XML 资源,如 DTD。

文档类型定义,最常见的称为DTD,类似于 XML 文件,但包含 XML 的组成或结构信息。它可以有一个ENTITY元素,可以是内部的,也可以是外部的。当XDocument使用 DTD 解析 XML 文件时,该 XML 解析器将处理该文件及其ENTITY声明。

让我们看一下带有恶意注入的ENTITY声明的 XML 文件的某些内容。这是一个已知的十亿笑声攻击的经典例子,这是一种拒绝服务DoS)攻击,目标是XmlDocument等 XML 解析器。加载此 XML 将导致 ASP.NET Core web 应用崩溃或无响应:






]>
&lol3;

此外,意外地设置您的不安全自定义XmlResolver可能允许将来自不受信任源或主机的 DTD 包含在knowledgebase.xml解析中,可能导致XXE 注入

这个方法将向您展示如何禁用 DTD,从而使您的代码在解析 XML 时更加安全。

准备好了吗

使用 Visual Studio 代码,打开位于\Chapter05\xxe-injection01\before\OnlineBankingApp\的示例网上银行应用文件夹。

怎么做…

让我们来看看这个食谱的步骤:


  1. 在起始练习文件夹中,通过键入以下命令启动 Visual Studio 代码:

    cs
    code .


  2. 打开Services\KnowledgebaseService.cs文件,注意分配给XmlUrlResolver对象的行:

    cs
    XmlUrlResolver resolver = new XmlUrlResolver();
    XmlDocument xmlDoc = new XmlDocument();
    xmlDoc.XmlResolver = resolver;
    xmlDoc.Load(file);


  3. Assign the XmlResolver property of xmlDoc to null:

    cs
    XmlDocument xmlDoc = new XmlDocument();
    xmlDoc.XmlResolver = null;
    xmlDoc.Load(file);

    XmlResolver设置为null将禁止 DTD 加载到knowledgebase.xml文件中。

    笔记

    当 XML 文档中存在外部实体或DTD时,当应用尝试解析XML时会抛出XMLException



它是如何工作的…

在我们的OnlineBankApp示例应用中,XMLResolver被实例化并分配给 xmlDoc 的XmlResolver属性。为XmlResolver属性设置值表示允许加载 DTD 或解析外部实体引用。

然而,为了缓解代码中的这个漏洞,我们必须取消XmlResolver引用,从而防止恶意 DTD 被加载。

还有更多…

如果需要解析 ASP.NET Core web 应用中的 DTD,则必须使用XmlSecureResolver类并将其实例分配给XmlDocumentXmlResolver属性。XmlSecureResolverXmlResolver类的安全实现,限制对资源的访问。

要使用此类实现安全的 DTD 解析,只需将 URL 作为XmlSecureResolver构造函数的第二个参数传递,即可定义允许的资源。明确声明了https://localhost:5001URL,表示我们只允许来自此 URL 的资源:

XmlSecureResolver resolver = new XmlSecureResolver(new XmlUrlResolver(), "https://localhost:5001");
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.XmlResolver = resolver;
xmlDoc.Load(file);

XmlSecureResolver对象用PermissionSet包装XmlResolver对象,指定允许的访问。在内部,它调用PermitOnly方法,正如其名称所示,该方法设置了不会导致调用代码失败的权限。

用 XmlTextReader 固定 XXE 注入液

XmlDocument类似,另一个快速、非缓存、仅转发到 XML 的解析器选项是XmlTextReader。这种高性能解析器的一个主要缺点是缺乏数据验证。XmlTextReader还允许您在默认情况下处理 DTD,如果您的 XML 源不可信,这可能会引起关注。

此配方将向您展示如何使用XmlTextReader.禁用 DTD 处理

准备好了吗

使用 Visual Studio 代码,打开位于\Chapter05\xxe-injection02\before\OnlineBankingApp\的示例网上银行应用文件夹。

怎么做…

让我们来看看这个食谱的步骤:


  1. 在起始练习文件夹中,通过键入以下命令启动 Visual Studio 代码:

    cs
    code .


  2. Open the Services\KnowledgebaseService.cs file. This version of the OnlineBankingApp sample solution is using XmlTextReader to parse the Knowledgebase.xml file:

    cs
    XmlTextReader xmlReader = new XmlTextReader(file);
    xmlReader.DtdProcessing = DtdProcessing.Parse;
    XPathDocument xmlDoc = new XPathDocument(xmlReader);

    xmlReaderDtdProcessing属性赋值给DtdProcessing.Ignoreenum值:

    cs
    XmlTextReader xmlReader = new XmlTextReader(file);
    xmlReader.DtdProcessing = DtdProcessing.Ignore;
    XPathDocument xmlDoc = new XPathDocument(xmlReader);

    DtdProcessing属性设置为DtdProcessing.Ignore将阻止处理 DTD 并忽略标记。DOCTYPE是一种标记形式,用于通知浏览器文档使用的 HTML 版本。



它是如何工作的…

遵循以下步骤:


  1. 当 XmlTextReader 的DtdProcessing属性设置为enumDtdProcessing.Parse时,这表示将处理 DTD。如果一个坏角色将恶意实体引用节点注入到knowledgebase.xml文件中,那么允许处理 DTD 可能是危险的。

  2. 指定DtdProcessing.IgnoreDtdProcessing属性使处理 DTD 变得不可能,从而使代码更加安全。


用 LINQ 到 XML 修复 XXE 注入

语言集成查询LINQ是.NET 框架内的一个 API,为编写声明性代码提供类似查询的语法。LINQ 有不同的风格,LINQ 到 XML 就是其中之一。LINQ to XML 是一个内存中的 XML 解析器,允许您执行 XML 转换——从修改元素和节点到序列化。

一般来说,LINQ 到 XML 不受 XXE 注入的影响。XDocument默认已禁用 DTD 处理。但是,当使用不安全的 XML 解析器(如XmlReader)实例化时,这可能是不安全的。此配方将向您展示如何在 LINQ to XML 代码中发现安全漏洞,并通过禁用 DTD 处理来修复该漏洞。

准备好了吗

使用 Visual Studio 代码,打开位于\Chapter05\xxe-injection03\before\OnlineBankingApp\的示例网上银行应用文件夹。

您可以在此文件夹中执行使用 LINQ to XML 修复 XXE 注入的步骤。

怎么做…

让我们来看看这个食谱的步骤:


  1. 在起始练习文件夹中,通过键入以下命令启动 Visual Studio 代码:

    cs
    code .


  2. Open the Services\KnowledgebaseService.cs file. This version of the OnlineBankingApp sample solution is using Linq to XML to parse the Knowledgebase.xml file.

    注意XDocument类的使用和解析 XML 的类似查询的方法:

    cs
    XmlReaderSettings settings = new XmlReaderSettings();
    settings.DtdProcessing = DtdProcessing.Parse;
    settings.MaxCharactersFromEntities = 1024;
    settings.MaxCharactersInDocument = 2048;
    XmlReader reader = XmlReader.Create(file, settings);
    XDocument xmlDoc = XDocument.Load(reader);
    var query = from i in xmlDoc.Element("knowledgebase")
    .Elements("knowledge")
    where
    (i.Element("topic").ToString() .Contains(input) == true ||
    i.Element("description").ToString() .Contains(input) == true) &&
    i.Element("sensitivity").ToString() .Contains("Public") == true
    select new
    {
    Topic = (string)i.Element("topic"),
    Description =
    (string)i.Element("description")
    };


  3. XmlReader类的Create方法被一个易受攻击的XmlReaderSettings调用。正如我们在前面的配方中看到的,我们必须禁用 DTD 处理。这可以通过将DtdProcessing设置为DtdProcessing.Prohibit

    cs
    XmlReaderSettings settings = new XmlReaderSettings();
    settings.DtdProcessing = DtdProcessing.Prohibit;
    settings.MaxCharactersFromEntities = 1024;
    settings.MaxCharactersInDocument = 2048;

    的枚举值来实现
    4. 将XmlReaderSettings对象的DtdProcessing属性从DtdProcessing.Parse更改为DtdProcessing.Prohibit将阻止 DTD 处理,并且在 XML 中存在 DTD 时也会抛出XmlException
    5. 现在,我们必须将XmlReaderSettings实例的MaxCharactersFromEntities赋值为1024

    cs
    XmlReaderSettings settings = new XmlReaderSettings();
    settings.DtdProcessing = DtdProcessing.Prohibit;
    settings.MaxCharactersFromEntities = 1024;
    settings.MaxCharactersInDocument = 2048;


  4. 分配MaxCharactersFromEntities将限制扩展实体的大小并防止滥用。


  5. We must also explicitly assign MaxCharactersInDocument of the XmlReaderSettings object with a value of 2048:

    cs
    XmlReaderSettings settings = new XmlReaderSettings();
    settings.DtdProcessing = DtdProcessing.Prohibit;
    settings.MaxCharactersFromEntities = 1024;
    settings.MaxCharactersInDocument = 2048;

    MaxCharactersInDocument属性的值指定为2048表示 XML 文件中允许的最大字符数为2048。同样,这有助于防止攻击者可能滥用。

    笔记

    添加一个try-catch语句来处理XmlException的可能性。始终在代码中练习安全的错误处理。本书的最后一章将详细介绍这一最佳实践。



它是如何工作的…

KnowledgebaseService类中,我们有一个Search方法对整个Knowledgebase.xml文件执行搜索,其中包含帮助查询数据。当用户点击网页上的搜索时,它会调用此方法并创建XmlReaderXDocument类的实例。

XDocumentXmlReader实例化。XmlReader的属性基于知识库 XML 数据及其XmlReaderSettings。虽然这是用 XML 数据填充解析器的有效方法,XmlReaderXmlReaderSettingsDtdProcessing属性设置为DtdProcessing.Parse,从而使用不安全的解析器设置XDocument对象。此设置导致代码易受 XXE 注入攻击。

为了解决这个问题,我们必须选择一个更好的财产价值——要么是DtdProcessing.Ignore要么是DtdProcessing.Prohibit——并将其分配给XmlReaderSettingsDtdProcessing。这两个值都可以防止危险的 DTD 处理。我们在前面的配方中涵盖了DtdProcessing.Ignore属性值,因此我们选择了DtdProcessing.Prohibit

要管理通过 XML 解析器发生的 DTD,请在DtdProcessing.Ignore上选择DtdProcessing.Prohibit属性值。拥有DtdProcessing.Prohibit会引发XmlExceptions,您可以使用 try-catch 块来处理,而DtdProcessing.Ignore则完全忽略 DTD。

假设攻击者能够输入包含大量数据的任意 XML 文件。这可能会导致系统消耗大量计算资源,从而导致 DOS 攻击。我们可以通过为XmlReaderSettingsMaxCharactersFromEntitiesMaxCharactersInDocument属性分配一个合理的值来防止这种情况发生。这些属性限制了 XML 及其元素和属性的扩展大小。


推荐阅读
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • 单点登录原理及实现方案详解
    本文详细介绍了单点登录的原理及实现方案,其中包括共享Session的方式,以及基于Redis的Session共享方案。同时,还分享了作者在应用环境中所遇到的问题和经验,希望对读者有所帮助。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
  • 本文介绍了在go语言中利用(*interface{})(nil)传递参数类型的原理及应用。通过分析Martini框架中的injector类型的声明,解释了values映射表的作用以及parent Injector的含义。同时,讨论了该技术在实际开发中的应用场景。 ... [详细]
  • 深入理解Java虚拟机的并发编程与性能优化
    本文主要介绍了Java内存模型与线程的相关概念,探讨了并发编程在服务端应用中的重要性。同时,介绍了Java语言和虚拟机提供的工具,帮助开发人员处理并发方面的问题,提高程序的并发能力和性能优化。文章指出,充分利用计算机处理器的能力和协调线程之间的并发操作是提高服务端程序性能的关键。 ... [详细]
author-avatar
欢不是欢7
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有