【问题标题】:Why is the `NAME` attribute considered unsafe?为什么 `NAME` 属性被认为是不安全的?
【发布时间】:2012-11-19 06:48:02
【问题描述】:

我将用户生成的 HTML 传递到数据库中,并试图确保没有恶意代码通过。我正在采取的步骤之一是通过 pear 的 HTML_Safe 类运行传递的代码以删除易受攻击的标记。然而,我注意到的一件事是提交元素的name 属性被删除。果然,看源码,name是少数几个默认被列入黑名单的属性之一:

http://pear.php.net/package/HTML_Safe/docs/latest/HTML_Safe/HTML_Safe.html#var$attributes

允许用户为name 传递值有什么危险? name 的值如何被用于邪恶目的?有什么想法吗?如果没有,我很想修改黑名单。

【问题讨论】:

  • 可能是因为一般来说表单并不是人们真正需要发布的那种东西。
  • 在很多情况下,允许用户通过直接 DOM 操作来构建表单内容会派上用场。问题是除了“如果表单元素最终包含其中的代码,它最终可能会被提交”之外,是否还有其他需要担心的事情......这很容易通过简单地防止echoing表单元素中发布的代码(form 标签已经被列入黑名单,所有 js 也是如此,所以你必须非常草率才能最终提交 inputs 最终被提交)
  • This article 暗示 nameid 在某些浏览器中有时可能表示相同的意思,因此可能被认为是危险的。

标签: php attributes html-parsing pear html-sanitizing


【解决方案1】:

在 HTML 表单元素中,name 属性用作标识符。因此,如果您允许name,那么某人可能能够用他们自己的一个来覆盖您的 HTML name 属性(您可能已经使用过)。找到的第一个匹配的name 通常是 Javascript 或服务器端处理使用的那个。

这将允许某人利用您可能正在使用的任何可能的 Javascript 或服务器端表单处理来引用找到的第一个匹配的 name 属性。

不仅可以使用name 的表单元素,而且它们是最不安全的。

另一个覆盖问题是,如果您在任何函数中使用 Javascripts getElementsByName(如下所述),您最终可能会得到一个不符合您期望的函数。

编辑:关于getElementsByName 问题的一些更正和注释(如下所述)。

【讨论】:

  • 这不正确。 id 是独一无二的,但 name 可以在表单和输入上使用任意多次(因此,js 函数按名称获取元素的原因 - getElementsByName 总是返回一个数组而不是单个元素:因为您可以拥有多个具有相同 name 的元素。而且我知道有时 JS 逻辑会受到新名称的影响,但如今 class 是一个更常见的选择器......甚至只是标签名称。在这方面,我不认为 name 比大多数其他属性更危险。
  • 然而,基本的一点——如果包含在一个具有相同名称的元素的表单中,它可以被传递回服务器端脚本——这是很好的。在这方面,它确实构成了更大的威胁。 JS 的担忧似乎无关紧要(考虑到 name 很少用作选择器),但我相信如果它进入表单会带来更大的危险,我相信它的解释。您应该澄清您的答案:name 不是唯一标识符:即使在单个表单中也不行。但是,name 定义了 _POST 数组的键,它们是唯一的,并且可能会拾取插入的输入。
猜你喜欢
  • 2011-08-25
  • 1970-01-01
  • 2021-02-04
  • 2014-03-08
  • 2014-03-26
  • 2011-08-13
  • 2020-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多