当前位置: 首页 > 面试题库 >

JavaScript:客户端验证与服务器端验证

鞠通
2023-03-14
问题内容

进行客户端或服务器端验证哪个更好?

在我们的情况下,我们正在使用

  • jQuery和MVC。
  • 在我们的视图和控制器之间传递的JSON数据。

我所做的许多验证工作都是在用户输入数据时对其进行验证。例如,我使用该keypress事件来防止文本框中的字母,设置最大字符数,并且该数字在一定范围内。

我想更好的问题是,与客户端相比,进行服务器端验证是否有任何好处?

真棒的答案大家。我们拥有的网站受到密码保护,并且用户群较小(<50)。如果他们没有运行JavaScript,我们将发送忍者。但是,如果我们要为每个人设计一个站点,那么我同意双方都进行验证。


问题答案:

正如其他人所说,您应该同时做这两项。原因如下:

客户端

您希望首先在客户端上验证输入,因为您可以向 普通用户 提供 更好的反馈
。例如,如果他们输入无效的电子邮件地址并移至下一个字段,则可以立即显示错误消息。这样,用户可以 提交表单 之前 更正每个字段。

如果仅在服务器上进行验证,则他们必须提交表单,获取错误消息,然后尝试找出问题所在。

(可以通过让服务器重新呈现表单并填充用户的原始输入来减轻这种痛苦,但是客户端验证仍然更快。)

服务器端

您想在服务器端进行验证,因为您可以 防止恶意用户的攻击该用户 可以轻松绕过您的JavaScript并将危险的输入提交给服务器。

信任您的UI是非常危险的。 他们不仅会滥用您的UI,而且可能根本没有使用您的UI,甚至根本没有使用浏览器
。如果用户手动编辑URL或运行自己的Javascript或使用其他工具调整HTTP请求该怎么办?例如,如果他们curl从一个脚本或从一个脚本发送自定义HTTP请求怎么办?


这不是理论上的;例如,我开发了一个旅行搜索引擎,通过向POST用户发送请求,就好像用户已经填写了每个公司的搜索表一样,然后将其收集并排序,从而将用户的搜索重新提交给许多合作伙伴航空公司,公交公司等。这些结果从未被执行过,这些公司的JS表单从未执行过,对于我们来说至关重要的是,它们会在返回的HTML中提供错误消息。当然,API会很好,但这就是我们必须要做的。

安全的角度来看,不允许这样做不仅是幼稚的,而且是非标准的:应允许客户端以他们希望的任何方式发送HTTP,并且您应该正确响应。这包括验证。

服务器端验证对于 兼容性 也很重要-并非所有用户(即使他们使用的是浏览器)都将启用JavaScript。

附录

有些验证 甚至无法在服务器端应用程序代码中正确完成,而在客户端代码中则完全不可能
,因为它们取决于数据库的当前状态。例如,“没有其他人注册过该用户名”,“您正在评论的博客文章仍然存在”,“现有的预订不与您请求的日期重叠”或“您的帐户余额仍然足以支付该笔购买费用”
。” 只有数据库才能可靠地验证依赖于相关数据的数据。
开发人员经常将其搞砸,但是PostgreSQL提供了一些好的解决方案。



 类似资料:
  • 验证 SSH 服务器证书(客户端) 和 SSH 用户证书 类似,使用客户端机构认证来验证主机。需要一个 SSH 服务器数字证书认证机构签发服务器证书,客户端只需要保存 CA 的公钥。 使用一台处于气隙系统下的计算机来生成服务器数字证书认证机构的根证书: ❯ ssh-keygen -C "SSH Server Certificate Authority" -f sshserver.root.ca 使

  • 问题内容: 我试图了解如何执行以下操作: 声明表单的可接受方式是什么。我的理解是,您只需用HTML声明表单,并添加ng-model指令,如下所示: 要发送到服务器的内容。我可以将item对象作为JSON发送到服务器,然后对其进行解释。然后,我可以对对象执行验证。如果失败,则抛出JSON错误,然后发回确切的信息?有接受的方式吗?如何以一种很好的方式将验证错误从服务器推送到客户端? 我确实需要一个示例

  • 我试图了解如何做以下事情: 声明表单的公认方式是什么。我的理解是您只需用超文本标记语言声明表单,然后添加ng-model指令,如下所示: 发送到服务器的内容。我可以将item对象作为JSON发送到服务器,并对其进行解释。然后我可以对对象执行验证。如果失败,我抛出一个JSON错误,并返回具体内容?有没有公认的方法?如何以一种好的方式将验证错误从服务器推送到客户端? 我真的需要一个例子,但是Angul

  • 我正在尝试使用ServerEvents设置servicestack。我已经为ServerEventsFeature添加了插件。我正在使用Javascript服务器事件客户端,我尝试了一个简单的示例,在用户经过身份验证后在客户端上执行此操作。 在apphost文件上: 要向我正在呼叫的客户端发送事件,请执行以下操作: 我成功地在客户端上的show通知功能上接收到它。 然而,订阅服务仍然存在。disp

  • 因此,为了实现这个逻辑,我认为我需要在客户端验证JWT令牌。Q1,这是一个明智的做法吗。 Q2,我正在使用的库似乎需要一个公钥才能使用它的函数。我似乎没有公钥,只有一个秘密,这是我刚刚编造的,所以它不是用一对生成的。我的公钥从何而来,或者是否有另一种方法来验证我的令牌而不使用此方法? 这一切似乎应该是显而易见的,我错过了一些东西,所以很抱歉,如果这是一个愚蠢的问题,但我似乎找不到答案?

  • 附加内容 How I’ve set up SSH keys on my Yubikey 4 (so far) How to Harden SSH with Identities and Certificates Scalable and secure access with SSH