<input type="hidden"> 的初衷?

IT技术 javascript html history
2021-03-05 10:28:32

我很好奇<input type="hidden">标签的原始用途

如今,它经常与 JavaScript 一起使用,以在其中存储发送到服务器的变量等等。

因此,JavaScript之前<input type="hidden">就存在了,那么它的初衷是什么?我只能想象从服务器向客户端发送一个值,该值被(不变)发回以维持一种状态。或者我在它的历史上有什么问题并且总是应该与 JavaScript 一起使用?<input type="hidden">

如果可能,请在您的答案中也提供参考。

5个回答

我只能想象从服务器向客户端发送一个值,该值被(不变)发回以维持一种状态。

恰恰。事实上,它今天仍然被用于这个目的,因为我们今天所知道的 HTTP 仍然,至少从根本上说,是一种无状态协议。

这个用例实际上是在HTML 3.2 中首次描述的(我很惊讶 HTML 2.0 没有包含这样的描述):

type=hidden
这些字段不应被呈现,并为服务器提供一种方式来存储带有表单的状态信息。这将在提交表单时使用由相应属性定义的名称/值对传递回服务器。这是解决 HTTP 无状态的方法。另一种方法是使用 HTTP“Cookies”。

<input type=hidden name=customerid value="c2415-345-8563">

值得一提的是,HTML 3.2 仅JavaScript 最初发布后才成为 W3C 推荐标准,但可以安全地假设隐藏字段几乎总是用于相同的目的。

@Brett84c:这就是为什么您应该始终验证您的输入并且永远不要相信客户;)
2021-04-23 10:28:32
关于这些危险的任何内容都不是“隐藏”输入所特有的——任何发送给客户端的东西都可以在它返回之前被操纵。Cookie 或基于 JS 的替代品是一样的。
2021-04-27 10:28:32
确切地说,我只是把它放在那里,让新开发人员意识到可能存在的危险。
2021-04-30 10:28:32
我不喜欢使用“隐藏”输入来存储数据的一件事是,用户可以操纵数据,当然,可能只有理解 HTML 以及如何通过开发工具修改它的人,但可能会对数据库,如果这些值的修改破坏了其他数据(例如,如果您正在存储主键引用并且它是由用户手动更改的)。
2021-05-06 10:28:32

我将在这里提供一个简单的服务器端真实世界示例,假设记录是循环的,并且每条记录都有一个带有删除按钮的表单,并且您需要删除特定的记录,那么该hidden字段就会起作用,否则您将不会在这种情况下,t 获取要删除的记录的引用,它将是id

例如

<?php
    if(isset($_POST['delete_action'])) {
        mysqli_query($connection, "DELETE FROM table_name 
                                   WHERE record_id = ".$_POST['row_to_be_deleted']);
                                   //Here is where hidden field value is used
    }

    while(condition) {
?>
    <span><?php echo 'Looped Record Name'; ?>
    <form method="post">
        <input type="hidden" name="row_to_be_deleted" value="<?php echo $record_id; ?>" />
        <input type="submit" name="delete_action" />
    </form>
<?php
    }
?>
很好的例子,除了真正的代码应该使用准备好的语句或其他方式来安全地处理 SQL 输入。
2021-04-30 10:28:32

简而言之,最初的目的是制作一个将与表单提交一起提交的字段。有时,需要在隐藏字段中存储一些信息(例如,用户的 id)并通过表单提交提交。

来自 1995 年 9 月 22 日的 HTML 规范

带有`TYPE=HIDDEN' 的INPUT 元素代表一个隐藏字段。用户不与该字段交互;相反,VALUE 属性指定字段的值。NAME 和 VALUE 属性是必需的。

我明白了 :) 感谢您的评论,我已经编辑了我的答案。这只是拼写错误(还没有达到英语大师级别:D)。
2021-04-21 10:28:32
@GitaarLAB,我举了一个例子(用户ID)...无论如何,网络上有很多例子。例如echoecho.com/htmlforms07.htm
2021-04-23 10:28:32
对不起,对我来说这句话:original purpose was to make a field which will be submitted *after* form's submit是模棱两可的。它可以解释为:'在表单完成发布其数据,隐藏字段将被提交(到一个神秘的地方)'。因此,我上面的评论。
2021-05-09 10:28:32
您能否详细说明该答案和/或对在表单提交后提交隐藏字段的这种行为提供一些参考?
2021-05-12 10:28:32

表单元素的值包括 type='hidden' 会在表单发布时提交给服务器。input type="hidden" 值在页面中不可见。例如,在隐藏字段中维护用户 ID 是众多用途之一。

SO 使用隐藏字段进行投票点击。

<input value="16293741" name="postId" type="hidden">

使用此值,服务器端脚本可以存储赞成票。

@Uooo 您可以取消隐藏它或直接更改该值。您可以将该值更改为不同的答案。然后,您可以单击 upvote 按钮,它会被记录为对不同答案的 upvote。;)
2021-04-19 10:28:32
哈哈,好收获!当我在值的末尾附加一个“x”时,在投票时会发生错误:D
2021-04-20 10:28:32

基本上隐藏字段将更有用,并且与多步表单一起使用具有优势。我们可以使用隐藏字段将一个步骤信息传递给使用隐藏的下一步,并保持它转发到最后一步。

  1. CSRF 代币。

跨站请求伪造是一个非常常见的网站漏洞。在所有表单提交中都需要一个秘密的、用户特定的令牌将防止 CSRF 攻击,因为攻击站点无法猜测正确的令牌是什么,并且他们代表用户执行的任何表单提交都将始终失败。

  1. 以多页形式保存状态。

如果您需要在多页表单中存储用户当前所在的步骤,请使用隐藏的输入字段。用户不需要查看此信息,因此将其隐藏在隐藏的输入字段中。

一般规则:使用该字段来存储用户不需要看到的任何内容,但您希望在表单提交时发送到服务器。