限制可以要求json的网址

时间:2011-11-03 16:26:15

标签: php json security jquery

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

调用类似

$.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没有。

更新 我知道有两个downvoted答案 - 所以我选择哪个?

3 个答案:

答案 0 :(得分:0)

差不多一年之后,但无论如何......

如果您要允许的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中的令牌相同。如果是这样,你可以继续下去。

答案 1 :(得分:-1)

您可以使用Referer(sic)标头($_SERVER['HTTP_REFERER'])来查看JSONP请求的来源,并根据此进行过滤。

答案 2 :(得分:-2)

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

preg_match() and SERVER[REQUEST_URI]

如果它不匹配就会死掉。