如何使隐藏的输入真正隐藏(使表单更安全)

How to make hidden input actually hidden (making forms more secure)

我创建了一个表单,在其 <form> 标签中包含以下内容:

<input type="hidden" value="<?php echo $user_id ?>" name="author">

我在这里看到的问题是,用户可以轻松地检查元素 并更改值...并且在这样做时,会影响该值在表单中的处理方式。

人们如何使这种类型的表单处理更加安全,从而使用户无法更改值?

我不是 php 高手,但我会使用类似

的东西
<input type="hidden" value="<?php echo encrypt($user_id, $secret) ?>" name="author"/>

其中 encrypt() 应该是一个 php 加密函数(也许 How do you Encrypt and Decrypt a PHP String? 会有所帮助...

在服务器端你可以使用

$user_id = decrypt($POST["author"], $secret)

如果转换失败,有人做了什么。甚至为了强化您的数据,您可以添加一些校验和字段来覆盖隐藏值的完整数据集。 .NET ASP.NET 对作为表单的一部分传递给客户端的数据做了类似的事情...

The problem I see here is that users can easily inspect element and change the value... and when doing so, affect how that value is processed in the form.

如果没有完整的服务器端授权检查,您的应用程序不应允许任何此类操作。

如果用户不应该能够更改作者值,你甚至不应该费心阅读表单提交中的作者值,取你最初输入表单的值。如果用户更改作者值的能力有限(例如,只有管理员用户可以更改作者),则检查当前用户是否允许作者值,如果不允许,则生成一个错误。

How do people make this type of form processing more secure so that users can't alter values?

用户完全可以控制客户端发生的事情,您不能让浏览器从他们手中夺走该控制权。安全控制必须在服务器端。

(一些评论建议加密以保护提供给用户的值,但这比看起来更难做到正确。单独应用加密功能根本无法防止篡改;要做到这一点,您需要消息签名以及签名消息中的数据与 user/session 和字段目的之间的某种联系,因此用户不能只是粘贴他们在其他地方找到的加密值。除非你真的需要,否则不要这样做,路上尸横遍野。)

<?php echo $user_id ?>

顺便说一句,当将任何可变数据回显到 HTML 模板时,您应该使用 htmlspecialchars() 否则您容易受到 HTML-注入 (XSS) 的攻击。