我知道$_SERVER['REMOTE_ADDR']
和$_SERVER['HTTP_X_FORWARDED_FOR']
但这些显然只返回最终用户的地址(浏览器)
我有两个服务器,我从服务器B(Web服务器)调用服务器A上的页面
(通常传递一个表单并从第一个表单发布数据并在iframe中显示)
当然这是跨域的。
我想做一个故障保护,以确保只从网站发送帖子数据,但像隐藏的输入框这样的东西太容易被欺骗。
有没有办法解析Web服务器的地址而不将其放入表单输入数据?
我不是很擅长解释这个,所以我很抱歉,如果它令人困惑。 但基本上,我希望它是如果我从我自己的PC(或其他任何一个)欺骗发布数据到服务器A的页面,但不通过我的网络服务器的网站界面,它将拒绝该请求。
(我不能想到这样做的逻辑方式,因为显然php是服务器端,但网站和表单都是客户端站点。)
我能想到的最好的例子,Googles Drive API,您指定请求的来源,如果请求来自不同的地址,它将拒绝该请求。 (但很明显,表单是从客户地址发布的,所以这再次让我感到困惑)
更新:
使用带有jsonp的$ .ajax从服务器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查询和session_id()值中检索到的会话ID,它们根本不匹配。
答案 0 :(得分:0)
您可以做的一件事,就是让人们更难以绕过您的表单,在表单中设置会话ID
页面加载时:
<?php
session_start();
?>
in html:
<input type='hidden' name='token' value='<?php echo session_id(); ?>'>
提交表单时,请检查会话ID是否与令牌匹配