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