【发布时间】:2009-04-17 18:23:52
【问题描述】:
我知道使用 SSL 是一种方法。我访问了 Facebook 和 LinkedIn 等网站,发现他们只在处理密码和个人设置等敏感数据时才使用 https。这是怎么做到的?他们如何能够在某些网站上实现 https,同时在其他网站上使用 http,同时仍然保持安全?
【问题讨论】:
我知道使用 SSL 是一种方法。我访问了 Facebook 和 LinkedIn 等网站,发现他们只在处理密码和个人设置等敏感数据时才使用 https。这是怎么做到的?他们如何能够在某些网站上实现 https,同时在其他网站上使用 http,同时仍然保持安全?
【问题讨论】:
这种方法并不安全。使用 HTTPS 时它是安全的,但是一旦您切换到 HTTP,所有数据都将通过未加密的线路传输。会话 ID cookie(或维护状态和用户身份)也是如此。因此,在未加密线路上窃取该信息并尝试冒充您仍然存在差距。
但这种双车道方法很常见。因为HTTPS有一些缺点。一个是昂贵的(加密传出和解密传入数据),另一个是它至少禁用公共缓存。
【讨论】:
他们的 HTTP 站点并不安全——通常,在处理社交网络登录等事务时,HTTPS 的开销被认为是不必要的。例如,StackOverflow 是不安全的——拥有网络嗅探器的人可以拦截登录 cookie 并冒充用户。
如果您只需要检查登录是否有效,并且不太关心可用性,则可以使用digest authentication。它提供了一种通过 HTTP 传输用户名和密码的安全方式。当然,从网站发回或用户提交的任何数据都容易被嗅探。
短版:如果您需要安全性,请使用 HTTPS。您甚至可以从CAcert 等网站获得免费证书。
【讨论】:
如果您不使用 https,这取决于您要保护的内容以及您希望为用户带来多少麻烦。
您可以选择性地加密 javascript 中的数据,以便仅保护敏感信息,但这样做是有风险的,因为在 javascript 中所做的任何事情都可能被逆向工程。
您可以在此处查看我的答案,了解一种在 javascript 中执行此操作的方法: How Do I encrypt post data while using ajax and JQuery?
如果您只是不希望数据在传输时被修改,您可以创建一个散列,或者如果您将数据保存为散列,则将其转换为散列。密码通常保存为哈希,所以这对他们来说是有意义的。
您可以在 javascript 中完成所有这些操作,但它会减慢传输数据的速度。
如果您使用的 web 服务也通过 http,那么这些选项也可以使用,但它们可以更快,因为程序不会在 javascript 中。
【讨论】:
安全性不仅仅是 HTTP/HTTPS。这些只是为了防止数据在网络上被读取。
在 HTTP 站点上执行 HTTPS 请求的最简单方法是通过一个表单,该表单的操作是 https://yoursite/login 或类似的东西。这将导致您转到该页面,并且这些页面通常会返回到您的来源或将您转发到主页。这就是 Facebook 的做法。该站点的其余部分被认为是相对安全的,因为访问控制是为了确保那些有权查看某些内容的人是唯一可以这样做的人。这不能防止 Wireshark 或其他嗅探流量的工具。通过 ajax 发帖是个坏主意,因为使用跨站点脚本很容易弄乱 ajax 调用。
【讨论】: