为什么我们需要客户端和服务器端验证?

IT技术 javascript validation web-applications client-side-validation server-side-validation
2021-02-24 19:52:22

使用验证器同时使用客户端验证 (JavaScript) 和服务器端验证的论据是:如果客户端浏览器不支持 JavaScript,则用户无法使用客户端验证。

我的问题是这个论点在实践中有多好?理论上这是有道理的,但在实践中,如果在浏览器中禁用了 JavaScript,那么大多数网站功能甚至都无法使用。如果没有 JavaScript,用户甚至可能无法加载页面,更不用说提交表单了。

5个回答

客户端验证只是避免客户端“但我全部填写了它,它没有告诉我任何事情!”。实际上不是强制性的,实际上,客户端验证是一个非常新的东西(阅读:5 年或更短)。实际上,它所做的只是阻止您的客户端(启用了 JS)在重新加载页面之前知道表单是否正常。如果 AJAX 在游戏中,则不同——它允许您节省带宽以及在提交之前向用户提供反馈。最后,如果您正在构建严格的客户端、点对点交换应用程序(想想游戏),您将需要客户端验证以防止客户端作弊。

服务器端验证也很重要,因为可以通过关闭 JavaScript 完全绕过客户端验证。在某种程度上,JS-驱动验证是一种方便和美学/化妆品的改进和应该被依赖。此外,为了禁用或绕过最复杂的 JS 验证,在本地编辑页面源是微不足道的。

如果您不进行服务器端验证,用户可以做什么?任何事情,取决于您如何使用他们的数据。你可以允许用户删除整个数据库(或者更糟的是,泄露它们),修改他们喜欢的任何东西(或者更糟的是,阅读他们喜欢的任何东西。目录遍历缺陷是顽皮的人非常常见的入口点),并随意提升他们的特权。你想冒这个险吗?不验证用户输入就像信任别人而不是在你的房子上安装锁。

验证应始终在服务器端执行 - 您永远不能信任客户端验证。

客户端验证总是在提供更好的用户体验 (UX) 的意义上,因此用户不必仅仅因为表单中的值无效而提交和重新加载页面 - 它使事情变得更加动态。

由于您甚至不需要浏览器来发出请求,独立于您的网站依赖 JS 正常工作,您将需要服务器端验证并清理所有用户输入,以防您担心数据库被盗用。

现在由您决定是否要提供带有动态客户端验证提示的 UI。

@Kaushik 好吧,当我针对 SQL 注入测试我的页面时,我通常使用TamperData,我还使用 Node.js(带有form-data module)从头开始生成请求。在实践中,任何程序都可以发出 http 请求并发送任意的 GET/POST 数据 - 我不太确定这如何适用于 java 后端,但应该不会有太大不同。
2021-04-22 19:52:22
这称为“约束验证”我试图解释说,我认为您的“验证只能在服务器端执行”的声明自规范以来具有误导性。称之为“验证”
2021-05-01 19:52:22
@andyb 是的,我的意思是验证到达服务器的输入。将尝试改写。
2021-05-07 19:52:22
@andyb 从这个意义上说,“验证”仅仅是用户体验。通过 Chrome Dev Tools / Firebug 禁用此类约束,可以轻松绕过这一限制,毕竟这些都是可以通过 JavaScript 访问和修改的 DOM 元素属性。
2021-05-12 19:52:22
验证可以在客户端完成,例如许多浏览器支持 HTML5 表单验证属性 - html5rocks.com/en/tutorials/forms/constraintvalidation
2021-05-16 19:52:22

如果用户禁用了 javascript 是他自己的问题,而他出于某种原因决定单独禁用 javascript...为此,当您制作网站时,您必须始终牢记您的网站必须对拥有和没有javascript。需要双方验证的原因有很多,其中一些是:

  • 用户已禁用 javascript
  • 恶意用户故意删除了 javascript 以利用系统
  • 通过 javascript 验证,您可以减少网站和客户端之间的数据流量。
  • 当然,通过服务器验证,您可以一劳永逸地确保数据正确

有可能同时使用 javascript 和“旧”技术的网站对每个用户和每个浏览器都有效。

始终保护您在服务器上的输入这并不总是关于禁用 JavaScript 的用户,而且他们可能会破坏服务器。

例如,如果站点对 进行了 JavaScript 最大长度检查<input>,则用户可以禁用该检查,从而发送比您的服务器和/或数据库预期更多的数据。这可能会通过长时间占用服务器线程的大型 POST 使服务器过载,它可能会暴露数据库中的弱点,例如违反数据库约束可能会暴露有关任何持久性信息的详细信息。更糟糕的是,如果没有限制,用户可能能够执行注入攻击。

另一个例子是有人使用外部 HTTP 工具向您的服务器发送请求,完全绕过任何 JavaScript。在开发过程中一直使用Advanced REST Client for Chrome 来测试 JSON API。

通过 JavaScript 进行客户端验证只是向使用站点的人提供有关他们与站点交互的任何信息更快反馈的一种方式在传统的客户端-服务器通信中,由于上述原因,应该是唯一的验证。

客户端验证是具有即时字段验证的高度交互表单的解决方案,但它不会阻止恶意用户将无效的格式化数据注入和发布到服务器。重要的是您的服务器端脚本验证用户正在做的一切,否则您的站点将暴露于 SQL 注入攻击、XSS 攻击、用户做他们不应该做的事情等。