在https中传递查询字符串的安全性

译者:java达人-卍极客

英文链接:

http://blog.httpwatch.com/2009/02/20/how-secure-are-query-strings-over-https/(点击文末阅读原文前往)

我们常常听到这样一个问题:“参数是否可以在URLs中安全地传递到安全站点?“ 这个问题常常出现于客户看了HttpWatch的HTTPS请求后,想知道还有谁可以看到这些数据。

例如,假设在查询字符串参数中使用以下安全网址传递密码:

https://www.httpwatch.com/?password=mypassword

HttpWatch能够显示安全请求的内容,因为它与浏览器集成,并且在用于HTTPS请求的SSL连接对数据进行加密之前查看数据

在https中传递查询字符串的安全性

如果你看网络嗅探器,如Network Monitor,同一请求,你前后只会看到加密的数据。 在数据包跟踪中网址,标题或内容多是不可见的。

在https中传递查询字符串的安全性

您可以依赖一个安全的HTTPS请求,只要:

1、未忽略任何SSL证书警告

2、Web服务器用于启动SSL连接的私钥在Web服务器本身之外不可用。

因此,在网络层面,URL参数是安全的,但是其他一些途径会泄漏基于URL的数据:

1、URL存储在Web服务器日志中 - 特别是每个请求的整个URL都存储在服务器日志中。 这意味着URL中的任何敏感数据(例如密码)以明文形式保存在服务器上。 以下是使用查询字符串通过HTTPS发送密码时存储在httpwatch.com服务器日志中的条目:

2009-02-20 10:18:27 W3SVC4326 WWW 208.101.31.210 GET /Default.htm password=mypassword 443 ...

存储明文密码通常不是一个好主意,即使是在服务器上。

2、网址存储在浏览器历史记录中 - 即使安全网页本身未缓存,浏览器也会将网址参数保存在其历史记录中。 以下是显示URL参数的IE历史记录

 

在https中传递查询字符串的安全性

如果用户创建书签,也会存储查询字符串参数。

3、URLs在Referrer头中传递 - 如果安全网页使用诸如javascript,图片或分析服务等资源,则该URL会在每个嵌入请求的 Referrer请求头中传递。 有时,查询字符串参数可以被传递到第三方站点并由其存储。 在HttpWatch中,您可以看到我们的密码查询字符串参数正在发送到Google Analytics:

在https中传递查询字符串的安全性

结论

解决这个问题需要两个步骤:

1、只在绝对必要的情况下传递敏感数据。 

2、如果用户被认证,最好使用具有有限生命周期的会话ID来标识它们。使用非持久会话级别的Cookie来保存会话ID和其他私人数据。

使用会话级Cookie来传递此信息的优点是:

它们不存储在浏览器历史记录中或磁盘上

它们通常不存储在服务器日志中

它们不会传递到嵌入式资源,例如图片或JavaScript库

它们仅适用于发出它们的域和路径

下面是在我们的在线商店中用于识别用户的ASP.NET会话cookie的示例:

在https中传递查询字符串的安全性

请注意,该cookie仅限于域store.httpwatch.com,并且在浏览器会话结束时过期(即不会存储到磁盘)。

你当然可以在HTTPS中使用查询字符串参数,但在有可能暴露安全问题时不要使用它们。 例如,您可以安全地使用它们来标识部件号或显示的类型,但不要将它们用于密码,信用卡号码或其他不应公开的信息。 

java达人

ID:java_daren

在https中传递查询字符串的安全性