我的问题是,在实践中这个论点有多好?从理论上讲,它很有道理,但在实践中,如果浏览器禁用JavaScript,那么大多数网站功能甚至都无法正常工作。用户可能甚至无法加载页面,更别说提交表单了。
客户端验证只是避免客户端出现“但我已经把这些填完了,却没有告诉我任何信息!”的情况。它实际上不是强制性的,在实际中,客户端验证是一件非常新的事情(即:5年或更短)。实际上,它只是防止具备JS功能的客户端在重新加载页面之前知道表单是否正确。
如果使用AJAX,则情况不同——它可以让您节省带宽,并在提交之前为用户提供反馈。
最后,如果您正在构建严格的客户端对等交换应用程序(例如游戏),则需要进行客户端验证以防止客户端作弊。
由于客户端验证可以通过关闭JavaScript来完全绕过,因此服务器端验证也至关重要。从某种意义上说,基于JS的验证是一种方便和美学/修饰性的改进,不应该依赖于它。此外,很容易在本地编辑页面源代码以禁用或绕过即使最复杂的JS验证。
如果您不进行服务器端验证,用户会做什么?根据您如何使用他们的数据而定。您可能允许用户删除整个数据库(或更糟糕的是泄漏它们),修改任何他们喜欢的内容(或更糟糕的是阅读任何他们喜欢的东西。目录遍历漏洞是淘气人员极为常见的入口点),并根据自己的意愿提升其权限。您想冒这个风险吗?不验证用户输入就像是信任人们并没有在房子上安装锁。
验证应始终在服务器端执行 - 您永远不能信任客户端验证。
客户端验证总是为了提供更好的用户体验(UX),使用户不必仅因表单中的值无效而提交和重新加载页面 - 这使事物更加动态。
由于您甚至不需要浏览器来发出请求,与您的网站是否依赖JS正常工作无关,您将需要服务器端验证并清理所有用户输入,以防止数据库受到攻击。
现在由您决定是否要提供带有动态客户端验证提示的UI。
始终保护服务器的输入。问题不仅在于用户禁用JavaScript,还可能会破坏服务器。
例如,如果网站在上设置了JavaScript最大长度检查,用户可以禁用该检查,从而发送比服务器和/或数据库预期的更多数据。这可能会通过占用服务器线程的大型POST长时间地超载服务器,例如违反数据库约束会暴露有关任何持久信息的详细信息。更糟糕的是,如果没有限制,用户可能能够执行注入攻击。
另一个例子是使用外部HTTP工具向服务器发送请求,完全绕过任何JavaScript。我经常在开发中使用Chrome的Advanced REST Client来测试JSON API。
通过JavaScript进行客户端验证只是提供快速反馈给使用站点的人员与其互动的任何信息的一种方式。在传统的客户端-服务器通信中,出于上述原因,它不应是唯一的验证方式。
可以拥有一个同时使用JavaScript和“旧”技术的网站,以便对每个用户和每个浏览器都有效。
客户端验证是高度交互式表单的解决方案,具有即时字段验证功能,但它不能防止恶意用户注入和发布格式无效的数据到服务器。重要的是,您的服务器端脚本验证用户所做的一切,否则您将使您的网站暴露于SQL注入攻击、XSS攻击、用户执行不应该执行的操作等风险之中。