如何防止javascript更改输入值

时间:2016-03-11 08:30:42

标签: javascript jquery html ruby-on-rails

我有一系列隐藏的输入框,可以携带特别敏感的数据,只需点击一个按钮就可以将表单提交给第三方应用程序。

这些输入的值在服务器端设置。具有这些输入的页面是确认页面,用户单击该按钮以确认交易,并且隐藏输入框中的数据已过帐。

这本质上是非常不安全的,因为任何对javascript知识不足的人都可以在提交数据之前加载devtools并使用javascript来更改隐藏输入的值。该页面甚至可以方便地加载jQuery!哈! (我自己测试过。)

这是在具有有限用户设置的私有应用程序上运行,到目前为止还没有出现问题,但现在需要在更多公共空间上使用相同的体系结构,并且运送此设备的安全隐患将是有点可怕。

解决方案是发布数据服务器端,但由于第三方应用程序的设置方式,服务器端发布不起作用(至少不是以直接的方式)。另一种方法是以某种方式阻止javascript(当然还有扩展jQuery)来改变输入框中的值。

我正在考虑实现(使用setInterval)一个循环,它基本上检查输入值是否与原始值相同,如果没有,则将其更改回来,有效地防止值被更改。

我提议的方法是否容易被击败?也许有一种更优雅,更简单的方法来阻止javascript编辑那些特定的输入值?

** EDITS

对于沿着这条道路来到这里的任何人:

经过多次考虑,以及无法使用第三方应用程序中的密钥签署我的数据后,我使用手动从我的应用程序发布数据服务器端(rails应用程序上的ruby)。

在发布后,可能需要花些时间才能显示正确的付款页面,而我还没有对其进行测试,但理论上这将是确保所有内容都在服务器端提交的方式用户永远不会有机会篡改它。

对于Ruby on Rails应用程序,this question有一些很好的见解。

This answer还展示了如何使用我在评论中提到的hacky自动提交表单,但这可能容易出现与@dotnetom回复相同的漏洞。 (见评论)

再次感谢所有贡献者。

4 个答案:

答案 0 :(得分:2)

您基于setInterval和其他javascript函数的解决方案将无法正常工作。使用开发工具的人可以轻松地从控制台禁用它。如果无法从服务器发送这些参数,我看到的唯一选项是生成签名,其中包含需要发送的所有参数的一些公钥。第三方应用程序可以验证此签名并检查参数是否为正版。

但是,如果你无法控制第三方应用程序,那就不可能了。

查看来自twitter的示例:https://dev.twitter.com/oauth/overview/creating-signatures

答案 1 :(得分:1)

  

我正在考虑实现(使用setInterval)一个循环   基本检查输入值是否与原始值相同,   如果没有,则将其更改回来,有效地防止了这些值   被改变了。

攻击者可以通过

轻松解决这个问题
  • 覆盖正在执行此定期检查的方法。请查看此solution
  • 设置一个浏览器扩展,可以在setInterval()更改后更改值
  • 禁用JS。

基本上,客户端验证只是为了确保可以避免服务器端呼叫以减少网络跳闸,它不能成为保护数据完整性的最终前沿。它只能在服务器端完成,这是用户无法操作的环境。

答案 2 :(得分:1)

如果有人想要更改这些输入字段的值,他们可以只禁用JS(以这种方式绕过你的检查算法)并更新HTML中的输入值。

例如,可以使用FireBug轻松完成。不需要JS。

如果涉及敏感数据,可能无法绕过服务器端发布或至少服务器端验证。

答案 3 :(得分:1)

我知道这是一篇较旧的帖子,但由于与javascript安全相关(但不是相同)的问题,它引起了我的兴趣。

只考虑OP解决方案的逻辑,假设我理解正确......

服务器设置val,用户确认,确认转到第三方。问题是在发布到第三方之前可以编辑val。

在这种情况下,可行的解决方案是:

  1. 使用唯一ID
  2. 将val存储在原始服务器上
  3. 将确认信息发回始发服务器进行验证
  4. 如果验证= true,则原始服务器转发到第三方
  5. 如果第三方需要将数据发送回用户,并且不可能让服务器充当它之间(实际上它应该),那么你就会受到一些损害。

    您仍然可以使用对用户的AJAX类型true fale响应将数据发送回原始服务器。

    显然,恶意用户可以使用javascript编辑拦截AJAX响应,但是(假设第三方应用正在寻找某种用户ID),您会将该ID标记为无效并在AJAX之前提醒第三方应用响应将传递给用户。

    otoh,隐藏的输入框有助于,更大的考虑应该是操纵客户端javascript本身。

    应该有任何敏感函数或变量的验证包装器,以确保它们没有被修改。