保护json生成ajax请求的脚本/处理程序


Protecting json generating script/handlers for ajax requests

我在my site . com的json.php中生成json消息。我在php脚本和发送会话id作为cookie cURL请求。所以脚本看到用户(请求这个脚本)是授权的,脚本为他打印json。

php脚本:

$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
}

但是…这就够了吗?

所以问题是:

  1. 我使用的方法足以保护json/ajax处理程序脚本?

  2. 任何建议/解释为什么http_referrer不工作?

  1. 您可以验证$_SERVER['SERVER_ADDR'] == $_SERVER['REMOTE_ADDR']来检查请求是否来自同一服务器。不要相信$_SERVER['HTTP_X_FORWARDED_FOR'],因为它很容易被修改。
  2. 只有当您有一个Referrer时才会设置。如果你是直接调用页面(curl或在浏览器中输入url),或者如果你在浏览器中禁用了referer -header,它将不会发送到服务器。

除此之外,你应该认真考虑一下设计。为什么不能直接从第一个php脚本(现在包含curl)访问数据?json.php如何生成它的输出,您可以替换/包含该逻辑到您的第一个php脚本吗?