使用隐藏字段是不好的实践吗?

25

一位程序员告诉我,在我的HTML代码中使用隐藏字段是“不好的做法”。基本上,我有一个无序列表,用户根据他们选择的类别(类别是图片)选择一个项目。然后,它调用JavaScript将隐藏字段设置为用户选择的值,以便在提交表单时将其发送。这真的是不好的做法吗?有没有其他方法可以做到这一点?


3
也许你应该先问他/她为什么这样想... - Christophe
1
只有当你试图向用户隐藏某些内容时(例如,你将在未告知用户的情况下通过HTTP提交他们的电子邮件地址)才会真正出现“不良实践”。如果使用隐藏字段是合适的,那么就没有任何问题。 - Chuck Le Butt
13
不算坏的做法,很常见。根据实际情况,可能会存在无障碍问题,但我建议你忽略你的同事或者向他获取更多细节信息。 - Michael Berkowski
1
如果需要存储应该与表单一起发送的某些类型的数据,则使用隐藏字段。 如果不需要发送回服务器,只需要被JavaScript使用,则将其存储为data属性。 - The Muffin Man
@MichaelBerkowski他并没有真正回答我的问题。所以我只是很好奇,决定发帖讨论一下,看看别人的想法。 - ios85
1
像“这是不好的惯例吗……”这样的问题往往会引发辩论、争论、投票和长时间的讨论,而不是基于事实、参考和特定专业知识的达成共识的答案。如果问题没有明确的背景和使用的标准,则尤其如此。 - Jukka K. Korpela
5个回答

8
隐藏字段存在的目的是在表单中设置值而不显示输入框,我不明白为什么使用它们会被认为是不好的做法。如果你需要创建一个自定义小部件并通过表单发送它的值,这是最简单的方法,你仍然可以使用具有动态选择列表的选择按钮,但你将不得不进行丑陋的黑客攻击来使界面看起来漂亮。

5

这是一种非常常见的做法。我能想到的唯一问题是,如果您的访问者禁用了JavaScript,它将无法使用,因此您可能需要一个备选方案。


4
如果您想提交表单并需要传递一些非可见表单字段中不包含的简单值,则隐藏字段可能是最古老、最可靠且最清洁的方法。
考虑以下替代方案:
1. 无用:不要传递任何隐藏内容。 2. 差:抽象层次高,例如使用 ASP.Net 视图状态,该状态在任何情况下都使用隐藏字段,但会污染请求模型(除非小心处理,否则会添加大量不必要的数据 - 大多数人并没有这么做)。 3. 糟糕:在查询字符串中传递所有表单值。这通常是非 RESTful 的,甚至可能会带来有害的后果(用户书签了一个执行意外操作的查询字符串)。 4. 可能:使用 AJAX 手动 POST 值。这可能是一个非常有效的实现,前提是您只想执行异步操作。 5. 可能:完整的往返方式,服务器处理更改(可能是支持没有 JavaScript 的用户的唯一方法)。

3

使用隐藏域来存储必须保密的信息是不好的实践。当没有安全问题时,通常可以使用隐藏域。


5
你应该提供原因和参考资料。 - valentinas
什么阻止你加密它们?这不是一个论点,因为对于页面上的任何数据、控件或字段都是同样的问题。 - Aristos
1
你不需要提供参考资料是StackOverflow的标准。因此,valentina的评论是客观错误的。还有两件事:我在捍卫零假设,即不存在问题,因此很难证明。此外,这是一个常识性问题。现在,使用隐藏字段并没有错;它们存在是有原因的。它们非常方便,在特定页面中包含下一个请求的状态时几乎可以使用。(例如,列表的排序)。 - Joe
你可以进行加密,但用户可能会破解加密。如果你要花费精力进行加密,最好使用令牌来访问某种保存数据的服务器端缓存。这样更安全,因为没有解密的可能性。而且这样做可能更容易,出错的概率也更小。 - Joe
他从未表示过他正在传递敏感信息,例如我可以使用一个隐藏的输入来存储用户在DOM元素上选择的颜色的ID,为什么这会是一种不好的做法?那个值永远不会危及网站安全。 - DJG22
基本正确。 - Divij Sehgal

1

通常在HTML DOM中存储JavaScript值是一种不好的做法。您应该尝试创建一个存储在JavaScript环境中的列表。

window.myList = new Array();

如果你有很多东西要处理,我建议你使用类似Underscore.js或者Backbone.js这样的工具。

如果你只在提交时使用这些数据,那么你的情况似乎是合法的。


1
如果您只在提交时使用这些数据,那么如果没有JS,这将是一个无障碍的缺点,但这又取决于客户的需求。 - feeela

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接