40

我在这里看到:

您可能已经知道,仅依靠客户端验证是一个非常糟糕的主意。始终执行适当的服务器端验证。

您能解释一下为什么必须进行服务器端验证吗?

4

14 回答 14

64

客户端验证——我假设你在这里谈论的是网页——依赖于JavaScript

JavaScript 支持的验证可以在用户的​​浏览器中关闭,由于脚本错误而失败,或者被恶意规避而无需付出太多努力。

此外,表单提交的整个过程都可以伪造。

因此,永远无法保证到达服务器端的数据是干净且安全的数据。

于 2010-08-14T13:34:23.700 回答
19

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

您需要始终假设恶意用户以您不希望的方式访问您的服务器(例如,在这种情况下,通过手动查询 viacurl而不是预期的网页)。例如,如果您的网页试图过滤掉 SQL 命令,攻击者已经很好地暗示了通过 SQL 命令传递输入可能是一个很好的攻击向量。

于 2010-08-14T14:09:20.440 回答
13

任何了解基本 javascript 的人都可以绕过客户端。

客户端仅用于改善用户体验(无需重新加载页面验证)

于 2010-08-14T13:35:53.710 回答
7

您正在与之交谈的客户可能不是您认为正在与之交谈的客户,因此它可能会忽略您要求它进行的任何验证。

在网络环境中,用户不仅有可能在他们的浏览器中禁用了 javascript,而且您也有可能根本没有与浏览器对话——您可能会从正在 POST 的机器人获取表单提交到您的提交 URL,而根本没有看过表单。

在更广泛的背景下,您可能正在处理一个被黑客入侵的客户端,该客户端正在发送真实客户端永远不会发送的数据(例如,FPS 游戏的瞄准机器人),或者甚至可能是由对您的有线协议进行逆向工程的人创建的完全自定义客户端它对您期望它执行的任何验证一无所知。

于 2010-08-14T14:06:06.963 回答
6

在不针对 Javascript 和 Web 客户端以及更广泛地解决问题的情况下,服务器应该负责维护自己的数据(与底层数据库一起)。

在客户端-服务器环境中,服务器应该准备好接受许多不同的客户端实现可能与它对话的事实。考虑一个交易进入系统。客户端可以是 GUI(例如交易输入系统)和(例如)数据上传客户端(从 .csv 文件加载多个交易)。

客户端验证可以以许多不同的方式执行,但并非所有方式都正确。因此,服务器不必信任客户端数据并自行执行完整性检查和验证。

于 2010-08-14T13:52:21.260 回答
5

以防攻击者发布他们自己的表格。

于 2010-08-14T14:02:22.183 回答
3

您可以关闭/编辑 JavaScript。

于 2010-08-14T13:52:53.733 回答
3

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

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

于 2010-08-14T14:17:40.570 回答
1

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

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

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

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

在浏览器中使用 JavaScript 执行的客户端验证是一项重要的可用性和用户界面增强功能。但它并不能阻止知道如何规避浏览器默认行为的用户发送恶意数据,即构建将发送到服务器的 HTTP 请求。这可以通过一些浏览器插件、使用 cURL 等轻松完成。

于 2010-08-14T14:57:13.670 回答
1

一般来说,最好让应用程序的每个部分都进行自己的检查/验证。

客户端检查有利于最大化用户体验并加快向客户端反馈他们需要修复的内容,并减少服务器端检查中遇到的问题数量。

然后在服务器端代码的每个主要转换点,您也应该在那里进行检查。验证应用程序代码中的输入,最好通过白名单输入验证,然后与数据库进行任何交互,使用参数化查询进一步确保不会发生问题。

于 2010-08-14T17:28:32.370 回答
0

您应该对任何数据执行服务器端验证,如果这些数据无效,则可能对发布数据的实​​体以外的任何人造成伤害。客户端验证可能适用于无效数据对发布它的实体以外的任何人都没有不良影响的情况。除非您可以确定不良数据的不良影响不会传播到发布它的实体之外,否则您应该使用服务器端验证来保护自己免受破坏者或其他流氓客户端的侵害。

于 2010-08-14T14:34:14.180 回答
0

客户端验证是为了避免客户端输入错误的数据。服务器端验证是为了避免服务器处理错误的数据。在这个过程中,它还在提交过程中引入了一些安全性。

于 2010-08-14T16:52:58.177 回答
0

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

于 2010-08-14T23:51:03.880 回答
0

伙计,假设一个人在他的浏览器中关闭了 javascript,验证就失效了。然后如果他通过那个表格向服务器端发布一些恶意内容。它将导致严重的漏洞,如 sql 注入或 xss 或任何其他类型的问题。因此,如果您要实现客户端 javascript 验证,请注意。

谢谢

于 2013-06-24T18:16:05.487 回答