限制可以请求json的url


limit urls that can ask for json

如何设置标题,以便只有我在数组中输入的url(例如)可以访问,并且可以将jsonp数据发送到php中的webservice,以防止随机站点将数据传递给我的服务作为用户。

类似

的调用
$.ajax({
  type: "GET",
  dataType: "jsonp",
  url: jsonpurl,
  jsonpCallback: "JSONCallback",
  data: {title:$("#txtTitle").val(), url:taburl},
  success: function(data, textStatus) {
    if(data.code > 0)
        {
        $("#icon").removeClass().addClass('accept');
        }
    else
        {
        $("#icon").removeClass().addClass('error');
        }
  },
  error: function(xhr, textStatus, errorThrown) {
     alert("XMLHttpRequest="+xhr.responseText+"'ntextStatus="+textStatus+"'nerrorThrown="+errorThrown);
    $("#icon").removeClass().addClass('error');
  }
});

$.ajax({
  type: "POST",
  url: url,
  data: {title:$("#txtTitle").val(), url:encodeURIComponent(taburl)},
  success: function(data, textStatus) {
        if(data.code > 0)
    {
    $("#icon").removeClass().addClass('accept');
    }
    else
    {
    $("#icon").removeClass().addClass('error');
    }
  },
  error: function(data, textStatus) {
      alert(textStatus);
    $("#icon").removeClass().addClass('error');
  }
});

同时有post和get的原因是chrome和safari扩展可以很好地跨域工作,而不必将数据类型设置为jsonp,但firefox没有。

我知道有两个被否决的答案,那我选哪个呢?

差不多一年过去了,但无论如何…

如果你想允许的url在同一个网站上,你可以创建一个令牌(一个随机字符串)并将其存储在会话中,然后在你的JS请求中使用它。

像这样:

function generateToken($length = 10)
{
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[rand(0, strlen($characters) - 1)];
    }
    return $randomString;
}
// Before outputing the javascript
if(empty($_SESSION['token']) $_SESSION['token'] = generateToken();

然后你在ajax调用中使用$_SESSION['token']在GET或POST中传递它,然后在PHP中交付服务之前,测试来自JS的提供的令牌是否与SESSION中的令牌相同。

您可以使用Referer (sic)报头($_SERVER['HTTP_REFERER'])查看JSONP请求的来源,并基于此进行筛选。

我不知道是否可以通过标题,但您可以使用:

preg_match() and SERVER[REQUEST_URI]