如何绕过Access-Control-Allow-Origin?

2020/10/17 02:01 · javascript ·  · 0评论

我正在对其设置的平台上的我自己的服务器执行ajax调用,以防止这些ajax调用(但是我需要它来从服务器中获取数据以显示从服务器数据库中检索到的数据)。我的ajax脚本正在运行,它可以将数据发送到我的服务器的php脚本以进行处理。但是由于它被"Access-Control-Allow-Origin"

我无权访问该平台的源/核心。因此我无法删除不允许这样做的脚本。(P / SI使用了Google Chrome浏览器的控制台,并发现了此错误)

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);

      } 
  });

还是JSON上面的ajax脚本具有等效的代码?我认为JSON是允许的。

我希望有人可以帮助我。

把它放在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

好的,但是你们都知道*是通配符,并且允许每个域进行跨站点脚本编写吗?

您希望Access-Control-Allow-Origin为允许的每个站点发送多个标头-不幸的是,它官方不支持发送多个Access-Control-Allow-Origin标头或放入多个来源。

您可以通过以下方法解决此问题:检查原点,然后在标头中发回该原点(如果允许):

$origin = $_SERVER['HTTP_ORIGIN'];
$allowed_domains = [
    'http://mysite1.com',
    'https://www.mysite2.com',
    'http://www.mysite2.com',
];

if (in_array($origin, $allowed_domains)) {
    header('Access-Control-Allow-Origin: ' . $origin);
}

那更安全。您可能需要编辑匹配项,然后使用一些正则表达式或类似的东西将其更改为手动功能。至少这只会发送回1标头,并且您可以确定它是请求来自的标头。请注意,所有HTTP标头都可以被欺骗,但是此标头是为了保护客户端。不要用这些值保护自己的数据。如果您想了解更多,请阅读有关CORS和CSRF的内容。

为什么更安全?

允许从其他位置访问,则您自己的受信任站点允许会话劫持。我将举一个小例子-图像Facebook允许使用通配符起源-这意味着您可以在某个地方创建自己的网站,并将其触发对Facebook的AJAX调用(或打开iframe)。这意味着您可以获取您网站访问者的Facebook登录信息。更糟糕的是,您可以POST在他人浏览您的网站时编写请求脚本并将数据发布到某人的Facebook上。

使用ACAO接头时要非常小心

警告,如果您遵循其他一些答案,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");
}

我已经解决了在调用MVC3控制器时的问题。我补充说:

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

在我之前

return Json(model, JsonRequestBehavior.AllowGet);

而且我$.ajax还抱怨说它在我的ajax调用中不接受Content-type头,所以我将其注释掉,因为我知道它的JSON被传递给了Action。

希望能有所帮助。

使用*,这真的是一个坏主意,这使您可以跨站点编写脚本。您基本上一直都希望拥有自己的域,范围仅限于当前的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();

你明白了。

您是否尝试过将Access-Control-Allow-Origin标头实际添加到服务器发送的响应中?喜欢Access-Control-Allow-Origin: *吗?

本文地址:http://javascript.askforanswer.com/ruheraoguoaccess-control-allow-origin.html
文章标签: ,   ,   ,   ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!