【发布时间】:2016-03-11 08:30:42
【问题描述】:
我有一组隐藏的输入框,其中包含特别敏感的数据,点击一个按钮就可以将表单提交给第三方应用程序。
这些输入的值是在服务器端设置的。有这些输入的页面就是确认页面,用户点击按钮确认交易,隐藏的输入框内的数据就被贴出来了。
这本质上是非常不安全的,因为任何对 javascript 了解一半的人都可以加载 devtools 并使用 javascript 在提交数据之前更改隐藏输入的值。该页面甚至还方便地加载了 jQuery!哈! (我自己测试过)。
这是在具有有限用户集的私有应用程序上运行的,到目前为止还没有出现问题,但是现在需要在更公共的空间上使用相同的架构,并且交付它的安全隐患会有点吓人.
解决方案是在服务器端发布数据,但由于第三方应用程序的设置方式,服务器端发布不起作用(至少不是以直接的方式)。另一种方法是以某种方式阻止 javascript(当然还有扩展名 jQuery)更改输入框中的值。
我正在考虑实现(使用 setInterval)一个循环,该循环基本上检查输入值是否与原始值相同,如果不是,则将其改回,从而有效地防止值被更改。
我提出的方法会很容易被击败吗?也许有一种更优雅、更简单的方法来阻止 javascript 编辑那些特定的输入值?
** 编辑
对于任何沿着这条路来到这里的人:
经过多方面考虑,并且无法使用来自第三方应用程序的密钥对我的数据进行签名,我求助于从我的应用程序(ruby on rails 应用程序)手动发布数据服务器端。
在发布后显示正确的支付页面可能需要一些摆弄,我还没有测试过,但理论上这将是确保所有内容都提交服务器端并且用户永远不会有机会篡改它。
对于 Ruby on Rails 应用程序,this question 有一些很好的见解。
This answer 还展示了如何使用我在 cmets 中提到的 hacky 自动提交表单,但这可能容易出现与@dotnetom 回复的相同的漏洞。 (见 cmets)
再次感谢所有做出贡献的人。
【问题讨论】:
-
我认为您提出的解决方案不会阻止任何人如果他们真的想更改值,即使它确实如此,理论上用户可以打开提琴手并编辑请求,或创建自定义请求在类似邮递员的地方。如果这些字段非常重要,您应该实施一些服务器端验证。
-
是的,任何提议的方法都很容易被击败。您根本无法相信客户端值没有被操纵。
-
没有办法保证这个安全。第三方服务需要有一些签名字段,依赖于所有提交的值,只有签名和值都有效时才处理请求
-
使用 Escape ex。 javascript escape() 或加密你的信息
-
客户端验证只是为了让用户觉得漂亮,停止他们需要的 AJAX 或回发来查看其是否有效。服务器端验证也应该用于防止任何讨厌的人乱搞东西。客户端上没有什么是安全的,一切都可以以某种形式进行操作。
标签: javascript jquery html ruby-on-rails