【问题标题】:Get IP address of original server in iframe request (PHP)在 iframe 请求中获取原始服务器的 IP 地址 (PHP)
【发布时间】:2018-01-13 15:38:06
【问题描述】:

我知道$_SERVER['REMOTE_ADDR']$_SERVER['HTTP_X_FORWARDED_FOR'] 但这些显然只返回最终用户(浏览器)的地址 我有两台服务器,我从服务器 B(Web 服务器)调用服务器 A 上的一个页面 (通常传递一个表单并从第一个表单向其发布数据并显示在 iframe 中) 自然是跨域。 我想做一个故障保险来确保帖子数据只从网站发送,但是像隐藏的输入框这样的东西太容易被欺骗了。

有没有办法让它解析 Web 服务器的地址而不将其放入表单输入数据中?

我不擅长解释这一点,如果它令人困惑,我很抱歉。 但基本上,我希望它是,如果我从我自己的 PC(或任何其他 PC)欺骗发布数据到服务器 A 的页面,而不是通过我的网络服务器的网站界面,它将拒绝该请求。

(我想不出一种合乎逻辑的方式来做到这一点,因为显然 php 是服务器端,但网站和表单都是客户端站点)。

我能想到的最佳示例,Google 的 Drive API,您指定请求的来源,如果请求来自不同的地址,它将拒绝该请求。 (但显然表格是从客户地址发布的,所以这让我再次感到困惑)

更新:

使用 $.ajax 和 jsonp 从服务器 A 检索会话 ID(如 @deymac 建议的那样),并将其应用于输入(令牌),但是,每次调用会话 ID 时都会发生变化。

<?php 
header('Access-Control-Allow-Origin: *');
session_start();
$get = (isset($_GET['get'])) ? $_GET['get'] : "";
if ($get == 'session')
{
    echo json_encode(session_id());
}
else
{
    $token = (isset($_POST['token'])) ? $_POST['token'] : "";
    $sessionid = session_id();
    if ($token === $sessionid)
    {
        Processing code in here.
    }
}
?>

回显从 ajax 查询中检索到的会话 ID 和 session_id() 值,它们根本不匹配。

【问题讨论】:

  • 你应该看看 CRSF。我想这就是你想要的
  • 跨站请求伪造?我会仔细阅读,谢谢

标签: php html iframe


【解决方案1】:

您可以做的一件事是让人们更难绕过您的表单,即在表单中设置会话 ID

页面加载时:

<?php
session_start();
?>

在 html 中:

<input type='hidden' name='token' value='<?php echo session_id(); ?>'>

当您提交表单时,请检查会话 ID 是否与令牌匹配

【讨论】:

  • 这仅适用于发布到同一服务器的表单虽然正确吗?我在哪里发布到单独的服务器,会话是否也发送?
  • 哦,那就用ajax从服务器a调用服务器b,得到一个会话ID,然后把它作为值...然后它就会有服务器b中的会话ID
  • 但你也可以使用 PHP 和 curl 来获取数据
  • 嗯,所以使用 jsonp 作为 ajax 请求来获取会话 ID,它工作正常,它返回一个会话 ID 值,但是,当我将会话发布到脚本时,回显会话 ID以及它们不匹配的令牌 ID,它没有使用与我第一次调用它以获取会话 ID 时创建的会话相同的会话。
猜你喜欢
  • 2013-05-31
  • 1970-01-01
  • 1970-01-01
  • 2015-06-21
  • 2011-06-15
  • 2011-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多