7

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

我的问题是这个论点在实践中有多好?从理论上讲它是有道理的,但实际上,如果JavaScript在浏览器中被禁用,那么大多数网站功能甚至都不起作用。如果没有JavaScript,用户可能甚至无法加载页面,更不用说提交表单了。为什么我们需要客户端和服务器端验证?

+1

这可能更适合[程序员](http://programmers.stackexchange.com/)。投票迁移。也有潜在的重复:http://stackoverflow.com/questions/3483514/why-is-client-side-validation-not-enough?rq=1 – 2013-04-06 20:38:54

+0

实质上,没有客户端验证,如果它是这样的事情被视为安全问题。没有关闭JavaScript的浏览器可能会杀死互联网上所有网站的95%。几乎没有网站似乎有非JavaScript浏览的后备。 – 2013-04-06 20:41:09

+1

@Allendar:大网站呢。你会惊讶地发现Facebook(好吧,大部分的脸书,有些不是)没有JS。这是中档和“omg web2.0真棒”的网站,不...这是一个耻辱,无论是对他们还是其他人。然而,有些人却永远不会学到:-( – 2013-04-06 21:18:49

回答

29

客户端验证只是避免客户端“但我填补了这一切,它并没有告诉我任何东西!”。它不是,实际上是强制性的,实际上,客户端验证是一个非常新的事物(阅读:5岁或更少)。实际上,它所做的只是阻止你的客户端(启用JS)在重新加载页面之前知道表单是否正常。 如果AJAX在游戏中,它不同 - 它允许您节省带宽,并在提交之前向用户提供反馈。 最后,如果您正在建立严格的客户端,对等交换应用程序(思考游戏),您需要客户端验证以防止客户端作弊。

服务器端验证也很关键,因为客户端验证可以通过关闭JavaScript来完全绕过。从某种意义上说,JS驱动的验证是一种方便和美观/美观的改进,应该依赖于而不是。此外,为了禁用或绕过最复杂的JS验证,在本地编辑页面源代码是微不足道的。

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

7

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

客户端验证总是提供更好的用户体验(UX),因此用户不必仅仅因为表单中的值无效就提交并重新加载页面 - 它使事情更具活力。因为你甚至不需要浏览器发出请求,独立于依赖JS正常工作的你的网站,你将需要服务器端的验证和消毒所有的用户输入,以防你不关心你的数据库没有被执行。

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

+1

@ Kassik嗯,我通常使用[TamperData](https://addons.mozilla.org/en-us/firefox/addon/tamper-data/)当我测试我的页面对SQL注入,我还使用Node.js([form-data module](https://github.com/felixge/node-form-data))从头开始生成请求。实际上,任何程序都可以发出http请求并发送任意的GET/POST数据 - 我不太确定它是如何适用于java后端的,但它不应该太差。 – 2013-04-06 20:52:23

+0

验证_can_可以在客户端上完成,例如许多浏览器都支持HTML5表单验证属性 - http://www.html5rocks.com/en/tutorials/forms/constraintvalidation/ – andyb 2013-04-06 21:00:14

+0

@andyb“验证”在这个意义上仅仅是UX。通过Chrome开发工具/ Firebug禁用这些限制,可以轻松绕过这些限制,毕竟这些都不过是可以通过JavaScript访问和修改的DOM元素属性。 – 2013-04-06 21:01:50

0

客户端验证是高度交互式表单的动态字段验证解决方案,但它不会阻止恶意用户向服务器注入和发​​布无效格式数据。重要的是你的服务器端脚本验证用户正在做的所有事情,否则你会暴露你的网站到SQL注入攻击,XSS攻击,用户做他们不应该等的东西等。

2

始终保护您的输入服务器。这并不总是关于JavaScript禁用的用户,而且他们也可能会破坏服务器。例如,如果一个站点对<input>进行JavaScript最大长度检查,用户可以禁用该检查,从而发送比您的服务器和/或数据库预期更多的数据。这可能会导致长时间占用服务器线程的大型POST重载服务器,这可能会暴露数据库中的弱点,例如违反数据库约束,可能会暴露有关任何持久性信息的详细信息。更糟的是,如果没有限制,用户可能能够执行注入攻击。

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

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

1

如果用户已经禁用了javascript,那么他自己就有问题了,他决定单独禁用javascript,理由是......为此,当您创建网站时,您必须始终牢记您的网站必须是有效的适用于带有和不带javascript的用户。需要用于多种原因两侧验证,它们中的一些是:

  • 用户停用了JavaScript
  • 在目的的恶用户为了利用系统
  • 用JavaScript已经移除了JavaScript的验证您减少网站和客户之间的数据流量。
  • 当然与服务器验证您确保一次为所有的数据是正确的

有可能有一个使用JavaScript和“老”技术是有效的为每一位用户一个网站,每个浏览器。

相关问题