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

13
使用客户端验证(JavaScript)和服务器端验证(使用验证器)的一个论据是,如果客户端浏览器不支持JavaScript或故意关闭了JavaScript,则客户端验证将变得无用。

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

1
这可能更适合程序员。投票迁移。还有潜在的重复:https://dev59.com/OXA75IYBdhLWcg3wFE2b?rq=1 - Ben McCormick
实质上,如果将其视为安全问题,则不存在所谓的客户端验证。关闭JavaScript的浏览器可能会导致互联网上95%的所有网站无法使用。几乎没有网站似乎有非JavaScript浏览的备选方案。 - user1467267
1
@Allendar:大型网站会使用JS,但你会惊讶地发现Facebook(好吧,大部分是这样。有些部分不是)可以在没有JS的情况下运行。那些中等规模和“哦我的天,Web2.0太棒了”的网站才不会呢……这很遗憾,对他们自己和其他人都是如此。尽管如此,有些人就是永远学不会 :-( - Sébastien Renauld
强制性的XKCD - FelipeAls
看一下这个。http://www.dzyngiri.com/client-side-vs-server-side-validation/ - Human Being
5个回答

38

客户端验证只是避免客户端出现“但我已经把这些填完了,却没有告诉我任何信息!”的情况。它实际上不是强制性的,在实际中,客户端验证是一件非常新的事情(即:5年或更短)。实际上,它只是防止具备JS功能的客户端在重新加载页面之前知道表单是否正确。

如果使用AJAX,则情况不同——它可以让您节省带宽,并在提交之前为用户提供反馈。

最后,如果您正在构建严格的客户端对等交换应用程序(例如游戏),则需要进行客户端验证以防止客户端作弊。

由于客户端验证可以通过关闭JavaScript来完全绕过,因此服务器端验证也至关重要。从某种意义上说,基于JS的验证是一种方便和美学/修饰性的改进,不应该依赖于它。此外,很容易在本地编辑页面源代码以禁用或绕过即使最复杂的JS验证。

如果您不进行服务器端验证,用户会做什么?根据您如何使用他们的数据而定。您可能允许用户删除整个数据库(或更糟糕的是泄漏它们),修改任何他们喜欢的内容(或更糟糕的是阅读任何他们喜欢的东西。目录遍历漏洞是淘气人员极为常见的入口点),并根据自己的意愿提升其权限。您想冒这个风险吗?不验证用户输入就像是信任人们并没有在房子上安装锁。


11

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

客户端验证总是为了提供更好的用户体验(UX),使用户不必仅因表单中的值无效而提交和重新加载页面 - 这使事物更加动态。

由于您甚至不需要浏览器来发出请求,与您的网站是否依赖JS正常工作无关,您将需要服务器端验证并清理所有用户输入,以防止数据库受到攻击。

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


1
@Kaushik 嗯,当我测试我的页面防止 SQL 注入时,我通常使用 TamperData,我还使用 Node.js(带有 form-data 模块)从头开始生成请求。实际上,任何程序都可以发出 http 请求并发送任意的 GET/POST 数据 - 我不太确定这对于 Java 后端有什么用处,但它不应该有太大的区别。 - Fabrício Matté
验证可以在客户端完成,例如许多浏览器支持HTML5表单验证属性 - http://www.html5rocks.com/en/tutorials/forms/constraintvalidation/ - andyb
@andyb 在那个意义上,“验证”仅仅是用户体验。毕竟,可以通过禁用Chrome Dev Tools / Firebug中的这些约束来轻松地绕过它们,因为它们只是可以通过JavaScript访问和修改的DOM元素属性。 - Fabrício Matté
它被称为“约束验证”。我试图解释,我认为你的说法“验证只能在服务器端执行”是误导性的,因为规范将其称为“验证”。 - andyb
1
@andyb 是的,我的意思是验证到达服务器的输入。我会尝试重新措辞。 - Fabrício Matté
@andyb 是的,你说得对,它是浏览器内部的“验证”,问题是(正如你所知道的),你不需要浏览器就可以轻松地绕过它。好的,我已经从第一句话中删除了“只有”这个词。 - Fabrício Matté

3

始终保护服务器的输入。问题不仅在于用户禁用JavaScript,还可能会破坏服务器。

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

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

通过JavaScript进行客户端验证只是提供快速反馈给使用站点的人员与其互动的任何信息的一种方式。在传统的客户端-服务器通信中,出于上述原因,它不应是唯一的验证方式。


2
如果用户禁用了JavaScript,那是他自己的问题,他自己决定禁用JavaScript是有原因的。因此,在制作网站时,您必须始终记住,您的网站必须适用于具有和不具有JavaScript的用户。双重验证对于许多原因都是必要的,其中一些原因是:
  • 用户已禁用JavaScript
  • 恶意用户故意删除JavaScript以利用系统
  • 使用JavaScript验证可以减少网站与客户端之间的数据流量。
  • 当然,通过服务器验证,您可以确保所有数据都是正确的

可以拥有一个同时使用JavaScript和“旧”技术的网站,以便对每个用户和每个浏览器都有效。


0

客户端验证是高度交互式表单的解决方案,具有即时字段验证功能,但它不能防止恶意用户注入和发布格式无效的数据到服务器。重要的是,您的服务器端脚本验证用户所做的一切,否则您将使您的网站暴露于SQL注入攻击、XSS攻击、用户执行不应该执行的操作等风险之中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接