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

标签 javascript security validation

客户端验证和服务器验证哪个更好?

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

  • jQuery 和 MVC。
  • 在我们的 View 和 Controller 之间传递的 JSON 数据。

我所做的很多验证都是在用户输入数据时验证数据。 例如,我使用 keypress 事件来阻止文本框中的字母,设置最大字符数以及一个数字在一个范围内。

我想更好的问题是,在客户端进行服务器端验证有什么好处吗?


真棒回答每个人。我们拥有的网站是受密码保护的,并且用户群很小(<50)。如果他们没有运行 JavaScript,我们将发送 ninjas。但如果我们要为每个人设计一个网站,我会同意双方都进行验证。

最佳答案

正如其他人所说,您应该两者都做。原因如下:

客户端

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

如果您只在服务器上进行验证,他们必须提交表单、收到错误消息并尝试找出问题所在。

(这种痛苦可以通过让服务器重新渲染表单并填写用户的原始输入来缓解,但客户端验证仍然更快。)

服务器端

您希望在服务器端进行验证,因为您可以防范恶意用户,他们可以轻松绕过您的 JavaScript 并向服务器提交危险输入。

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

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

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

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

附录 - 2016 年 12 月

有些验证甚至无法在服务器端应用程序代码中正确完成,而在客户端代码中则完全不可能,因为它们取决于数据库的当前状态。例如,“没有其他人注册该用户名”,或“您评论的博客文章仍然存在”,或“没有现有预订与您请求的日期重叠”,或“您的帐户余额仍有足够的金额支付该购买。” 只有数据库才能可靠地验证依赖于相关数据的数据。 开发者regularly screw this up , 但是 PostgreSQL provides some good solutions .

关于JavaScript:客户端与服务器端验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/162159/

相关文章:

javascript - Mocha 和 Mongoose 超时

javascript - 从 jquery 更改事件填充 2 个下拉列表

javascript - Canvas 在浏览器之间是否有不同的抗锯齿功能?

security - 自身子域的内容安全策略

security - 我是否面临以不需要用户登录的 POST 形式进行 CSRF 攻击的风险?

c# - 使用 SMO.Agent 检索 SQL 作业执行状态 - 安全问题

java - 使用java.util.Scanner验证输入

javascript - 使用 ES6 类继承进行参数化验证的值

javascript - Mocha 测试与焦点相关的行为(Backbone/CoffeeScript 应用程序)

php - Laravel 验证失败时方法不允许异常