阻止用户伪造表单的安全方法

Posted

技术标签:

【中文标题】阻止用户伪造表单的安全方法【英文标题】:Secure way to stop users from forging forms 【发布时间】:2012-01-21 20:57:03 【问题描述】:

如何防止用户在 php 或 jquery 端伪造表单,我正在使用 Jquery 的 ajax 功能来提交表单,这意味着技术人员可以更改一些变量,例如某些东西的值(应该'不被改变/是一个用户ID或类似的东西)通过使用萤火虫或网络检查器等。

那么我怎样才能防止用户更改这些变量或通过安全且良好的方式确保它们不可更改?

谢谢

【问题讨论】:

哇,你认为这可能是可能的。 How to properly add CSRF token using PHP的可能重复 【参考方案1】:

正如其他人已经说过的,您不能阻止用户篡改。

你正在接收我的数据,我可以向你发送任何我想要的东西,我什至可以手动发出 HTTP 请求,甚至不用使用浏览器,而你对此无能为力。

如果您不希望用户能够更改信息,请不要将其提供给他。

您可以将其存储在 PHP 的会话中,该会话存储在服务器端(不要使用 cookie,它们也会发送给用户)或将其保存在数据库中,最终用户都无法访问它们。

如果您仍想将数据传递给用户,请计算某种散列(secure 散列,使用 secure 散列算法和 secure message digest as Gumbo noted,这排除了数据的 CRC32 或 MD5 和 MAC (如您的姓名或生日)并将其存储在服务器端,然后当用户提交回数据时,检查是否哈希匹配。

但请注意,此解决方案并非 100% 安全。散列函数有冲突,存在错误的实现。

我建议坚持黄金法则:如果它不存在,它就不能破坏/被篡改/被盗等。

【讨论】:

为此目的使用经过验证的message authentication code。【参考方案2】:

您不能阻止用户这样做。

【讨论】:

为什么?如果变量来自服务器,它们可以绑定到令牌。如果客户端提交表单,则值与某人伪造请求的令牌不匹配。 不可能阻止用户使用 javascript 或调试工具更改页面数据,服务器会话似乎是使表单提交有点可靠的唯一方法,但那是服务器端接近 由于 OP 要求 PHP(服务器)或 JQuery 端.. 这是可能的。 考虑到这一点,会话变量将在这里提供最可靠的功能【参考方案3】:

将这些变量存储在 Session 中。

【讨论】:

【参考方案4】:

你永远不能相信客户。验证服务器上的表单以确保数据是健全的。这意味着检查给定的用户 ID 是否有权发布他们的表单等。

【讨论】:

【参考方案5】:

我要和……你不能。您从不信任用户的数据;客户端验证始终是第一道防线。

【讨论】:

尽可能省略客户端验证 @Shvelo 为什么要省略? 有些文章这么说。不是所有的机器都快速而强大,你可以检查长度和东西,但是正则表达式匹配很昂贵 不可能!客户端验证可以防止昂贵的服务器请求只是让服务器告诉用户更改他们的条目。 我没有说使用它,我说不信任它。大不同。

以上是关于阻止用户伪造表单的安全方法的主要内容,如果未能解决你的问题,请参考以下文章

阻止用户返回并查看以前提交的表单Rails

阻止用户提交表单

什么是阻止用户每次打开我的应用程序时都必须使用 Twitter Digits 登录的安全方法?

强制 fgets 阻止(即伪造“交互式设备”)

PHP:在按下 Back 时阻止表单被意外重新处理

为啥我不能阻止用户编辑 PrimeNG 表单字段值?