要绕过ajax'相同的原始策略',PHP ajax请求转发器的代码?

Chr*_*ris 2 javascript php ajax same-origin-policy

我想绕过ajax同源策略,在我的网站上有一个基本上像JSON代理一样的php页面.例如,我发这样的ajax请求:

mysite.com/myproxy.php?url=blah.com/api.json&a=1&b=2
Run Code Online (Sandbox Code Playgroud)

然后它发出请求:

blah.com/api.json?a=1&b=2
Run Code Online (Sandbox Code Playgroud)

并将JSON(或其他)结果返回给原始请求者.现在我假设我是愚蠢地重新发明轮子,如果我写这个PHP代码(加上我不知道PHP!) - 是否有一些预先存在的代码来做到这一点?我敢肯定,我不是唯一一个在此之前对抗同源政策的人.

哦是的,JSONP不适合这个特殊的api.

谢谢大家

Jas*_*son 5

好的,这是一些东西 - 把它打成一个PHP脚本,像这个脚本一样调用它.php?url = blah

发布您要发布到服务器的内容.

<?php


$curlPost = http_build_query($_POST);
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $_GET['url']);
curl_setopt($ch, CURLOPT_HEADER, 1); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost); 
$data = curl_exec($ch); 
curl_close($ch); 

echo json_encode($data);
 ?>
Run Code Online (Sandbox Code Playgroud)

现在这个脚本有点太开放了,所以为了提高安全性,我建议你将一个域列表添加到白名单中.

所以将它添加到顶部:

$whitelist = array('http://www.google.com','http://www.ajax.com');
$list = array();
foreach($whitelist as $w)
 $list[] = parse_url($w,PHP_URL_HOST);

$url = $_GET['url'];
$url = pathinfo($url,PHP_URL_HOST);
if(!in_array($url, $list)) die('no access to that domain');
Run Code Online (Sandbox Code Playgroud)