2010-03-22 57 views
0

我有一个登录表单,我正在考虑它是否应该'ajax'ed。
我正在考虑这个的原因是因为如果ajax调用的响应是固定的(比如0代表无效,1代表有效),我可以通过javascript控制台重定向ajax请求并恶意登录到系统。
有没有办法解决这个安全问题?
这就是为什么到目前为止我见过的所有登录表单(包括此处在stackoverflow上)都是非ajax?Ajax身份验证响应

回答

1

您使用ajax执行登录。

服务器端验证登录并启动会话。

即使客户端忽略来自ajax调用的响应,任何ajax调用都会检查会话是否在登录时正确创建,并拒绝执行会话在登录时未正确打开时所做的询问。

在PHP(例如):

登录:

<?php 
header('Content-type: text/json'); 

session_start(); 

if (check_password()) { 
    // send ok response 
} 
else { 
    // send not ok response 
} 

// if that session variable exists, then we logged in successfully 
$_SESSION['user'] = $user; 

其他Ajax调用:

<?php 
header('Content-type: text/json'); 
session_start(); 

if (! isset($_SESSION['user'])) { 
    // send not ok response 
    // on the client, this will redirect to the login page 
    exit; 
} 

$user=$_SESSION['user']; 

... rest of the code here 

对于每一个Ajax调用,当响应到达时,你应该首先检查回应是确定的 - 由你决定你想如何表示。

举个例子,一个响应看起来可能会像JSON

  • 没有登录:{ "ok":"N","error":"not logged in"}
  • 记录:{ "ok":"Y","data":[{"name":"xxxx","age":19},{"name":"yyy","age":91}]}
  • { "ok":"Y","data":"Some text"}

等等,等等...

如果没关系,则继续处理响应。如果没有,您可以重定向到登录页面。

请注意,使用PHP,您创建的每个ajax调用都会自动包含会话标识(它是一个cookie),因此PHP知道哪个会话与特定请求相关联。

+0

但想象一下,我是黑客,我可以重新创建这个响应。 –

+0

当然可以,但是由于真正的信息和操作来自服务器端,所以不能1)修改数据库2)获取真实信息。 –

+0

黑客可以让浏览器相信你已经登录,但同时黑客没有登录到服务器上。因此,每一个后续请求都将被拒绝,那么在形成响应方面有什么意义呢?他仍然不会从服务器获取任何有意义的信息,或者修改任何内容。 –

2

你需要确保应只显示已登录的用户的所有内容应该只登录过程之后被转移。服务器端应检查每个请求是否用户登录。这可以通过传统方法来完成(例如cookie中的会话ID或POST/GET)。

所以简而言之:不要传输固定值,而是传递一个正常的会话ID,这个会话ID因用户而异。

+0

但我该如何回答有效/无效? 你的意思是我应该通过会话ID或0? 但客户端不知道会留下原始问题的会话ID。 –

+0

由于您不应该为未登录的用户传输任何*内容,而这些内容是用于登录的,所以客户端不可能使用它们。 – neo

+0

我明白了,但是如何让rpc调用的响应看起来像黑客无法使用它呢? –