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