【问题标题】:Make external HTTP traffic show as HTTPS使外部 HTTP 流量显示为 HTTPS
【发布时间】:2015-01-03 14:03:41
【问题描述】:

我有一个网站“https://mysite.com”,它通过 iframe 在客户的个人网站“http://example.com”上加载弹出表单到后台。

我正在寻找一种通过 https 加载外部客户网站的方法。

例如:“https://mysite.com/example.com”将通过 https 在我的网站上加载 example.com,因此不会出现任何“混合内容”警告。

我正在运行 IIS 和 asp.net 应用程序。

谢谢!

【问题讨论】:

  • 您正试图破坏出于某种目的而存在的安全规则。也许尝试打开一个新的浏览器选项卡而不是使用iframe。如果您准备处理更复杂的事情,我想您可以编写一个服务器端处理程序来读取目标页面并通过您的 SSL 连接提供服务。
  • 嗨@dave,我希望这很容易。我的客户希望它看起来像弹出窗口在他们的网站上。我一直在考虑多种想法来处理这个问题,从下载客户的网站,到通过 ASP.NET 创建屏幕截图并显示存储在我网站上的图像。

标签: asp.net asp.net-mvc iis https


【解决方案1】:

您可以编写一些服务器端代码来读取目标页面,然后将该 HTML 注入您的页面。 C#代码:

public string GetWebpageHtml(string url)
{
  System.Net.WebClient wc = new System.Net.WebClient();
  return wc.DownloadString(url);
}

public ActionResult ServeImage(string imageUrl, string mimeType = "image/jpg")
{
  System.Net.WebClient wc = new System.Net.WebClient();
  var bytes = wc.DownloadData(imageUrl);
  return File(bytes, mimeType);
}

在您的示例中,您可以在 http:// example.com 上调用该函数并将该 HTML 放入您的页面中。

我还创建了一个处理程序操作,它应该下载远程文件并将其作为本地操作返回。请记住,您还必须在下载之前将相对路径转换为完整路径。

【讨论】:

  • DownloadData() 函数是否还会包含图像的数据,或者我最终会得到在服务器上找不到的图像?谢谢!
  • 您必须自己处理图像。我为您编写了一个动作,它应该获取远程 URL 并在您的站点上提供它们。您将负责在 HTML 中替换远程 URL。
  • 谢谢@dave,我想如果我使用这种方法,我只需将基本图像下载到临时位置,然后将 URL 替换为下载的 https 图像?
  • 这就是我试图用我的ServeImage 操作解决的问题——它应该读取一个远程 URL 并将其返回,就好像它来自您的域一样。例如<img src="https://mysite.com/ServeImage?imageUrl=http%3A%2F%2F%20example.com%2FImage1.jpg" />. 事先下载图片也可以,但这样您就不必存储它们并担心清理。
  • 谢谢@dave,这就是我最终要做的!
【解决方案2】:

与其通过更改网站的背景使您看起来好像在客户的网站上,不如在客户的网站上实际加载 iframe 弹出窗口不是更容易吗?写一段js应该比较简单吧:

<script type="text/javascript">
    var node = document.createElement('iframe');
    node.src = 'http://www.google.com';
    node.style = 'position: fixed; width: 80%; height: 80%; margin: auto;'
    document.body.appendChild(node)
</script>

并让您的客户将其粘贴到适当的位置。当然,在某些情况下这肯定行不通,但是您的问题中没有任何内容指定这一点。

如果您的客户想要使用您的表单,他们可能必须链接到该表单或对其网站或广告进行一些更改。为什么不让他们添加这个脚本呢?如果您的客户站点或您的站点仅在 LAN 上可用,那么它们为什么要从一开始就相互链接呢?因此,我能想到的大多数不以正常的网络方式进行 3rd 方弹出窗口的原因似乎在这里并不适用,至少从问题中的信息来看。

【讨论】:

  • 我其实是从这个开始的,但是当他们开始使用它时,他们抱怨网站不安全(意味着他们在 url 中看不到 HTTPS)所以我不得不改变它。感谢您的帮助!
  • 所以客户自己没有 ssl,他们希望您为他们提供一个弹出窗口?太糟糕了,我很抱歉。顺便说一句,他们确实意识到您提出的解决方案,除了您的自定义 ssl 代理之外,他们不会运行客户端分析或其他任何事情?
  • 是的,我知道。如果他们被要求拥有 SSL,那么一切都会变得非常简单,因为我只需通过 iframe 从他们的网站加载任何页面,并且没有混合内容警告/被阻止的内容。我认为他们目前并不关心客户端分析。
【解决方案3】:

为此,您必须通过 HTTPS 代理请求(在您的服务器或其他服务器上)。如果页面上没有图像/javascript 等,那么就像@dave 建议的那样简单。如果有,那么您必须做更多的工作来处理所有相关链接。如果有你必须处理的 POST,它会变得更加复杂。根据复杂性,您可以自己编写代码,或者您可以找到一些现成的产品来执行此操作。

【讨论】:

  • 客户端不会有任何 POST,它应该看起来就像他们的网站在后台。我试图找到我可以设置什么样的代理来实现这一点。 (要查找的关键词/谷歌)谢谢!
  • 一个简单的代理处理多个路径,因此每个传入的请求都可能需要发送给它(参见 global.asax,Application_BeginRequest)。检查指定的 url 是否与应代理的内容匹配(例如 Request.Path.StartsWith("/proxy")),然后通过将方案更改为 http 以及主机名和路径来找出您想要的实际 url目标服务器上的 url。将该 url 发送到 HttpWebRequest.Create,对请求调用 GetResponse,然后将响应数据复制到上下文响应中。
  • 视情况而定,您可能还需要双向复制标头、cookie 等。
猜你喜欢
  • 2023-02-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-27
  • 2017-10-24
  • 2019-02-08
  • 2014-03-11
  • 2015-02-06
  • 2021-10-30
相关资源
最近更新 更多