2009-07-17 126 views
12

也许标题是措辞严厉,但想不出更好的表达方式。使用AJAX发送纯文本密码有多安全?

我目前在登录系统上工作(没有正式的,只是试验),并计划使用PHPLiveX(一个AJAX库)的一些功能。基本上你创建了一些PHP函数,然后通过JavaScript调用。您可以将参数(getElementById)添加到传递到PHP函数的JavaScript中。

我真正想知道的是,只要先调用JavaScript函数而不先加密密码,然后让PHP函数加密它(本例中是SHA256),是否安全。可以通过AJAX传输的数据被拦截吗?如果是这样的可能性有多大?

+0

除了使用SSL之外,什么是保证这一点的最佳方式?如果可以在JavaScript中加密密码,这是一个可重用的解决方案吗? – j82374823749 2009-07-17 19:15:29

+1

如果在JavaScript中对密码进行哈希处理,那么任何嗅探流量的人都会看到它(它只会被哈希)。攻击者可以使用哈希密码来重播此请求 – 2009-07-17 19:27:13

+0

而SSL将解决此问题? – j82374823749 2009-07-17 19:31:03

回答

45

没有更多或小于由浏览器发出的正常HTTP POST请求的安全(如在从<form>

“修复”为这是相同的“固定”用于非AJAX请求 - 使用SSL。

1

AJAX调用只是简单的HTTP请求。

它的行为像普通的HTTP请求,并且还带有它的所有优点和缺点。它并不安全。

为了让您的AJAX调用安全,有几种方法可以尝试:

  1. 使用SSL。 SSL将加密用户和服务器之间的消息。 SSL的缺点是您必须为有效的SSL证书支付额外费用。无效的SSL证书可用时,不会为用户提供相同级别的安全保证。
  2. 在客户端发送之前加密请求。例如:在通过网络发送之前散列用户密码。大多数情况下,您不需要用户的纯文本密码。当用户不允许运行客户端脚本时,这是不可用的。
  3. 除了POST比GET更安全的常见误导性信息之外,事实并非如此。两者同样对攻击者开放。
7

无论您是通过AJAX还是通过正常形式发送密码,它仍然通过HTTP POST(希望)请求发送。所以你没有增加或删除任何安全明智的。

防止某人拦截您的密码的唯一方法是使用SSL(通过AJAX或不通过)。

1

这只是为具有不SSL保护的登录表单安全通过电话发送,就像几乎所有的论坛一样!

0

这是不安全的。不要发送未加密的密码。很有可能他们会在某个时候被拦截,你会遇到重大问题。

这里是一个捕获telnet密码的示例video。 Telnet以纯文本形式发送,这很好地说明了如果你甚至想到这样做的主要问题。任何两位脚本kiddie都可以比你更快地截取纯文本密码。“哦,我的上帝,我的数据库去了哪里?”

1

确保您的AJAX调用的目标是受信任的HTTPS://页面,并且您已将其与其他应用程序正在执行的相同信息的其他任何发送一样安全。大多数库/框架不会仅限于HTTP://用于您的AJAX调用。

0

你发送的是明文,所以任何有嗅探/收听/等客户端网络的人都可以很容易地看到密码。 AJAX调用只是一个普通的旧HTTP消息。如果你想看到这个动作,请激活一个wireshark的副本,并将请求发送给你自己。您将能够在HTTP数据包中看到密码。

1

是的,它可以被读取。就像没有某种安全层的所有其他东西一样(请参阅SSL)

要像自己的AJAX命令一样运行一个像WireShark这样的工具。

可能性有多大?不是,但用户的密码可能会以纯文本形式保存在某人的日志文件中。如果有人最终找到了它,那么这可能是个坏消息。回到大学,我的网络课程可以使用一些(半)花式路由器。我们有我们在随机网站上注册帐户的任务。正如我们所做的那样,我们注意到了路由器中的日志文件中的一些非常可怕的事情。这让我大开眼界,想想如何跟踪每个通信,并且很可能记录在某个地方。

20

正如其他人所提到的,从表单发送HTTP帖子并没有什么更危险的。事实上,这是一回事。

但是,如果HTTPS不是一个选项,您可以始终在未加密的连接上使用质询/响应方案。基本上它的工作原理是这样的:

  • 服务器有一个用户密码的SHA(或其他散列算法)。
  • 客户端有密码。 (使用未加密的AJAX)服务器发送挑战
  • 客户端请求(字节的随机字符串;字符都很好。)
  • 服务器创建一个挑战,也是一个挑战ID,并有过期保存它。
  • 客户端收到挑战和挑战ID。
  • 客户端使用SHA对密码进行散列。
  • 客户端通过以某种方式附加挑战来散列生成的散列。
  • 客户端发送挑战ID(不是挑战本身)和第二个结果散列。
  • 如果服务器存在且未过期,服务器将使用ID查找质询。
  • 服务器将挑战附加到存储的密码散列,并使用与客户端相同的方案创建散列。
  • 服务器将其散列与客户端进行比较。如果相同,则用户通过身份验证。

一旦你明白了,设置起来其实很简单。 Wikipedia有一些额外的信息。

编辑:我发现我忘了提,认证是否是成功的,你必须删除的挑战,不管。让客户多次尝试一个挑战可能会导致安全问题。

0

如前所述,SSL是这里最好的解决方案。但是,您可以在客户端散列密码。如果你是谷歌,你会发现大量的md5的JavaScript实现。

0

该死的你们让我担心。 SSL不能防止arp中毒MITM攻击。像你们一样崇拜SSL将是致命的。你必须有一种方法来加密客户端的密码,甚至一次跳跃,否则即使是新手黑客也能够以明文方式截获密码。