【发布时间】: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。我想这就是你想要的
-
跨站请求伪造?我会仔细阅读,谢谢