4

这是一个非常简单的问题——尽管当我开始我的第一个真实世界且非常宏大(就规模而言)项目时,我现在就在想这个问题。

Ajax request发送via时,我将如何验证用户的身份(用户名和密码)PHP?似乎有一个简单的解决方案:将用户名和密码POST variables与请求中的其他用户一起发送,但在我看来,该解决方案效率很低(因为每次发出请求时它都必须检查数据库并且对于不同的 Ajax 请求是相当多余的)。

我调查了 Twitter 如何处理他们的 Ajax 请求(例如发布新推文),我没有看到他们在请求中发送任何身份验证信息 - 但他们怎么知道这实际上是我,我的个人资料的所有者,发送 Ajax 请求以发布新推文?

如果它可以帮助任何人提出一个很好的解决方案 - 我正在使用 JQuery AJAX 库和 CodeIgniter PHP 框架。

谢谢!

4

2 回答 2

5

Ajax 请求与任何其他 HTTP 请求完全相同。无论是通过 JavaScript 还是通过在浏览器的地址栏中输入 URI 来完成,它们都是 HTTP 请求。

你是对的,通过 HTTP 发送用户名和密码是错误的解决方案。但是,通常需要发送一次用户名/密码,但这只能在 HTTPS 上完成,因此它不会以纯文本形式发送。一旦通过身份验证,您可以将用户 ID 存储在服务器端会话变量中,以便在将来的请求中访问。

一些伪代码可以帮助您:

if(!empty($_SESSION["userId"])) {
    // User is authenticated. Do something.
}
else if(!empty($_POST["username"])) {
    // User is attempting to log in. Check against database.
    $userId = getUserIdByUsernamePassword($_POST["username"], $_POST["password"]);

    // Store user id in session variable.
    if($userId > 0) {
        $_SESSION["userId"] = $userId;
    }
}
else {
    // User is not authenticated.
}

一个常见的陷阱是将身份验证存储在 cookie 中。Cookie 存储在客户端,因此如果您这样做,任何人都可以通过创建自己的 Cookie 来伪造身份验证。

在 PHP中使用会话变量,使用 cookie ,但它根本不识别用户,而是识别客户端和服务器之间的连接。

但要成功验证真实世界的项目,不应依赖会话 cookie。相反,会话变量、UUID cookie 和加盐哈希 cookie 的组合可以提高身份验证的完整性……但这完全是另一个话题。

于 2012-06-26T19:35:22.527 回答
0

我认为最好的方法(也许是唯一的方法)是让通过 ajax 请求的文件检查用户是否已登录(通过会话之类的东西)。我不建议将详细信息与请求一起发送,因为它们将位于源代码中通常不需要的地方。

于 2012-06-26T19:32:50.897 回答