【问题标题】:Is javascript reliable for preventing actions on the front end such as form submission?javascript 对于防止表单提交等前端操作是否可靠?
【发布时间】:2009-12-29 14:43:35
【问题描述】:
我有一个需要调用的网络服务,其结果决定了是否允许用户提交表单。
既然这个调用来自 javascript 而不是来自后面的代码,它不可靠吗?用户有什么方法可以绕过检查 - 通过使用 firebug 并启用提交按钮,以某种方式使该方法给出与 Web 服务实际返回的结果不同的结果,任何其他能够绕过的方法是吗?
基本上有什么方法可以从 javascript 调用 web 服务并让它的结果确定是否可以提交表单,并 实际上阻止用户提交表单? -- 有没有萤火虫之类的……
【问题讨论】:
标签:
asp.net
javascript
web-services
forms
【解决方案1】:
不,不可能。
仅举几个可能的原因:
- 如果禁用了 javascript 会怎样?
- 如果用户提交原始 POST(例如使用 libcurl)怎么办?
- 如果用户使用的浏览器以与您的期望不同的方式解释 javascript(想想便携式设备)怎么办?
Javascript 验证只是为了方便您的用户,并且永远不应该永远被用作提供安全性的手段。
【解决方案2】:
您永远无法阻止用户发出模仿表单提交的 HTTP 请求。虽然通过 Javascript 禁用表单会阻止 95% 的启用 Javascript 并且 不想绕过您的访问控制的用户提交,但任何了解 HTTP 的人都可以通话,您正确地表明任何使用 Firebug 的人都可以在几秒钟内完成。
【解决方案3】:
Javascript 不能可靠地阻止任何事情。它不应该被视为安全墙,因为它很容易被 firebug、iedevelopertoolbar 和许多其他浏览器玩具等东西拆解。
即使您可以阻止他们在您的页面上提交您的表单,也没有什么能阻止他们在自己的页面上创建一个全新的表单,并将其指向您的表单操作。因此,他们将自己从您的“安全”环境中移除,而是选择在自己的环境中玩耍。
【解决方案4】:
你的怀疑是正确的;用户可以轻松绕过任何可能的 Javascript 验证。
您将需要使用服务器端代码。
【解决方案5】:
不,它不可靠。尝试在您的浏览器中禁用 Javascript,以亲眼看看 您 是多么容易绕过它。
【解决方案6】:
用户可以简单地在他们的浏览器中禁用 javascript,或者使用类似 NoScript 的东西。您可以做的最好的事情是尝试在 Ajax 请求的返回中设置表单操作本身,这样加载的表单将不会提交(除了自身)。这可能会阻止临时用户,但不会妨碍稍微更坚定(或只是无聊且精通技术)的用户。无论您做什么,都需要在服务器端进行检查。
【解决方案7】:
一般来说,不会。您可以在不通过 Javascript 的情况下使表单难以提交。使提交按钮不是实际的提交按钮 (<input type="submit">),而是在其 onClick 处理程序中提交表单的按钮 (<input type="button">)。
【解决方案8】:
正如其他人所说,不,你不能这样做。唯一真正的解决方案 是让 Web 服务返回一些动态值,Javascript 在隐藏的表单输入中插入这些值。然后,无论服务器端代码处理表单提交,如果该值不存在,则应拒绝该请求。