【问题标题】:Security matter: are parameters in url secure?安全问题:url 中的参数是否安全?
【发布时间】:2011-11-25 00:33:50
【问题描述】:

在过去的几个月里,我在 Java(servlet 和 jsp)中开发了自己的 Web 开发。我正在开发一个 Web 服务器,它主要为应用程序服务。实际上它是在谷歌应用引擎上运行的。我担心的是,虽然我使用的是 SSL 连接,但在 URL 中发送参数(例如https://www.xyz.com/server?password=1234&username=uname)可能并不安全。我应该使用其他方式还是真的安全?我不知道这个 url 是否作为整体(带有参数)作为纯文本传递?

任何帮助将不胜感激!

【问题讨论】:

  • 非常感谢。你把一切都说清楚了。我想 Google-App-Engine 将 URL 存储在日志中,但我需要检查我不确定。

标签: java google-app-engine ssl security


【解决方案1】:

嗯,除了与 URL 的日志记录和可见性有关的问题(即安全通信之前和之后发生的情况)之外,GET 和 POST 都同样安全;在加密通道建立之前交换的信息非常少,甚至连 HTTP 协议的第一行都没有。 但这并不意味着您应该为此使用 GET。

问题是登录会改变服务器的状态,如果用户没有得到正确的通知(以防止 Javascript 出现意外),则不应重复登录。正在更改的状态是服务器上的用户会话信息,因为登录所做的是将经过验证的身份与该会话相关联。因为是状态的(显着)变化,所以操作不应该通过 GET 来完成;虽然从技术上讲你可以通过 PUT 做到这一点,但 POST 更好,因为与之相关的非幂等性假设(这反过来又鼓励浏览器弹出警告对话框)。

【讨论】:

  • 明确地说,我的意思是,虽然有一些较小的安全原因更喜欢 POST(操作的选择不是最重要的,如果 URL 以明文形式传达,那将是最重要的)有也是使用 POST 的更深层原因。 即使没有加密也是正确的做法。
【解决方案2】:

包括请求行在内的完整 HTTP 请求在 SSL 内加密。

上述 URL 的示例 http 请求将全部包含在 SSL 隧道中:

GET /server?password=1234&username=uname HTTP/1.1
Host: www.xyz.com
...

您的应用程序可能会记录所请求的 URL,因为其中包含用户密码,这可能不正确。

【讨论】:

    【解决方案3】:

    所有内容都经过加密,包括 URL 及其参数。不过,您仍然可以避免使用它们,因为它们可能存储在服务器端日志和浏览器历史记录中。

    【讨论】:

    • 只要目标站点也使用HTTPS,并且在Referer中发送给其他人(至少根据RFC;不确定实际实现)
    • 早在 2003 年,我不得不修复一个招聘公司的 Web 应用程序,因为客户在他们的投资组合网站 Apache 日志中找到了他们的用户名和密码。用户从他在系统中的记录链接到他的投资组合网站。所以是的,如果发送 REFERRER 值,所有查询参数在记录该信息的其他 Web 服务器中都是可见的。两个站点都使用 HTTPS。不要在 URL 中添加秘密 :)
    【解决方案4】:

    您的问题似乎比 Web Server 和 Google App Engine 更进一步。

    通过网络表单向您的服务器发送密码是一个非常常见的安全问题。请参阅此 SO 线程:

    【讨论】:

      猜你喜欢
      • 2011-09-23
      • 1970-01-01
      • 2015-03-14
      • 2014-12-20
      • 2016-11-27
      • 1970-01-01
      • 1970-01-01
      • 2016-12-23
      • 1970-01-01
      相关资源
      最近更新 更多