如何防止javascript更改输入值

如何防止javascript更改输入值,javascript,jquery,html,ruby-on-rails,Javascript,Jquery,Html,Ruby On Rails,我有一系列隐藏的输入框,其中包含特别敏感的数据,只要点击一个按钮,表单就会提交给第三方应用程序 这些输入的值在服务器端设置。包含这些输入的页面是一个确认页面,用户单击按钮确认交易,隐藏输入框中的数据将被发布 这从本质上讲是非常不安全的,因为任何对javascript略知一二的人都可以在提交数据之前加载devtools并使用javascript更改隐藏输入的值。页面甚至方便地加载了jQuery!哈(我自己做了测试) 这是在一个用户集有限的私有应用程序上运行的,到目前为止还不是问题,但现在在一个更公

我有一系列隐藏的输入框,其中包含特别敏感的数据,只要点击一个按钮,表单就会提交给第三方应用程序

这些输入的值在服务器端设置。包含这些输入的页面是一个确认页面,用户单击按钮确认交易,隐藏输入框中的数据将被发布

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

这是在一个用户集有限的私有应用程序上运行的,到目前为止还不是问题,但现在在一个更公共的空间上需要相同的体系结构,发布这一应用程序的安全性将有点可怕

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

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

我提出的方法容易被击败吗?也许有一种更优雅、更简单的方法可以阻止javascript编辑这些特定的输入值

**编辑 对于沿着这条路来到这里的任何人:

经过多次考虑,并且无法使用来自第三方应用程序的密钥对数据进行签名,我求助于从我的应用程序(RubyonRails应用程序)手动发布数据服务器端

这可能需要一些摆弄,以获得正确的付款页面显示后,张贴发生,我还没有测试它,但在理论上,这将是一种方式,以确保一切都提交服务器端,用户永远不会有机会篡改它

对于RubyonRails应用程序,这里有一些很好的见解

还显示了如何使用我在评论中提到的hacky autosubmitting表单,但这可能会与回复的漏洞相同。(见评论)

再次感谢所有做出贡献的人

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

攻击者可以通过以下方法轻松克服此问题:

  • 重写正在执行此定期检查的方法。检查这个
  • 设置可以在setInterval()更改值后更改其值的浏览器扩展名
  • 禁用JS

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

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

但同样,如果您对第三方应用程序没有控制权,这是不可能的


查看twitter上的一个示例:

如果有人想更改这些输入字段的值,他们可以禁用JS(这样就可以绕过检查算法)并更新HTML中的输入值

例如,使用FireBug可以很容易地做到这一点。不需要JS


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

我知道这是一篇较老的帖子,但它引起了我的兴趣,因为javascript安全性存在相关(但不相同)问题

只要想想OP解决方案的逻辑,假设我理解正确

服务器设置VAL,用户确认,然后将确认发送给第三方。问题是VAL可以在发布到第三方之前进行编辑

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

  • 使用唯一ID将VAL存储在原始服务器上
  • 将确认发送回原始服务器进行验证
  • 如果validation=true,则发起服务器将转发给第三方
  • 如果第三方需要将数据发送回用户,并且不可能让服务器充当中间人(它确实应该这样做),那么您就有点妥协了

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

    显然,恶意用户可以使用javascript编辑截获AJAX响应,但是(假设第三方应用程序正在查找某种用户ID),您会将该ID标记为无效,并在AJAX响应传递给用户之前向第三方应用程序发出警报

    对于隐藏的输入框,更大的考虑应该是对客户端javascript本身的操作


    对于任何敏感函数或变量,都应该有一个验证包装,以确保它们没有被修改。

    如果任何人真的想更改值,我认为您提出的解决方案不会阻止他们,即使他们真的想更改值,理论上用户也可以打开fiddler并编辑请求,或者在类似postman的东西中创建自定义请求。您应该实现一些服务器端验证