【问题标题】:Options for passing data across HTTP redirects通过 HTTP 重定向传递数据的选项
【发布时间】:2012-05-14 09:48:52
【问题描述】:

我正在开发一个 Web 应用程序,需要通过 HTTP 重定向传递数据。例如:

http://foo.com/form.html 

发帖到

http://foo.com/form/submit.html

如果数据有问题,响应会被重定向回

http://foo.com/form.html?error=Some+error+message

查询参数“error”的值会显示在页面上。

是否有任何其他可靠的方式来跨重定向传递数据(即 HTTP 标头等)。

将数据作为查询参数传递是可行的,但并不理想,因为:

  • 它的明文(在查询字符串中,因此 SSL 不能依赖于 encyrpt)所以我不想传递敏感数据
  • URI 的长度受浏览器的限制(尽管长度通常相当长)。

重要提示:此平台是无状态的,并且分布在许多应用服务器上,因此我无法跟踪服务器端会话对象中的数据。

【问题讨论】:

  • "[...] 并在查询字符串中,因此 SSL 不能依赖于 encyrpt"。不确定您在这里想说什么(无论如何您都在使用纯 HTTP),但 HTTPS encrypts all the HTTP traffic.
  • 再次强调@Bruno 的评论:您怎么会说请求行不受 SSL 保护。某些 cmets 稍后您会重复:“Cookie 已加密,请求行未加密”......这不是真的。 SSL 隧道 IP 有效负载,所有 HTTP 协议都是其中的一部分(请求行、标头、有效负载......)。请求行在 application(浏览器、日志)层上非常简单。但是,即使稍微复杂一点,您也会在这里遇到同样的安全漏洞。

标签: java http response.redirect post-redirect-get http-redirect


【解决方案1】:

您可以将错误消息存储在服务器上的数据库中并通过 id 引用它:

http://foo.com/form.html?error_id=42

如果错误文本得到修复,您甚至不需要使用数据库。

另外,您可以使用Web Storage。您可以使用此 JavaScript 显示输出页面,而不是使用“位置”标题进行重定向:

var error_message = "Something is wrong";
if( typeof(Storage) !== "undefined" ) {
  localStorage.error_message = error_message;
else {
  // fallback for IE < 8
  alert(error_message);
}
location.href = "new url";

重定向后,您可以使用 JavaScript 读取 localStorage.error_message 并显示消息。

【讨论】:

  • Hrm - 是的 - 这需要具有一些清除/刷新例程的持久性机制。因为这个,我不确定我是否喜欢这个解决方案。
【解决方案2】:

从客户端-服务器交互的角度来看,这是服务器内部调度问题。

浏览器并不意味着根据the HTTP specification自动重新发布初始请求的实体:“用户代理可以执行所需的操作而无需与用户交互当且仅当方法第二个请求中使用的是 GET 或 HEAD。"

如果不是这样,请将form.html 设为动态,使其成为 HTML 静态文件。向自身发送POST 请求并预填充值以防出错。或者,如果有问题,您可以让submit.html 使用与form.html 相同的模板。

它的明文(并且在查询字符串中,因此不能依赖 SSL encyrpt) 所以我不想传递敏感数据

我不确定这里的问题是什么。无论如何,您都是通过纯 HTTP 提交所有内容。 Cookie、查询参数和请求实体都将可见。使用HTTPS would actually protect all this,尽管查询参数仍然可能是浏览器历史记录和服务器日志的问题(这不是连接的一部分,这是 TLS 保护的)。

【讨论】:

  • 哎呀——我的意思是说 POST 可以选择是 SSL——因此正文(POST 的内容)将被加密。查询参数,即使是 SSL/HTTPS 请求,也不会被 SSL 加密——需要自定义加密解决方案。
  • 不确定我是否清楚您提出的解决方案。我正在使用 POST-Redirect-GET 设计模式,并希望将信息从 POST 处理程序发送到生成的 GET 响应。这种设计模式完全符合您引用的指南。
  • @empire29 查询参数 ARE 在您使用 HTTPS 时加密。检查文本中链接的我之前的答案。当然,您不必相信:阅读 HTTPS 规范并尝试使用 Wireshark。
  • @empire29,对于实际模式,我建议您不要使用“POST-Redirect-GET”模式,而是在表单本身中提供错误消息作为 POST 响应的一部分.这将是 RESTful 和无状态的(因为它似乎是你所说的你需要的)。
  • 用户刷新触发POST提交。另外,我认为负责显示表单的资源是 /form.html 而不是 form/submit.html .. 拥有 form/submit.html 也代表表单(尽管有错误)不适合我。
【解决方案3】:

我认为根据数据量使用 cookie 是一个合理的解决方案。因为您无法在服务器端跟踪它(例如使用会话,这会更简单)

【讨论】:

  • Cookie 也是不安全的。它们以纯文本形式传递。
  • 同意,没注意。但我认为没有任何方法可以安全地将数据传递到客户端,除非您使用加密。也许将信息存储在用户会话(或上面提到的数据库)中会是一个更好的解决方案。
  • cookie值可以加密,所以只传递一个纯base64文本
  • @ArneBurmeister base64 本身是编码而不是加密。当然也可以是加密内容的base64编码。
  • Cookie 可以通过 HTTPS 保护,因为它们是通过 HTTP 请求标头传递的。我在发布后想到了这一点,并且正在研究一种基于 Cookie 的机制——尽管大多数 cookie 也有 4KB 的站点限制——在现实世界中,即使是非常大的表单也应该足够了..
猜你喜欢
  • 2015-05-19
  • 2014-11-28
  • 2016-12-22
  • 1970-01-01
  • 1970-01-01
  • 2012-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多