我有一个登录表单,我正在考虑它是否应该是'ajax'ed
我考虑这个的原因是因为如果ajax调用的响应是固定的(如0表示无效,1表示有效),我可以通过javascript控制台重定向ajax请求并恶意登录系统。
有没有办法解决这个安全问题?
这就是为什么我到目前为止看到的所有登录表单(包括stackoverflow)都是非ajax?
答案 0 :(得分:2)
您需要确保只有登录用户显示的所有内容才应在登录过程后转移。服务器端应该检查用户是否登录的每个请求。这可以通过传统方法完成(例如cookie或post / get中的会话ID)。
简而言之:不要传输固定值,而是传输一个不同用户的正常会话ID。
答案 1 :(得分:1)
您使用ajax执行登录。
服务器端验证登录并启动会话。
即使客户端忽略了来自ajax调用的响应,重要的是任何ajax调用都会检查会话是否在登录时正确创建,并且拒绝执行会话在登录时是否正确打开的问题。 / p>
在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调用都会自动包含会话ID(它是一个cookie),因此PHP知道哪个会话与特定请求相关联。