8

我需要将服务器上的用户名和密码传递给我的网络聊天客户端 javascript 函数。当我通过 javascript 函数中的 php 代码发送用户名密码时,源代码中的用户可以读取它,这是有害的。

请分享您的解决方案。

我从客户端上的服务器 A 获取用户名密码,然后将这些凭据提交给一个 javascript 函数,该函数然后连接到另一个服务器 B。它就像 facebook 和 gmail 聊天工作,但他们将用户凭据传递给他们的 javascript网络上的任何地方都没有提到客户端连接到聊天服务器,希望这能更好地解释。

4

17 回答 17

18

我向你保证,这不是 facebook 和 gtalk 的做法。通常,他们处理支持第三方 API 开发 (OAuth) 的协议,该协议允许用户授予或拒绝应用程序使用他们的帐户。客户端应用程序在任何时候都不知道用户的凭据。这就是 OAuth 受欢迎的原因。

您在这里有几个选择,但我认为基于声明的身份验证是最好的方法。基本上,服务器 A 用于对客户端进行身份验证并装饰其在系统中的角色。这是通过 HTTPS 作为加密 cookie 提供的,以防止火羊类型的攻击。一旦在客户端上,服务器 B 可以查询此 cookie 以获取用户被授权在服务器 B 上执行的角色,如果加密,则服务器 B 必须知道如何解密 cookie。根据您的技术堆栈,有几个库可以支持这一点。再次重要的是要注意,无论何时传输 cookie(或任何安全令牌),都必须通过 HTTPS 进行,否则有效载荷可能会通过不安全的无线网络被拦截。

编辑:根据我对这个问题的评论,如果您使用的是 XMPP,那么您可能会发现只需使用 XMPP 库通过 HTTPS 进行身份验证就足够了。

于 2011-03-14T07:30:09.300 回答
13

不要在 Javascript 中进行验证 - 在您的 PHP 代码中进行。

于 2011-03-02T11:05:05.863 回答
8

很难从问题中看出您的目标是什么,但看起来您想限制客户端能够执行远程操作的方式。

您可以尝试让客户端向服务器询问授权密钥并让服务器在某些条件下接受密钥,而不是发送用户名和密码。

然后,您可以通过以下方式限制密钥的使用:

  • 检查客户端 IP 地址和用户代理
  • 允许密钥只使用一次(例如将其使用存储在数据库中)
  • 允许密钥在生成时的期限内使用

您应该始终假设任何客户端操作都可以被欺骗。

如果我正确理解了这个问题,这些 SO 问题可能会尝试做类似的事情。

于 2011-03-02T11:30:58.967 回答
4

只要您必须在浏览器上获取密码,用户就可以阅读它。保护用户密码的唯一方法是永远不要将其发送到浏览器。

您也不应该使用密码的简单散列,因为这样用户可以只使用散列而不是密码来登录您的聊天服务器,而您还没有解决任何问题。

实际上,您也不应该在服务器上存储明文密码,而应该存储哈希(最好是 SHA-1,因为 MD5 已成功破解)。

你可以改为

  1. [聊天服务器] 生成随机数,保存并发送给客户端
  2. [client] 将 nonce 发送到第一台服务器
  3. [登录服务器] 将密码哈希值加上随机数的 (SHA-1) 哈希值发送回客户端
  4. [client] 将 nonce 和 hash 发送回聊天服务器
  5. [聊天服务器] 根据您保存的列表检查随机数并将其删除以防止重放攻击,然后再次计算哈希并检查它是否与您从客户端获得的匹配
于 2011-03-13T12:30:23.037 回答
3

您不需要密码来验证。你只需要它的加密哈希。实际上,您甚至不应该在服务器端存储纯文本密码。

发送给客户:

sha1(sprintf("%s%s",salt,hash_from_db))

在客户端验证:

sha1(sprintf("%s%s",salt, hash_func_as_on_srv(password))) == sha1_recieved_from_server

您可以生成您的盐形式唯一会话 id、远程 IP 或类似的东西。

于 2011-03-17T10:35:46.593 回答
1

使用 MD5 之类的东西来存储密码,然后使用相同的“加密”传递 passwd。

这样,只有用户知道自己的密码,它不会在任何地方以未加密的方式存储。

于 2011-03-02T11:14:07.080 回答
1

如果您将(密码和用户名)发送到从服务器 A 检索的服务器 B,那么如果您想让它安全,那么您必须为此提供某种安全机制(接口)。

我想让你看看双向加密:我需要先存储可以检索的密码问题。在这里,您可以存储key用于加密某些valueieusernamepassword.

例如:- 在服务器 A 中,我的用户名是user,密码是pass,我的密钥是asdfasdhfkshf盐。在上述解决方案中,您可以有两种加密解密方式。

每当我检索(使用javascript)我usernamepassword我都会得到加密版本。可以说,' sfdasdfaskuyfgdkgh2145'和' 24sdf25asdf2asf42sad1fh'使用密钥加密asdfasdhfkshf。当然,除非他们有密钥,否则没有人能够猜到,并且密钥存储在服务器 A 中。

现在我们将这个加密的用户名和密码发送到服务器 B,它也存储了相同的密钥和代码用于解密,当然,服务器 B 将能够将其解密回userpass

因此,即使能够查看用户名和密码,用户也无法猜测它是什么。

但这仅适用于您在服务器 B 中实现了此接口或机制的情况。

于 2011-03-18T06:29:46.903 回答
0

JavaScript 中发生的任何事情都发生在浏览器上。这就是 JavaScript 被称为客户端语言的原因。永远不要使用普通用户不应该知道的 JavaScript 进行验证或评估。

相反,PHP(服务器端)可以用于这些评估,因为所有这些评估都发生在 Web 服务器上,普通用户不会知道幕后发生了什么。

提示:使用 AJAX 和 PHP 可以提供应用程序所需的安全性和响应性。

于 2011-03-02T11:17:18.223 回答
0

或者,您可以在访问其他服务器之前执行 ajax 调用,在其中请求用户/通行证。这样它就不会出现在您的 JavaScript 代码中。

于 2011-03-11T12:26:41.653 回答
0

facebook 和其他社交网站实施 OAuth(开放授权)技术,以安全的方式实现跨站点凭证共享。您可以参考this了解更多详情。

于 2011-03-11T12:34:16.087 回答
0

为什么实际上您希望它存储在客户端?如果您需要在客户端提供某种标识符,那么实际上将其保存在服务器端,只需在客户端提供一个人类不可读的标识符,并且更改它应该导致数据客户端在评估时想要访问仅当用户具有访问权限时才在服务器上。

于 2011-03-14T06:58:10.243 回答
0

我认为最好的事情是通过 PHP 发送。

但是你想特别使用 JS,所以这里有一些我可以提供的东西;

编码密码,md5();如果您认为它不安全,请尝试多层加密,例如 md5(sha1(sha1())) 等。为了您的安全和用户的安全,将密码加密保存到数据库中。因此,您可以使用不同名称或别名(如“fun”)加密发送密码,以隐藏人们知道它是密码。

此外,您可以使用 PHP 向人们授权密码,而不是发送密码,然后只使用 JS 传递一个基于会话的随机“授权密钥”,该密钥将在下次到期。

你也可以使用 Ajax。对于我上面所说的那些,PHP 和 JS。

于 2011-03-16T14:33:09.240 回答
0

(...) 我从服务器A获取用户名密码(...)

系统中有密码服务器听起来很糟糕。相反,您可以使用A作为B的代理:客户端应连接到A,该 A 将流量转发到 B 和来自B。当用户成功通过A进行身份验证后,它可以使用存储的密码登录到B。

此外,考虑整个设置也许是个好主意。

于 2011-03-16T16:47:52.713 回答
0

由于您不关心网络上的安全性,因此假设您不关心阻止用户使用 fiddler/firebug 或 Wireshark 等其他工具获取数据是安全的吗?

如果是这样,那么已经建议您使用 AJAX,这样数据就不需要成为可通过使用“查看源”选项或在 IE 中按 F12 来查看的源的一部分。

如果你想防止用户名和密码在传递时被理解,你必须实现某种形式的加密。现在,根据您想让潜在攻击者破解数据的难度,您有几个选择。

您可以传递数据的 MD5 散列(假设两台服务器都可以访问原始数据)服务器 B 可以从原始数据生成 MD5 散列,并将其与客户端传递的散列进行比较。正如已经指出的那样,这很容易受到重放攻击,就像大多数 Web 应用程序不使用客户端证书或 NTLM 之类的东西对用户进行身份验证一样。

您可以选择不通过客户端传递用户名和密码,而是使用指向数据库中用户名的一次性 ID (GUID),并让服务器 B 在使用该 ID 后将其删除。通过这种方式,数据被保密,您可以避免重放攻击。<- 不是密码学,而是一个很好的解决方案。

您还可以研究许多其他加密技术,但我认为您希望保持简单。

于 2011-03-17T13:07:04.737 回答
0

javascript:function(){getAlementByTagName('password').value} 在 url 中过去

于 2011-04-21T11:29:39.000 回答
0

PART I.
如果从服务器 A 获取用户名和密码进行身份验证并登录到服务器 B 的用户正在使用服务器 A 的界面,那么您不必担心,因为当他手动登录时,他会做同样的事情。他在密码框中输入密码并点击提交。

您主要关心的应该是密码不应通过网络以纯文本形式发送,以免被嗅探。使用 SSL 进行通信。

第二部分。
让我用一个例子来改写你的问题,你想制作类似 meebo.com(你的服务器 A)的东西,一旦有人登录,他就可以使用 facebook 聊天或 Gmail 聊天或其他什么。要将用户登录到他们各自的聊天中,您需要存储他们的密码并使用 javascript 将其发送到这些聊天服务器(您的服务器 B)以进行身份​​验证。

如果这是您想要的,那么您的方法是错误的,您的服务器 A 应该与服务器 B 通信并获取/推送所有数据。就像,服务器 A 应该有自己的聊天界面,如果用户向您的聊天服务器发送“Hi”,它应该在内部将该消息重定向(推送)到服务器 B。同样,来自服务器 B 的回复可以直接在服务器 A 的界面中显示给用户. 这种方法的好处是您不必来回传输用户名和密码,使其不安全。

第三部分。
我还要补充一件事,如果您将服务器 B 的用户名和密码存储在服务器 A 的数据库中,那么您必须在条款和条件中让用户知道它。

于 2011-04-25T05:59:53.367 回答
0

您可以在服务器端创建会话(使用 http-api)并将其传输(会话 ID 等)到客户端会话

请参考http://metajack.im/2008/10/03/getting-attached-to-strophe/

于 2012-07-17T10:36:47.040 回答