4

我有一个用户填写的表单,JavaScript 用于验证输入(例如,确保密码字段不留空)。由于 JavaScript 是客户端并且未编译,因此任何人都可以轻松地弄乱它。这是否意味着有必要在服务器上再次验证来自用户的数据?如果是的话,既然 JavaScript(理论上)已经做到了,那么它是否可以变得更高效?

4

7 回答 7

6

是的,有必要在服务器上验证数据,因为最终用户客户端可能会弄乱它。

如果是的话,既然 JavaScript(理论上)已经做到了,那么它是否可以变得更高效?

它已经比仅使用服务器端验证更有效,因为您通过客户端验证避免了很多往返验证(您只需提交一次数据,除非验证不完整或被禁用,否则它将直接通过)。也提供了更好的用户体验。

您无法取消服务器端验证(如果您关心数据)。如果数据只返回给同一个用户并且没有在其他任何地方显示或使用(并且没有可能破坏系统上的任何内容),您可以稍微放松一下。举个极端的例子,Dropbox 可能不关心你上传什么文件,所以他们不会验证你上传的 HTML 是否包含恶意 Javascript。

于 2013-04-23T00:03:00.870 回答
2

只需单击鼠标,我就可以禁用您页面上的任何 javascript。我什至可以完全绕过 HTML 表单并将数据直接发送到您的服务器。

例如,如果您使用$_GETI 检索数据,只需弄乱地址栏即可绕过您的表单(和 javascript 验证)。不要认为 using$_POST会改变这一点:这只是编写 HTTP 请求的问题。

所以,是的......永远不要相信用户输入,即使使用 javascript 进行了清理。

正如上面有人发布的那样,javascript 验证可以防止合法的用户错误(从而将错误的数据保存到您的服务器然后返回给用户),但恶意用户仍然能够非常容易地绕过它。

于 2013-04-23T00:03:31.677 回答
2

简短的回答:是的,而且总是!

阅读有关 PDO、SQL 注入、UUID、令牌、MD5、SHA、跨站点请求伪造...您有一个全新的世界等着您去发现!:) 我的意思很好。了解这一点,您将建立更安全的网站

您始终需要牢记这一点:永远不要相信用户输入数据。绝不。所以你必须在服务器端执行额外的验证过程。

于 2013-04-23T00:03:42.977 回答
1

是的,一点没错。在重新发布到服务器之前,仍然有可能有人拦截表单并修改值。

于 2013-04-23T00:03:27.760 回答
1

用户当然可以禁用 JavaScript。由于源代码就在那里,因此也很容易弄乱它。用户还可以运行任意 JS,从而更容易弄乱你的东西。

因此,您也应该始终进行服务器端验证。客户端验证应仅用作用户的方便信息。永远不要相信它是您唯一的安全来源。

于 2013-04-23T00:03:33.603 回答
1

是的,您必须在客户端和服务器端都进行验证。您必须考虑渐进增强。将 Javascript 视为只是增强的一个层,而不是必需品。因为用户始终可以自行决定在其浏览器中禁用 Javascript,从而使您的 Javascript 代码无用。

客户端验证的一个优点是您正在保存到服务器的往返验证用户名或密码是否为空,这可以在 javascript 中轻松完成。

于 2013-05-29T18:19:05.260 回答
0

是的,为了安全起见,您需要添加服务器端验证。
预期在客户端完成的任何事情都没有得到保证,因此您需要重复任何重要的事情。
此外,有些事情可能会在服务器端进行评估,但不会在客户端进行评估。诸如 SQL 注入检查之类的事情就属于这一类。

于 2013-04-23T00:05:40.273 回答