使用Ajax进行登录是否安全?

16

我即将在我的网站中添加一个登录系统,但我认为使用ajax从外部php脚本login.php发送和接收确认并以同样的方式使用另一个logout.php退出并不安全。有什么建议吗?


最终会有什么不同呢?归根结底,它只是通过协议传递的一个HTTP请求,更应该专注于封装这些细节,并进行更多的服务器端验证! - Arpit
6个回答

21

安全

AJAX和普通的表单+刷新页面一样安全。毕竟最终都是HTTP请求。你为什么这么认为?

但是,从可用性的角度考虑,请确保那些禁用JavaScript的人仍然可以登录你的应用程序。

请务必使用POST方法发送您的AJAX请求,因为GET请求及其参数(例如,明文密码)可能会出现在您的Web服务器日志中,除非您使用HTTPS。

可用性

正如Grégoire所指出的:

此外,从可用性的角度考虑,在chrome上,自动完成不会适用于AJAX表单,在firefox上,也不会针对AJAX加载的表单进行提示密码记忆。


2
另外从可用性角度考虑,在Chrome上,自动完成不会为AJAX表单工作,而对于Firefox中的AJAX加载表单也是如此。浏览器甚至不会提出记住您的密码。 - greg0ire
@greg0ire 对,我这些天也遇到了这个问题,真的不好玩:(。编辑以添加你的评论。 - Clement Herreman
6
我认为现在这句话“确保禁用JavaScript的人仍然可以登录您的应用程序”应该加以修改。我无法想象任何一个严肃的Web应用程序能够在没有JavaScript的情况下正常工作。 - mat_boy

13

在使用Ajax处理登录和注销方面,我无法想到任何安全问题。只要在ajax和服务器端之间发送的信息不是明文密码,那么发送和接收的内容都不重要,因为会话将保存授权状态。

然而,您仍需要刷新页面或重定向以显示适用于已授权用户的内容。因此,我认为Ajax在这种情况下不会有效。


5
实际上,除了https页面外,你把密码以明文形式从客户端发送到服务器(注:即密码并未加密)。但是,如果你从服务器向客户端发送明文密码,将会受到惩罚。 - Clement Herreman
我可以通过Ajax请求加载应该被加载的内容,我可以简单地加载容器,这将更改内容(在服务器端),并发送不同的内容(适当的内容)。 - Qchmqs
@Qchmqs:那么就没有安全漏洞,因为身份验证将在服务器端完成。在发送带有内容的响应时,您将检查用户是否已通过身份验证。 - Shef
我不认为我理解你说的是什么? - Qchmqs
@Qchmqs:你说你将使用ajax请求加载内容。我说,好的,你可以这样做,而且仍然是安全的,因为在将内容发送回ajax请求之前,你将在服务器上检查用户是否已经通过身份验证。我只是在赞同你的观点。 - Shef
1
所以我想我应该继续这个想法,现在就开始编码了吗?(当然,在抽完烟之后) - Qchmqs

2
通过ajax POST登录应该是安全的,只要你有一种方式来防止XSRF攻击。可以通过在ajax请求中设置X-CSRFToken标头来实现。在服务器端,您应该有某种中间件来检查和验证来自标头的CSRF令牌。
您可以在cookie中设置csrf令牌,然后查询它并将其设置在标头中:
var csrftoken = $.cookie('csrftoken'); xhr.setRequestHeader("X-CSRFToken", csrftoken);
(我在这里使用了jquery cookie库进行说明)

不建议使用cookie来存储令牌:设置CSRF令牌的最佳方法 - RAMM-HDR

1

使用GET或POST与ajax调用具有相同的安全风险。其中一个并不比另一个更危险。


3
GET请求可能会与明文密码一起出现在Web服务器日志中 :/ - Clement Herreman
@clement:当然,无论请求是通过表单还是ajax完成,这都是真实的。 - Johan
2
所以,GET或POST具有相同的安全风险集合更加不正确。 - Clement Herreman
3
我认为问题在于你的措辞可以有多种解释。你的意思是普通的GET或POST与AJAX GET或AJAX POST具有相同的安全隐患。但你所写的内容可能被理解为无论是否使用AJAX,GET或POST都具有相同的安全风险。 - Davy8

0

好的, Ajax 提交是安全的

这完全取决于你的编码,你必须编写代码时考虑到可能发生的所有攻击

只使用 Ajax 发送数据,并在 php 中进行所有身份验证并返回成功消息


0

您可以在SSL容器(HTTPS)中使用AJAX。但发送页面也必须加密,因为存在跨域策略。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接