【问题标题】:Security: How '<div id="t">t</div>' is different from 't'?安全性:'<div id="t">t</div>' 与 't' 有何不同?
【发布时间】:2019-03-11 13:04:06
【问题描述】:

我读到'不建议您在插入纯文本时使用 insertAdjacentHTML()' here .
我确实看到了那些将纯文本与标签+文本+标签组合区分开来的标签。

使用insertAdjacentHTML() 方法向元素添加sibling with text 是否安全。这就是我想要做的:

<div id="one"></div>
#adding a sibling to above div with text

<div id="one"></div>
<div id="two">text here</div>

任何建议都会有所帮助。

【问题讨论】:

  • “但是,我无法确定使用此 insertAdjacentHTML() 向元素添加带有文本的兄弟是否安全”您可以改写一下吗?很难理解你的意思。
  • 问题是,您要插入 HTML 还是只插入文本?如果要插入 HTML,则可以使用 insertAdjacentHTML()。我想当您从输入/文本区域获取一些值并将其插入 HTML 而不对其进行解析时,这是不安全的。因此,如果您知道要在 html 中放入什么,就可以使用它。此外,如果您只想追加/前置一个孩子,您还可以使用其他 js 方法,如 appendChild() 方法。如果你是纯文本,那么使用 insertAdjacentText()
  • @torogadude :我已经编辑了这个问题。
  • @MihaiT:谢谢您的回复,先生。我将从服务器获取text。而且,我将使用一个数组将多个带有文本的兄弟姐妹添加到一个 div 中。我提到的链接上的安全考虑让我问了这个问题。我所说的text 不是来自用户,因此应该足够安全,但我不确定。

标签: javascript html


【解决方案1】:

您的问题的答案确实在您提供的链接中。它来自用户输入吗?如果没有适当的反 XSS 程序,那么它是不安全的。它是您从服务器键入的内容,并且只会成为您想要的内容吗?然后随意使用insertAdjacentHTML()。请参阅 Vinz243 的有关 XSS 的链接。

【讨论】:

  • 感谢您的回答,先生。不,不是来自用户。实际上,它们仅来自服务器。正如我在评论中已经提到的那样,我确实知道它们来自服务器是安全的,但我不确定。而且,我已经看到了答案,接受了答案,提出了导致该 xss 漏洞的方法。只有一个问题,非常礼貌 - 如果文本始终来自服务器而不是来自用户,我是否应该完全确定它是安全的?
  • 是的,如果不涉及用户输入,它永远不会被 XSS 攻击。 XSS 的定义是通过用户输入将脚本注入网站。然而,使用 Mihai 之类的解决方案可能会更好,用于更好的 DOM 控制。
  • 谢谢,我想从有经验的人那里了解一下 xss。
【解决方案2】:

所以,据我了解,您只是将一些来自服务器的文本添加到一组子项中。并且子元素应该在父元素的末尾(在现有子元素之后)。您可以为此使用 appendChild。

通过这种方式,您可以控制要添加的 HTML(使用 document.createElement("div"); ,然后将纯文本插入其中。安全问题在于 HTML(添加标签等),但现在,您确切知道要添加的 HTML . 所以这个方法(imo)是安全的。

因为现在即使你得到一个&lt; script &gt; do some hacking &lt;/script &gt; 的字符串,当使用下面的方法时,它也会像纯文本一样被添加( textContent 只是添加文本,而不是 HTML )。所以你不会有安全问题。但是,如果您使用像 insertAdjacentHTML() 这样的 HTML 方法插入 &lt; script &gt; do some hacking &lt; /script&gt;,那么是的,这将是一个问题 :)。

OFC 最好添加一个解析方法,例如检查脚本标签以及对从服务器获取的数据进行其他安全验证。 (在服务器端这样做会更好)

编辑:如果您想将元素添加为兄弟姐妹,请使用(正如您和 torogadude 正确所说的那样)insertBefore()。或insertAfter() 取决于你想做什么。

所以你就这样做吧。

const mockArrayText = ['abc1','abc2','abc3'];
const existingElement = document.getElementById('add-here')

for (let i=0;i< mockArrayText.length; i++ ) {
  const newElement = document.createElement("div");
  newElement.textContent = mockArrayText[i]
  existingElement.parentNode.insertBefore(newElement,existingElement.nextSibling)
}
<div id="add-here">
</div>

【讨论】:

  • 很好的答案和解释,先生。但是,这会添加一个孩子而不是兄弟姐妹。我对问题进行了后期编辑,我接受我的错。请参阅编辑,最后一个代码块,并建议 appendChild 的安全替代方案。 .parentNode.insertBefore(newElement, existingElement.nextSibling) 好吗?
  • @lmao 万一他没有看到,parentNode.insertBefore(newElement,existingElement.nextSibling) 是我以前使用过的解决方案并且有效。
  • @lmao ,是的。我添加了一个编辑。另外,对我的回答投了反对票的用户,你能解释一下吗?
  • 非常感谢你们两位。赞成答案。 (我不是反对者)
  • @MihaiT 我投了反对票,因为我认为您没有通过使用子元素而不是给定元素之后的元素给出答案来阅读问题。但由于它是在编辑之前制作的,并且 OP 接受了它作为答案,我已经删除了它。 :)
猜你喜欢
  • 2018-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-23
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多