如何使隐藏的输入真正隐藏(使表单更安全)
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) 的攻击。
我创建了一个表单,在其 <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) 的攻击。