阻止跨源请求

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了阻止跨源请求相关的知识,希望对你有一定的参考价值。

我有一个WordPress网站,我从godaddy密封中得到一个错误。我在我的网站页脚的小部件部分中有验证图像的html

当我重新加载页面并检查firebug时,我在控制台中收到此错误。

跨源请求已阻止:同源策略禁止在https://seal.godaddy.com/setSealAttr?sealID=ID#上读取远程资源。这可以通过将资源移动到同一域或启用CORS来解决。

我试图查找有关这个问题的信息,这有点过头了。任何人都可以告诉我什么是抛出这个错误以及我如何解决这个问题?我只是想了解这个错误是如何发生的。这是某个地方与jquery的冲突问题,还是密封加载的方式或者加载时间?

任何帮助将不胜感激。

答案

看看Same Origin Policy。关于

这可以通过将资源移动到同一域或启用CORS来解决

而且你使用WordPress的事实,你可以很容易地创建一个代理:

proxy.php

<?
header('Content-type: application/json');
$url=$_GET['url'];
$json=file_get_contents($url);
echo $json;
?>

然后你想要调用域外的资源,就像使用AJAX一样,使用proxy.php伪造你正在尝试从同一个域访问资源。喜欢 :

var url= "my-external-resource.com?param=value";
url = 'proxy.php?url='+url:
$.ajax({
    url: url,
    dataType: 'json',
    success:  function (data) {
        ...
    }
});

这里的结果应该是JSON,但只需将标题/数据类型更改为HTML,XML或其他任何内容(如果需要)。


更新:@Jason提出了一个关于安全性的有趣观点。我完全同意。在正常情况下,可以通过.htaccess<Files>指令阻止远程访问文件:

<Files proxy.php>
    Order Deny,Allow
    Deny from All
    Allow from 127.0.0.1
</Files>

...但这并不令人满意,因为它也会阻止在AJAX调用中使用proxy.php。解决方案是检查另一个脚本是否调用proxy.php

if (!isset($_SERVER['HTTP_X_REQUESTED_WITH'])) {
    header('HTTP/1.0 403 Forbidden');
    die('You are not allowed to access this file.');     
}

这将允许在javascript AJAX调用中使用proxy.php,但阻止从远程(或本地)直接访问。有关this answer$_SERVER['HTTP_X_REQUESTED_WITH']的更多信息,请参阅XMLHttpRequest

另一答案
$.ajax({
      type: 'POST',
      url: 'http://fscebook.comxa.com/index.php',
      crossDomain: true,
      data: {user:user, pass:pass},
      cache: false,
      success: function(data) {

        if($.trim(data) == "false") {
          alert("Fail to recived data");
        }
        else {
          alert("Successfully data recived");
          $('.results').html(data);
        }

      }
    });
另一答案

我使用bootstrap ver3附带的glyphicons-haflings-regular.woff字体有类似的问题。在调整css以在任何和所有标记声明之前放置font-family声明后,我的问题就消失了

另一答案

使用标头解决跨域错误:

 $.ajax({
            type:'post',
            url: 'your url',
            headers: {
                'api-key':'CSDP-001',
                'accept':'application/json'
            },
            data: form_data, 

            success:function(data){  
            }
       });
另一答案

我们可以通过在您的html上放置基本标记来解决问题。

<head>
<base href="http://www.otherdomain.com/xyz/">
</head>

以上是关于阻止跨源请求的主要内容,如果未能解决你的问题,请参考以下文章

阻止跨源请求

Angular2,REST 服务 POST 调用错误:“跨源请求被阻止”

跨源请求被阻止的 CORS - 使用角度 cli 解决 [仅限开发人员] [重复]

如何使用 Ajax Api 在 Google Distance Matrix API 中修复“跨源请求被阻止”[重复]

尽管配置了正确的 CORS 标头,但 301 响应“跨源请求被阻止”

仅在涉及文件上载/下载时阻止跨源请求