如何使隐藏的输入实际隐藏(使表单更安全)

时间:2015-01-23 15:34:32

标签: html forms security input

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

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

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

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

2 个答案:

答案 0 :(得分:2)

  

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

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

如果用户不应该能够更改作者值,您甚至不应该在表单提交中读取作者值,而是将您最初放入表单中的值。如果用户应该具有更改作者值的有限能力(例如,只有管理员用户可以更改作者),那么检查当前用户是否允许作者值,如果不是,那么生成错误。

  

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

用户完全可以控制客户端发生的事情,您无法让浏览器将控制权从他们身上移开。安全控制必须在服务器端。

(有些评论建议使用加密来保护给用户的价值,但这比看起来要难得多。单独应用加密功能根本不能防止篡改;要做到这一点,你需要进行消息签名并且签名消息中的数据与用户/会话和字段目的之间存在某种联系,因此用户无法粘贴他们在其他地方找到的加密值。不要这样做,直到您真正需要,道路上满是尸体。)

<?php echo $user_id ?>

顺便说一句,在将任何变量数据回显到HTML模板时,您应该使用htmlspecialchars(),否则您很容易受到HTML注入(XSS)的攻击。<​​/ p>

答案 1 :(得分:0)

我不是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将其作为表单一部分传递给客户端的数据做类似的事情......