<p>xml中的实体引用是一种代码复用和特殊字符处理机制,主要分为预定义实体引用(如、&等)、字符实体引用(如定义,适用于单文档内重复内容;4. 外部实体通过system关键字引用外部文件,提升多文档复用性但存在xxe安全风险。为防止xxe攻击,应禁用外部实体、使用安全解析器、验证输入、限制权限并采用白名单策略。选择实体类型时,若内容短且仅限本文件使用,则用内部实体;若需跨文件共享或内容较长,则用外部实体,但须加强安全防护。正确使用实体引用可提高开发效率、支持国际化、简化配置管理与版本控制。</p><p><img src="https://img.php.cn/upload/article/001/221/864/175421964639365.jpg" alt="XML中的实体引用(Entity Reference)有哪些?怎么定义自定义实体?"></p><p>XML中的实体引用,说白了,就是一种偷懒的方式,或者说,一种代码复用的方式。它们允许你在XML文档中插入预定义的文本片段,避免重复输入相同的内容。当然,更重要的是,它们可以用来引用特殊字符,比如 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;"><</pre>
</div> 或 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">></pre>
&lt;/div&gt;,这些字符在XML中有特殊的含义。&lt;/p&gt;&lt;h3&gt;解决方案&lt;/h3&gt;&lt;p&gt;XML实体引用主要分为以下几种:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;预定义实体引用:&lt;/strong&gt; 这是XML规范自带的,可以直接使用。最常见的有:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;div class="code" style="position:relative; padding:0px; margin:0px;"&gt;&lt;pre class="brush:php;toolbar:false;"&gt;<&lt;/pre&gt;
&lt;/div&gt; 代表小于号 &lt;div class="code" style="position:relative; padding:0px; margin:0px;"&gt;&lt;pre class="brush:php;toolbar:false;"&gt;&lt;&lt;/pre&gt;
&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div class="code" style="position:relative; padding:0px; margin:0px;"&gt;&lt;pre class="brush:php;toolbar:false;"&gt;>&lt;/pre&gt;
&lt;/div&gt; 代表大于号 &lt;div class="code" style="position:relative; padding:0px; margin:0px;"&gt;&lt;pre class="brush:php;toolbar:false;"&gt;&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div class="code" style="position:relative; padding:0px; margin:0px;"&gt;&lt;pre class="brush:php;toolbar:false;"&gt;&&lt;/pre&gt;
&lt;/div&gt; 代表与符号 &lt;div class="code" style="position:relative; padding:0px; margin:0px;"&gt;&lt;pre class="brush:php;toolbar:false;"&gt;&&lt;/pre&gt;
&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div class="code" style="position:relative; padding:0px; margin:0px;"&gt;&lt;pre class="brush:php;toolbar:false;"&gt;&apos;&lt;/pre&gt;
&lt;/div&gt; 代表单引号 &lt;div class="code" style="position:relative; padding:0px; margin:0px;"&gt;&lt;pre class="brush:php;toolbar:false;"&gt;’&lt;/pre&gt;
&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div class="code" style="position:relative; padding:0px; margin:0px;"&gt;&lt;pre class="brush:php;toolbar:false;"&gt;"&lt;/pre&gt;
&lt;/div&gt; 代表双引号 &lt;div class="code" style="position:relative; padding:0px; margin:0px;"&gt;&lt;pre class="brush:php;toolbar:false;"&gt;"&lt;/pre&gt;
&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;这些预定义实体,你无需任何声明,直接就能在XML文档中使用。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;字符实体引用:&lt;/strong&gt; 这种引用方式使用Unicode字符的十进制或十六进制表示。例如,&lt;div class="code" style="position:relative; padding:0px; margin:0px;"&gt;&lt;pre class="brush:php;toolbar:false;"&gt;&lt;&lt;/pre&gt;
&lt;/div&gt; 和 &lt;div class="code" style="position:relative; padding:0px; margin:0px;"&gt;&lt;pre class="brush:php;toolbar:false;"&gt;&lt;&lt;/pre&gt;
&lt;/div&gt; 都代表小于号 &lt;div class="code" style="position:relative; padding:0px; margin:0px;"&gt;&lt;pre class="brush:php;toolbar:false;"&gt;&lt;&lt;/pre&gt;
&lt;/div&gt;。 这种方式可以表示任何Unicode字符,非常灵活。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;内部实体引用:&lt;/strong&gt; 这是你可以在XML文档内部定义的实体。 它允许你用一个简短的名称来代表一段文本。 定义方式如下:&lt;/p&gt;&lt;div class="code" style="position:relative; padding:0px; margin:0px;"&gt;&lt;pre class=’brush:xml;toolbar:false;’&gt;&lt;!DOCTYPE root [ &lt;!ENTITY myEntity "This is my entity text."&gt;]&gt;&lt;root&gt; &lt;element&gt;&myEntity;&lt;/element&gt;&lt;/root&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;在这个例子中,&lt;div class="code" style="position:relative; padding:0px; margin:0px;"&gt;&lt;pre class="brush:php;toolbar:false;"&gt;&lt;!ENTITY myEntity "This is my entity text."&gt;&lt;/pre&gt;
&lt;/div&gt; 定义了一个名为 &lt;div class="code" style="position:relative; padding:0px; margin:0px;"&gt;&lt;pre class="brush:php;toolbar:false;"&gt;myEntity&lt;/pre&gt;
&lt;/div&gt; 的内部实体,它的值是 &lt;div class="code" style="position:relative; padding:0px; margin:0px;"&gt;&lt;pre class="brush:php;toolbar:false;"&gt;"This is my entity text."&lt;/pre&gt;
&lt;/div&gt;。 在XML文档中,你可以使用 &lt;div class="code" style="position:relative; padding:0px; margin:0px;"&gt;&lt;pre class="brush:php;toolbar:false;"&gt;&myEntity;&lt;/pre&gt;
&lt;/div&gt; 来引用这段文本。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;外部实体引用:&lt;/strong&gt; 这种实体引用指向外部文件。 它允许你将XML文档的一部分内容放在单独的文件中,然后在主文档中引用它。 定义方式如下:&lt;/p&gt;&lt;div class="code" style="position:relative; padding:0px; margin:0px;"&gt;&lt;pre class=’brush:xml;toolbar:false;’&gt;&lt;!DOCTYPE root [ &lt;!ENTITY extEntity SYSTEM "external.txt"&gt;]&gt;&lt;root&gt; &lt;element&gt;&extEntity;&lt;/element&gt;&lt;/root&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;在这个例子中,&lt;div class="code" style="position:relative; padding:0px; margin:0px;"&gt;&lt;pre class="brush:php;toolbar:false;"&gt;&lt;!ENTITY extEntity SYSTEM "external.txt"&gt;&lt;/pre&gt;
&lt;/div&gt; 定义了一个名为 &lt;div class="code" style="position:relative; padding:0px; margin:0px;"&gt;&lt;pre class="brush:php;toolbar:false;"&gt;extEntity&lt;/pre&gt;
&lt;/div&gt; 的外部实体,它指向名为 &lt;div class="code" style="position:relative; padding:0px; margin:0px;"&gt;&lt;pre class="brush:php;toolbar:false;"&gt;external.txt&lt;/pre&gt;
&lt;/div&gt; 的文件。 在XML文档中,你可以使用 &lt;div class="code" style="position:relative; padding:0px; margin:0px;"&gt;&lt;pre class="brush:php;toolbar:false;"&gt;&extEntity;&lt;/pre&gt;
&lt;/div&gt; 来引用这个文件的内容。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;注意:&lt;/strong&gt; 使用外部实体引用时,需要注意安全问题,特别是当XML文档来自不可信的来源时。 恶意攻击者可能会利用外部实体引用来读取服务器上的敏感文件,或者执行恶意代码。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h3&gt;如何定义自定义实体?&lt;/h3&gt;&lt;p&gt;定义自定义实体,其实就是在XML文档的DTD(Document Type Definition)中声明实体。 DTD可以嵌入在XML文档中(内部DTD),也可以放在单独的文件中(外部DTD)。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1. 内部DTD中的实体定义:&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;上面已经展示了内部实体的定义方式。 关键在于 &lt;div class="code" style="position:relative; padding:0px; margin:0px;"&gt;&lt;pre class="brush:php;toolbar:false;"&gt;&lt;!DOCTYPE root [ … ]&gt;&lt;/pre&gt;
&lt;/div&gt; 这个部分,它定义了文档类型,并且可以在方括号内声明实体。 实体声明的语法是 &lt;div class="code" style="position:relative; padding:0px; margin:0px;"&gt;&lt;pre class="brush:php;toolbar:false;"&gt;&lt;!ENTITY entityName "entityValue"&gt;&lt;/pre&gt;
&lt;/div&gt;。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2. 外部DTD中的实体定义:&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果想把实体定义放在单独的文件中,可以这样做:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;创建DTD文件 (例如:&lt;div class="code" style="position:relative; padding:0px; margin:0px;"&gt;&lt;pre class="brush:php;toolbar:false;"&gt;myentities.dtd&lt;/pre&gt;
&lt;/div&gt;):&lt;/strong&gt;&lt;/p&gt;&lt;div class="code" style="position:relative; padding:0px; margin:0px;"&gt;&lt;pre class=’brush:xml;toolbar:false;’&gt;&lt;!ENTITY copyright "Copyright 2023 MyCompany"&gt;&lt;!ENTITY version "1.0"&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;在XML文档中引用DTD文件:&lt;/strong&gt;&lt;/p&gt;&lt;div class="code" style="position:relative; padding:0px; margin:0px;"&gt;&lt;pre class=’brush:xml;toolbar:false;’&gt;&lt;!DOCTYPE root SYSTEM "myentities.dtd"&gt;&lt;root&gt; &lt;element&gt;&copyright;&lt;/element&gt; &lt;version&gt;&version;&lt;/version&gt;&lt;/root&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;这里的 &lt;div class="code" style="position:relative; padding:0px; margin:0px;"&gt;&lt;pre class="brush:php;toolbar:false;"&gt;&lt;!DOCTYPE root SYSTEM "myentities.dtd"&gt;&lt;/pre&gt;
&lt;/div&gt; 告诉XML解析器去读取 &lt;div class="code" style="position:relative; padding:0px; margin:0px;"&gt;&lt;pre class="brush:php;toolbar:false;"&gt;myentities.dtd&lt;/pre&gt;
&lt;/div&gt; 文件,并使用其中定义的实体。&lt;/p&gt; &lt;div class="aritcle_card"&gt; &lt;a class="aritcle_card_img" href="/ai/754"&gt; &lt;img src="https://img.php.cn/upload/ai_manual/000/000/000/175679972542147.png" alt="秒哒"&gt; &lt;/a&gt; &lt;div class="aritcle_card_info"&gt; &lt;a href="/ai/754"&gt;秒哒&lt;/a&gt; &lt;p&gt;秒哒-不用代码就能实现任意想法&lt;/p&gt; &lt;div class=""&gt; &lt;img src="/static/images/card_xiazai.png" alt="秒哒"&gt; &lt;span&gt;535&lt;/span&gt; &lt;/div&gt; &lt;/div&gt; &lt;a href="/ai/754" class="aritcle_card_btn"&gt; &lt;span&gt;查看详情&lt;/span&gt; &lt;img src="/static/images/cardxiayige-3.png" alt="秒哒"&gt; &lt;/a&gt; &lt;/div&gt; &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;一些注意事项:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;实体名称必须以字母开头,可以包含字母、数字、句点和连字符。&lt;/li&gt;&lt;li&gt;实体值可以是任何文本,包括其他实体引用。&lt;/li&gt;&lt;li&gt;使用外部实体时,确保DTD文件的路径是正确的,并且XML解析器有权访问该文件。&lt;/li&gt;&lt;li&gt;为了避免命名冲突,最好为实体名称添加前缀或后缀。&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;XML实体引用有什么实际应用场景?&lt;/h3&gt;&lt;p&gt;XML实体引用在很多场景下都非常有用。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;代码复用:&lt;/strong&gt; 避免重复输入相同的文本,提高开发效率。 例如,可以在DTD中定义公司的名称、地址等信息,然后在XML文档中多次引用。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;特殊字符处理:&lt;/strong&gt; 方便地插入XML保留字符,例如 &lt;div class="code" style="position:relative; padding:0px; margin:0px;"&gt;&lt;pre class="brush:php;toolbar:false;"&gt;&lt;&lt;/pre&gt;
&lt;/div&gt;、&lt;div class="code" style="position:relative; padding:0px; margin:0px;"&gt;&lt;pre class="brush:php;toolbar:false;"&gt;&gt;&lt;/pre&gt;
&lt;/div&gt;、&lt;div class="code" style="position:relative; padding:0px; margin:0px;"&gt;&lt;pre class="brush:php;toolbar:false;"&gt;&&lt;/pre&gt;
&lt;/div&gt; 等。 这对于生成包含XML代码的XML文档非常有用。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;国际化和本地化:&lt;/strong&gt; 可以使用实体引用来存储不同语言的文本,然后根据用户的语言设置选择合适的实体。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;版本控制:&lt;/strong&gt; 可以将版本号定义为实体,方便在XML文档中更新版本信息。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;配置管理:&lt;/strong&gt; 可以使用外部实体引用来加载配置文件,例如数据库连接信息、API密钥等。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;如何防止XML实体注入攻击?&lt;/h3&gt;&lt;p&gt;XML实体注入(XXE)是一种常见的安全漏洞,攻击者可以利用它来读取服务器上的敏感文件,甚至执行恶意代码。 为了防止XXE攻击,可以采取以下措施:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;禁用外部实体引用:&lt;/strong&gt; 这是最有效的防御方法。 大多数XML解析器都允许你禁用外部实体引用。 例如,在Java中,可以使用 &lt;div class="code" style="position:relative; padding:0px; margin:0px;"&gt;&lt;pre class="brush:php;toolbar:false;"&gt;XMLReaderFactory&lt;/pre&gt;
&lt;/div&gt; 来创建一个禁用外部实体引用的XML解析器。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;使用安全的XML解析器:&lt;/strong&gt; 选择一个经过安全审计的XML解析器,并确保它是最新版本。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;验证XML文档:&lt;/strong&gt; 在解析XML文档之前,对其进行验证,确保它符合预期的格式和内容。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;限制XML解析器的权限:&lt;/strong&gt; 确保XML解析器只能访问必要的文件和资源。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;使用白名单:&lt;/strong&gt; 只允许使用预定义的实体引用,禁止使用自定义实体引用。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;内部实体和外部实体,我应该选择哪种?&lt;/h3&gt;&lt;p&gt;选择内部实体还是外部实体,取决于你的具体需求。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;内部实体:&lt;/strong&gt; 适合于定义较短的、在单个XML文档中使用的文本片段。 它们易于定义和使用,但可重用性较差。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;外部实体:&lt;/strong&gt; 适合于定义较长的、在多个XML文档中使用的文本片段。 它们具有更好的可重用性,但需要额外的文件管理。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;一般来说,如果你的实体只在一个XML文档中使用,并且内容比较短,那么使用内部实体就足够了。 如果你的实体需要在多个XML文档中使用,或者内容比较长,那么使用外部实体会更好。 但是,在使用外部实体时,一定要注意安全问题,采取必要的措施来防止XXE攻击。&lt;/p&gt;
以上就是XML中的实体引用(Entity Reference)有哪些?怎么定义自定义实体?的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1430124.html
微信扫一扫
支付宝扫一扫