Я делаю вызов ajax на свой собственный сервер на платформе, который, как они устанавливают, предотвращает эти вызовы ajax (но мне нужно, чтобы он извлекал данные с моего сервера для отображения полученных данных из базы данных моего сервера).
Мой скрипт ajax работает, он может отправлять данные в скрипт php моего сервера, чтобы он мог обрабатывать.
Однако он не может вернуть обработанные данные, поскольку он заблокирован " Access-Control-Allow-Origin "
У меня нет доступа к источнику / ядру этой платформы. поэтому я не могу удалить сценарий, который запрещает мне это делать. (P / S Я использовал консоль 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
разрешено.
Я надеюсь, что кто-то может помочь мне.
Поместите это поверх retore.php:
header('Access-Control-Allow-Origin: *');
Обратите внимание, что это эффективно отключает защиту CORS и оставляет ваших пользователей подверженными атакам. Если вы не совсем уверены, что вам нужно разрешить все происхождение, вы должны заблокировать это до более конкретного происхождения:
header('Access-Control-Allow-Origin: https://www.example.com')
Хорошо, но вы все знаете, что * является подстановочным знаком и позволяет выполнять скрипты между сайтами из каждого домена?
Вы хотели бы отправить несколько заголовков Access-Control-Allow-Origin` для каждого сайта, который разрешен - но, к сожалению, официально не поддерживается отправка нескольких заголовков
Access-Control-Allow-Origin``, или поставить в несколько источников.
Вы можете решить эту проблему, проверив происхождение и отправив обратно в заголовок, если это разрешено:
& Лт;!- язык: php - >
$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);
}
Это намного безопаснее. Возможно, вы захотите отредактировать сопоставление и изменить его на ручную функцию с помощью некоторого regex или чего-то в этом роде. По крайней мере, это отправит только 1 заголовок, и вы будете уверены, что это тот, с которого поступил запрос. Обратите внимание, что все заголовки HTTP can подделываются, но этот заголовок предназначен для защиты клиента. Не защищайте свои данные этими значениями. Если вы хотите узнать больше, прочитайте немного о CORS и CSRF .
Почему это безопаснее?
Позволяя доступ из других мест, тогда ваш собственный доверенный сайт позволяет выполнять сеансовые хайджеки. Я собираюсь привести небольшой пример - изображение Facebook допускает происхождение подстановочных знаков - это означает, что вы можете сделать свой собственный веб-сайт где-нибудь и заставить его отправлять вызовы AJAX (или открывать iframes) на Facebook. Это означает, что вы можете получить зарегистрированную информацию на Facebook посетителя вашего сайта. Еще хуже - вы можете писать запросы POST
и публиковать данные на чьем-то Facebook - как раз во время просмотра вашего сайта.
Будьте очень осторожны при использовании заголовков `ACAO
!
Предупреждение , Chrome (и другие браузеры) будут жаловаться на то, что несколько заголовков ACAO установлены, если вы будете следовать некоторым другим ответам.
Ошибка будет примерно такой, как XMLHttpRequest не может загрузить ____. Заголовок «Access-Control-Allow-Origin» содержит несколько значений «____, ____, ____», но допускается только одно. Происхождение '____', следовательно, не допускается доступ.
Попробуй это:
$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
жаловался на то, что он не принимает заголовок Content-type в моем вызове ajax, поэтому я прокомментировал это, поскольку знаю, что его JSON передается в Действие.
Надеюсь, это поможет.
Лучше всего разрешить отдельные домены, будьте осторожны с http://:
header('Access-Control-Allow-Origin: http://www.foo.com', false);
header('Access-Control-Allow-Origin: http://www.foo2.com', false));
Вы пытались действительно добавить заголовок Access-Control-Allow-Origin в ответ, отправленный с вашего сервера? Мол, Access-Control-Allow-Origin: *
?
Это действительно плохая идея использовать *
, что делает вас широко открытым для сценариев кросс-сайтов. Вы в основном хотите свой собственный домен все время, привязанный к вашим текущим настройкам 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();
Вы поняли идею.