为什么客户端validation不够?

我在这里看到:

正如你可能已经知道的那样,依靠客户端validation是一个非常糟糕的主意。 始终执行适当的服务器端validation。

你能解释为什么服务器端validation是必须的吗?

客户端validation – 我假设你在这里讨论网页 – 依赖于JavaScript 。

JavaScript支持的validation可以在用户的​​浏览器中closures,由于脚本错误而失败,或者在不费力的情况下被恶意规避。

另外,表单提交的整个过程可能是伪造的。

所以,从来没有一个保证,什么到达服务器端,是干净和安全的数据。

编写服务器应用程序有一个简单的规则: 不要信任用户数据。

您需要始终假定恶意用户以您不打算的方式访问您的服务器(例如,在这种情况下,通过curl进行手动查询而不是预期的网页)。 例如,如果你的网页试图过滤掉SQL命令,攻击者已经有了一个好的提示,那就是用SQL命令传递input可能是一个好的攻击向量。

任何人都知道基本的JavaScript可以绕过客户端。

客户端只是用来改善用户体验(不需要重新加载页面来validation)

在不特定于Javascript和Web客户端的情况下,为了更广泛地解决这个问题,服务器应该负责维护自己的数据(与底层数据库一起)。

在客户端 – 服务器环境中,服务器应该准备好许多不同的客户端实现可以与之通话的事实。 考虑一个贸易进入系统。 客户可以是graphics用户界面(例如交易入口系统)和(比方说)数据上传客户端(从.csv文件加载多个交易)。

客户端validation可能以许多不同的方式执行,而不是全部正确。 因此,服务器不一定要信任客户端数据,并且自己执行完整性检查和validation。

您与之交谈的客户可能不是您认为正在与之交谈的客户,因此可能无视您要求的任何validation。

在Web上下文中,用户不仅可能在浏览器中禁用了JavaScript,而且还有可能不会与浏览器通信 – 您可能会从正在发布的bot中获取表单提交到您提交的URL没有看到任何forms。

在更广泛的背景下,您可能正在处理一个正在发送实际客户端永远不会(例如FPS游戏的目标机器人)的被黑客户端,或者甚至可能是由反向devise您的有线协议的人创build的完全自定义的客户端对于你期望它执行的validation一无所知。

如果攻击者张贴自己的forms。

您可以closures/编辑JavaScript。

因为用户代理(例如浏览器)可能是假的。 创build自定义应用程序以创build具有任意标题和内容的HTTP请求非常简单。 它甚至可以说这是一个真正的浏览器 – 你无法分辨。

你所能做的只是查看请求的内容,如果你不检查它,你不知道它是有效的。

服务器端validation是必须的,因为客户端validation不能确保未经validation的数据将到达服务器。

客户端validation是不够的,因为它的行动范围是非常有限的。 validation仅在浏览器用户界面中执行。

Web服务器“侦听”并接收包含来自浏览器的数据的HTTP请求 ,然后对其进行处理。

恶意用户可以通过多种方式发送恶意HTTP请求。 浏览器甚至不是必需的。

在浏览器中使用JavaScript执行的客户端validation是一个重要的可用性,用户界面增强。 但是它并不能防止知道如何绕过build立HTTP请求的浏览器默认行为发送给服务器的用户发送恶意数据 。 这可以通过一些浏览器插件,使用cURL等来轻松完成。

一般来说,对于应用程序的每一部分来说,最好是自己进行检查/validation。

客户端检查对于最大限度地发挥用户体验是非常有用的,并且可以加快向客户反馈他们需要修复的问题,并减less服务器端检查中遇到的问题。

然后,在服务器端代码的每个主要转换点上,都应该有相应的检查。 validation应用程序代码中的input ,最好通过白名单inputvalidation ,然后与数据库进行任何交互使用参数化查询,以进一步确保不会发生问题。

您应该对任何数据执行服务器端validation,如果数据无效,可能会对发布数据的实​​体以外的任何人造成危害。 客户端validation可能适用于无效数据对发布它的实体以外的任何人没有不良影响的情况。 除非您能确定坏数据的不良影响不会超出发布它的实体,否则您应该使用服务器端validation来保护自己免受破坏者或其他非法客户端的攻击。

客户端validation是为了保存客户端input错误的数据。 服务器端validation用于保存服务器处理错误的数据。 在这个过程中,它也在提交过程中引入了一些安全性。

客户端validation以安全浏览器,客户端语言或HTML 5为前提。所有这些元素都可能被禁用,部分不可用,或者根本没有实现。 您的网站必须从每个人,每个浏览器使用。 服务器端语言更安全,如果他们不是错误,validation肯定会更安全和正确。

好友,假设一个人在他的浏览器中closuresjavascript,validation就失效了。 那么,如果他通过这种forms发布一些有害的内容到服务器端。 这将导致严重的漏洞,如SQL注入或XSS或任何其他types的问题。 所以要小心,如果你要实现客户端JavaScriptvalidation。

谢谢