我在my site . com
的json.php中生成json消息。我在php脚本和发送会话id作为cookie cURL请求。所以脚本看到用户(请求这个脚本)是授权的,脚本为他打印json。
$ch = curl_init($json_url);
$ses_id = session_id();
$cookie = 'PHPSESSID='.$ses_id.';';
curl_setopt($ch, CURLOPT_COOKIE, $cookie);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
$json = curl_exec($ch);
curl_close($ch);
#working with json data
json.php:
if($_SESSION['UserAuthorized']) {
#print json there
}
这就够了吗?我认为没有,并试图为这一页添加一些辩护。我考虑过检查IP或referer。知识产权:
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$ip = $_SERVER['REMOTE_ADDR'];
}
var_dump($ip);
在本地服务器上都工作正常,但在主机上它显示的不是127.0.0.1(不是localhost,而是一些ip)。我使用虚拟主机,这就是为什么我在那里有问题。
$_SERVER['HTTP_REFFERER']
没有显示任何东西(打开浏览器或使用cURL发送http请求):
$ref = $_SERVER['HTTP_REFFERER'];
var_dump($ref);
输出为NULL。
关于ajax请求。我可以使用next:
if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
#add/delete/edit db for ex etc
}
但是…这就够了吗?
所以问题是:
我使用的方法足以保护json/ajax处理程序脚本?
任何建议/解释为什么http_referrer不工作?
- 您可以验证
$_SERVER['SERVER_ADDR'] == $_SERVER['REMOTE_ADDR']
来检查请求是否来自同一服务器。不要相信$_SERVER['HTTP_X_FORWARDED_FOR']
,因为它很容易被修改。 - 只有当您有一个Referrer时才会设置。如果你是直接调用页面(curl或在浏览器中输入url),或者如果你在浏览器中禁用了referer -header,它将不会发送到服务器。
除此之外,你应该认真考虑一下设计。为什么不能直接从第一个php脚本(现在包含curl)访问数据?json.php如何生成它的输出,您可以替换/包含该逻辑到您的第一个php脚本吗?