我想知道为什么我必须在客户端验证表单,而他们无论如何都需要服务器端(ajax
)验证没有被黑客攻击?
客户端和服务器端(ajax)形式验证是否有任何好处?
我的意思是他们做同样的事情,但ajax需要300毫秒而客户端可能需要0毫秒,这是一个非常好的理由,为什么要进行重复验证? :P
另外,使用单一服务器端验证,您从客户端删除不需要的js,我只看到只有ajax验证的好处,那么你呢?
如果我要进行客户端验证,是否有一些方法/实践/逻辑可以遵循不在服务器端重复验证?就像只有客户端验证可以服务器执行操作/请求一样?
其实我的逻辑是:
服务器+客户端验证 请求少 - >更多代码(重复) - >更麻烦 - >更好的UX 服务器端验证(仅限ajax) 更多请求 - >更少的代码 - >少麻烦 - >可能是同样的用户体验!?
对不起maccheronic english asd:D
答案 0 :(得分:9)
您应该考虑将客户端和服务器端验证作为单独的工具来实现单独的目标。
你绝对应该在服务器端进行验证的原因是因为绝对没有什么能阻止我手动编辑Javascript文件以删除任何客户端验证。即使您的代码被缩小和混淆(两者都可以取消),您也无法阻止这种情况。
客户端验证 nice (但不像服务器端验证那样必要)的原因是因为它实际上帮助用户创建将继续通过服务器端验证的表单。 AngularJS可以在每个按键之后轻松验证表单。从用户的角度来看,这是非常棒的。想想所有那些密码字段旁边都有“密码强度”表的表格,说明为了通过验证,强度需要“好”或更好。如果您在每次按键后都要进行ajax验证调用,那么您的服务器负载会增加几个数量级。
这个想法是服务器端验证只会在用户点击“提交”按钮后发生。当用户甚至考虑点击“提交”按钮时,他们应该已经知道他们的表单将通过验证。
但是,让我们来解决您的真正问题:您只想输入一次验证规则。太棒了!现在您正在考虑DRY!唯一的问题是,这需要在后端使用某些东西来自动生成客户端验证,这可能很困难。 替代方案可能是让您的前端拨打服务器电话,询问规则,并教导您的前端如何解释响应。这将是一个额外的电话,但它应该是一个相对便宜的。不幸的是,这是一项额外的工作。如果您希望您的表单在不久的将来经常更改,那么这可能是值得的。能够在一个地方而不是两个地方改变它将在这种情况下获得巨大的好处,并且可能值得花费额外的时间在前面。
那么,客户端验证是否绝对需要?嗯,这取决于。客户可能非常挑剔,所以如果这是一个实际为您创造收入的表格(银行账户申请表),那么您需要意识到,如果某些客户点击“提交”并看到他们的网页,他们可能会关闭您的网页。整个地方形成了满满的红色。如果他们在发生问题时被告知问题,而不是一次性问题,那就更好了。
但是,如果您在截止日期前创建了Intranet应用程序,那么您可能需要查看优先级并进行判断调用;)
答案 1 :(得分:3)
假设您在表单提交时验证所有可能具有威胁性的输入(例如继续进行SQL查询的字段),则应在客户端执行所有表单验证,因为它可以提供更好的用户体验。
我会重申。 这假设您在表单提交时验证所有可能具有威胁性的输入!提出完全绕过您的验证的请求非常容易,如果您盲目地信任客户端验证,您可能会参与将来严重的头痛。
为了更具体地回答,您真正想要进行AJAX
验证的唯一时间是在验证之前需要服务器端数据进行检查时不能或不应该发送(例如作为唯一的用户名,电子邮件等。)