php 如何绕过访问控制允许来源?

2ekbmq32  于 2022-12-17  发布在  PHP
关注(0)|答案(5)|浏览(153)

我正在做一个 AJAX 调用我自己的服务器在一个平台上,他们设置防止这些ajax调用(但我需要它从我的服务器获取数据,以显示检索到的数据从我的服务器的数据库).我的ajax脚本工作,它可以发送数据到我的服务器的php脚本,让它处理.但它不能得到处理的数据回来,因为它被"Access-Control-Allow-Origin"阻止
我没有访问该平台的源代码/核心。所以我不能删除脚本,它不允许我这样做。(P/S我用谷歌浏览器的控制台,发现了这个错误)
AJAX 代码如下所示:

$.ajax({
     type: "GET",
     url: "http://example.com/retrieve.php",
     data: "id=" + id + "&url=" + url,
     dataType: 'json',   
     cache: false,
     success: function(data)
      {
        var friend = data[1];              
        var blog = data[2];           
        $('#user').html("<b>Friends: </b>"+friend+"<b><br> Blogs: </b>"+blog);

      } 
  });

或者上面的 AJAX 脚本有JSON的等价代码吗?我认为JSON是允许的。
我希望有人能帮我。

bkkx9g8r

bkkx9g8r1#

把这个放在retrieve.php的顶部:

header('Access-Control-Allow-Origin: *');

请注意,这实际上禁用了CORS保护,并使您的用户暴露在攻击之下。如果您不完全确定是否需要允许 * 所有 * 来源,则应将其锁定到更具体的来源:

header('Access-Control-Allow-Origin: https://www.example.com');

请参阅以下堆栈答案,以更好地理解Access-Control-Allow-Origin
https://stackoverflow.com/a/10636765/413670

xurqigkl

xurqigkl2#

警告,Chrome(和其他浏览器)将抱怨如果您遵循其他一些答案设置了多个ACAO头。

错误将类似于**XMLHttpRequest cannot load ____. The 'Access-Control-Allow-Origin' header contains multiple values '____, ____, ____', but only one is allowed. Origin '____' is therefore not allowed access.**
试试这个:

$http_origin = $_SERVER['HTTP_ORIGIN'];

$allowed_domains = array(
  'http://domain1.com',
  'http://domain2.com',
);

if (in_array($http_origin, $allowed_domains))
{  
    header("Access-Control-Allow-Origin: $http_origin");
}
8i9zcol2

8i9zcol23#

我已经修复了调用MVC 3控制器时的问题。我添加了:

Response.AddHeader("Access-Control-Allow-Origin", "*");

在我

return Json(model, JsonRequestBehavior.AllowGet);

我的$.ajax也抱怨它不接受 AJAX 调用中的Content-type头,所以我注解掉了它,因为我知道它的JSON被传递给了Action。
希望能有所帮助。

ffvjumwh

ffvjumwh4#

使用*是一个非常糟糕的主意,它会让你对跨站点脚本敞开大门。你基本上希望你自己的域一直在你当前的SSL设置范围内,并且可以选择额外的域。你还希望它们都作为一个标头发送。下面的代码将总是在与当前页面相同的SSL范围内授权你自己的域。并且可以选择性地包括任意数量的附加域。它会将它们作为一个报头发送,并且如果其他东西已经发送了它们,则覆盖前面的一个(或多个),以避免浏览器抱怨发送了多个访问控制报头的任何机会。

class CorsAccessControl
{
    private $allowed = array();

    /**
     * Always adds your own domain with the current ssl settings.
     */
    public function __construct()
    {
        // Add your own domain, with respect to the current SSL settings.
        $this->allowed[] = 'http'
            . ( ( array_key_exists( 'HTTPS', $_SERVER )
                && $_SERVER['HTTPS'] 
                && strtolower( $_SERVER['HTTPS'] ) !== 'off' ) 
                    ? 's' 
                    : null )
            . '://' . $_SERVER['HTTP_HOST'];
    }

    /**
     * Optionally add additional domains. Each is only added one time.
     */
    public function add($domain)
    {
        if ( !in_array( $domain, $this->allowed )
        {
            $this->allowed[] = $domain;
        }
    /**
     * Send 'em all as one header so no browsers grumble about it.
     */
    public function send()
    {
        $domains = implode( ', ', $this->allowed );
        header( 'Access-Control-Allow-Origin: ' . $domains, true ); // We want to send them all as one shot, so replace should be true here.
    }
}

用法:

$cors = new CorsAccessControl();

// If you are only authorizing your own domain:
$cors->send();

// If you are authorizing multiple domains:
foreach ($domains as $domain)
{
    $cors->add($domain);
}
$cors->send();

你懂的。

gzszwxb4

gzszwxb45#

您是否尝试过将Access-Control-Allow-Origin报头添加到从服务器发送的响应中?例如Access-Control-Allow-Origin: *

相关问题