我在<form>
标记中创建了一个包含以下内容的表单:
<input type="hidden" value="<?php echo $user_id ?>" name="author">
我在这里看到的问题是用户可以轻松地检查元素并更改值...并且在这样做时,会影响在表单中处理该值的方式。
人们如何使这种类型的表单处理更加安全,以便用户无法改变价值?
答案 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将其作为表单一部分传递给客户端的数据做类似的事情......