【发布时间】:2016-12-29 02:12:21
【问题描述】:
我有一个基于 ajax 的脚本,它纯粹是为了运行 php 脚本来验证用户身份而设计的。与用户身份验证一样,可能会出现以下两种结果之一:要么通过身份验证,要么不通过。
要在调用它的页面上表示成功或失败非常简单,您只需 echo ‘success’; 或相应地'echo'failure'' 并让 JS/jQuery 脚本通过响应字符串处理它。 (或者至少我认为这是很好的做法..)
但除了本质上返回 true 或 false 之外,如果它返回 false,我还想返回一条消息,说明它失败的原因。用户存在吗?密码不正确吗?还是数据库访问出错了,需要吐出技术错误码。由于我们已经在以真或假进行响应,因此我们不能将消息与虚假陈述一起发回,否则从技术上讲它不是虚假的,因为有更多数据。
现在我有了这些想法,但我觉得有更好的方法来做到这一点:
- 返回一个数组
[true/false, “String to display”],尽管这在 PHP 文件中看起来很笨重,并且还在页面上解析它 - 当我们想要返回 true 时返回
success,并将其他任何内容标记为失败并假设它是失败的消息
但老实说,我觉得整个文本响应方法很糟糕,尤其是对于像用户身份验证这样的事情,因为它可能很容易被欺骗(?)那么推荐的方式来实现这样的事情呢?
提前致谢!
【问题讨论】:
-
你可以用
JSON轻松搞定 -
任何东西都可以在客户端被欺骗。这就是为什么会话存在于服务器端的 PHP 中。您发送的内容以及在客户端如何解析它完全取决于您的技能和品味,但我也建议使用 JSON,因为它更容易处理/维护。注意:如果用户不存在或密码错误(提供更多破解选项),我永远不会明确告诉用户,我只会说
wrong credentials -
如果您想了解有关最佳实践的更多信息,请查看现有的 PHP 框架以了解它们是如何做到的。例如,Laravel 刚刚添加了一个功能来限制身份验证请求:
By default, the user will not be able to login for one minute if they fail to provide the correct credentials after several attempts. The throttling is unique to the user's username / e-mail address and their IP address.laravel.com/docs/5.2/authentication#authentication-throttling -
@bansi 就会话而言,这一切都在 PHP 上使用会话 ID、cookie 和一大堆其他验证进行处理,因此即使用户欺骗客户端以通过登录窗口,它由于一次狡猾的会议,他们会直接吐回去。此外,我从不说没有用户或密码错误,但在某些情况下,除了“帐户未激活”或“帐户已被禁止 x 时间”等不良凭据外,我还需要显示另一条消息。这些是我认为重要的案例,不仅要返回失败,还要返回一条消息。