【发布时间】:2010-10-24 05:23:05
【问题描述】:
昨天,我和一位同事就通过 URL 参数发送登录凭据作为身份验证手段是否安全进行了激烈辩论。他正确地指出,HTTPS 在向服务器端发送请求之前会加密 URL 中的所有非主机名/端口字符。
但是,我仍然认为这里有可能窃取这些凭据的边缘情况,并认为它们应该通过 HTTPS POST 发送。这实际上是一种发送登录/令牌数据的安全方式吗?
【问题讨论】:
标签: security authentication https
昨天,我和一位同事就通过 URL 参数发送登录凭据作为身份验证手段是否安全进行了激烈辩论。他正确地指出,HTTPS 在向服务器端发送请求之前会加密 URL 中的所有非主机名/端口字符。
但是,我仍然认为这里有可能窃取这些凭据的边缘情况,并认为它们应该通过 HTTPS POST 发送。这实际上是一种发送登录/令牌数据的安全方式吗?
【问题讨论】:
标签: security authentication https
安全是一个大词。 SSH 将阻止其他用户检索它,但您真的想在查询字符串上显示某人的密码吗?站在用户肩膀上的那个家伙呢? SQL注入呢?真是个坏主意,至少把它塞进一个表单帖子中。
【讨论】:
请求的 URL 可能会显示在 Web 服务器日志 和 浏览器历史记录/书签 中,这不是一件好事。
【讨论】:
我不知道 HTTPS 也对 URL 进行了加密,很高兴知道。
但是,从安全角度来看,可以在 URL 栏中读取凭据这一事实让我更加困扰。更不用说可能存储在浏览器历史记录中。
【讨论】:
就证书的传输而言,他是对的。但是还有很多其他的事情需要考虑,比如浏览器历史记录、服务器日志文件、观看屏幕的用户等。在这种情况下,这将是一个风险。
【讨论】:
如果您有后端数据库,请多做一步。通过表单提交用户名和密码,让您的后端返回一个令牌(一个 guid 会做),将令牌写入数据库表并分配到期时间,然后在查询字符串中使用该令牌代替凭据.现在您的系统将非常安全,并且您拥有唯一的会话标识符。
【讨论】:
还有另一个我正在尝试的解决方案。您可以使用 PHP 处理程序进行会话,使用其处理程序轻松地将会话数据作为字符串直接存储到数据库中。 您将需要数据库中的会话表和到期时间。 一旦你发送了 HTTPS 登录数据,如果它是正确的,你可以将它存储在 $_SESSION 变量中,如果你做得好接口,它将进入你的数据库。 由于这不会暴露在 PHP 之外,因此您将拥有一个强大的登录系统,并且在客户端 cookie 中仅存储会话 ID,而不是令牌、帐户或其他敏感数据。
参考:http://es.php.net/manual/en/function.session-set-save-handler.php
【讨论】: