【问题标题】:Security Concern with PHP loading an iframePHP 加载 iframe 的安全问题
【发布时间】:2014-01-31 00:43:52
【问题描述】:

我有一个具有身份验证机制的 PHP 页面。只有在成功登录后,我才想显示一个驻留在不同服务器上的 PHP 页面。我可以使用 iframe 来做到这一点,但我当然担心有人可以在 iframe 中获取 src 属性的值并直接转到页面 - 因此绕过安全机制。

实现这一点的最佳方法是什么?如何绕过初始登录直接访问 iframe 中的页面?

【问题讨论】:

  • 如果外部站点没有安全性,那就没有意义
  • 外部站点具有/可以具有安全性 - 问题是如何在外部站点上执行安全性以使用父站点的安全性?如何阻止iframe中的src被直接访问?

标签: php iframe


【解决方案1】:

如果您不希望在外部网站上被选中,我建议您根本不要使用 iframe。可以让 php 将外部站点的内容直接放入当前页面,例如使用 file_get_contents() 这也允许一种简单的安全形式,因为您可以将身份验证详细信息从现有服务器发布到远程服务器:

$opts = array('http' =>
  array(
    'method'  => 'POST',
    'header'  => "Content-Type: text/xml\r\n".
      "Authorization: Basic ".base64_encode("$https_user:$https_password")."\r\n",
    'content' => $body,
    'timeout' => 60
  )
);

$context  = stream_context_create($opts);
$url = 'https://'.$https_server;
$result = file_get_contents($url, false, $context, -1, 40000);

(示例来自 php curl 手册中关于 file_get_contents1 的 cmets 部分)

一种更复杂的方法(如果您有时间弄清楚,从长远来看也更好) 是使用 curl,您可以查看如何使用以下问题的代码获取 POST 的结果:PHP + curl, HTTP POST sample code?

编辑:刚刚看到你的评论:

这种方法的问题在于,在 iframe 中加载的外部站点会对驻留在同一服务器上的页面执行大量 ajax 请求。

没有什么可以阻止您在页面内执行 ajax 请求。 当然,默认情况下请求必须来自同一个域,但有一些方法可以解决这个问题:

  1. 在你自己的页面上有一个 php 脚本充当中介:基本上它会将 ajax 传递给外部服务器,然后将响应发送回来 (优点,简单,缺点,由于请求被处理两次而产生的额外流量)

  2. 跨域资源共享https://developer.mozilla.org/en/docs/HTTP/Access_control_CORS)基本上,您告诉客户您将使用来自另一个站点的资源。这样浏览器就不会将其作为潜在的劫持来阻止。

(见http://css.dzone.com/articles/ajax-requests-other-domains

这样做的好处是它隐藏了 iframe 的来源,并允许您在两个域之间使用身份验证。与 .htaccess 结合使用会非常安全,因为您可以使用 .htaccess,这样只有运行代码的域才能访问该页面。

如果您必须使用 iframe,那么您当然应该进行身份验证,否则它将向全世界开放,因为客户端需要直接访问该网站。您可以将数据 POST 到 iframe(参见 Sending data through post method to an iframeHow do you post to an iframe?),这涉及将 iframe 设置为表单,然后提交表单(您可以通过 javascript 自动完成)以获取 POST 结果。

由于这必须在客户端完成,它不仅公开了要访问的页面,还公开了要发送的请求类型。这是否是一个问题取决于您以及您希望什么样的用户使用您的程序。

至于 curl,curl 本身并不能解决 iframe 和 ajax 调用的问题,但它是一个比 file_get_contents 更有效和灵活的 url/webpage-getting 命令/framework。

【讨论】:

  • 这就是我不使用 file_get_contents() 的原因:在 iframe 中加载的外部站点对驻留在同一服务器上的页面执行大量 ajax 请求。如果我只是做了file_get_contents,它只会粘贴该文件的内容,仅此而已。 curl 如何为我解决这个问题? (我不介意花时间学习 curl?
【解决方案2】:

一种不太干净但有效的方法是通过 file_get_contents 加载远程站点并输出它。 不过,您可能对图像、css、脚本等资源的路径名有疑问。 如果您控制远程站点,则可以在任何地方使用绝对 URL 来修复它们。

如果性能是一个问题,您可能需要考虑缓存。

【讨论】:

  • 这种方法的问题在于,加载到 iframe 中的外部站点会对驻留在同一服务器上的页面执行大量 ajax 请求。如果我只是做了file_get_contents,它只会粘贴该文件的内容,仅此而已。所有这些 ajax 请求都会被搞砸。
  • 在这种情况下,您必须在远程服务器上实施某种安全措施。您无法有效阻止用户抓取 iframe URL 并直接调用它。如果您有能力依赖不太聪明的用户,检查引荐来源网址可以提供一些非常轻微的安全性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-28
  • 2011-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-25
相关资源
最近更新 更多