我有一个具有身份验证机制的PHP页面。只有在成功登录后,我才想显示一个驻留在不同服务器上的PHP页面。我可以使用iframe来做到这一点,但我当然担心有人可以在iframe中获取src属性的值并直接转到页面 - 因此绕过了安全机制。
实施此操作的最佳方法是什么?如何通过绕过初始登录来阻止iframe中的页面被直接访问?
答案 0 :(得分:2)
如果您不想接收外部网站,我建议您根本不使用iframe。您可以使用php将外部站点的内容直接放入当前页面,例如,使用file_get_contents() 这也允许一种简单的安全形式,因为您可以将身份验证详细信息从现有服务器POST到远程服务器:
$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_contents 1的评论部分)
更复杂的方式(如果你有时间搞清楚的话,从长远来看也更好) 是使用curl,您可以使用此问题中的代码了解如何获取POST的结果:PHP + curl, HTTP POST sample code?
编辑:刚刚看到你的评论:
此方法的问题在于,iframe中加载的外部网站会对驻留在同一服务器上的网页执行大量的ajax请求。
没有什么可以阻止您在页面中执行ajax请求。 当然,默认情况下,请求必须来自同一个域,但有办法解决这个问题:
在你自己的页面上有一个php脚本充当中介:基本上它会将ajax传递给外部服务器,然后发回响应 (由于请求被处理两次而产生的上行,简单,下行,额外流量)
跨源资源共享https://developer.mozilla.org/en/docs/HTTP/Access_control_CORS)基本上,您告诉客户您将使用其他站点的资源。这样浏览器就不会阻止它作为潜在的劫持。
(见http://css.dzone.com/articles/ajax-requests-other-domains)
这样做的好处是它隐藏了iframe的源代码,并允许您在两个域之间使用身份验证。与.htaccess结合使用时,它可以非常安全,因为您可以使用.htaccess,以便只允许运行代码的域/域访问该页面。
如果您必须使用iframe,当然您应该进行身份验证,否则它将向全世界开放,因为客户端需要直接访问该站点。您可以将数据发布到iframe(请参阅Sending data through post method to an iframe或How do you post to an iframe?),其中涉及将iframe设置为表单,然后提交表单(您可以通过javascript自动执行)以获取POST结果。
由于这必须在客户端完成,因此它不仅会公开要访问的页面,还会显示要发送的请求类型。这是否是一个问题取决于您和您希望使用您的程序的用户类型。
至于curl,curl本身并不能解决iframe和ajax调用的问题,但它是一个比file_get_contents更高效灵活的url / webpage-getting命令/框架。
答案 1 :(得分:1)
不太干净但有效的方法是通过file_get_contents加载远程站点并输出它。 您可能会遇到资源路径名称问题,如图像,css,脚本。 如果您控制远程站点,则可以通过在任何地方使用绝对URL来修复它们。
如果性能有问题,您可能需要考虑缓存。