Как обойти cors
Перейти к содержимому

Как обойти cors

  • автор:

Курсы javascript

Редко прошу помощи помощи на форумах, но уже сил нет искать решение.

Суть вопроса: отправляю запрос через ajax, в ответ получаю блокировку по причине — No ‘Access-Control-Allow-Origin’ header is present on the requested resource.

$.ajax(< url: url, dataType: 'json', type: 'GET', async: false, crossDomain: true, cache:false, headers: < 'Access-Control-Allow-Origin': '*' >, complete: function (data,status,XHR) < console.log(data) >, error:function(jqXHR, textStatus, errorThrown) < console.log(jqXHR); console.log(textStatus); console.log(errorThrown); >>);

пример ссылки куда отправляю запрос __https://api.openload.co/1/file/dl?file=st_pJ9IrdpQ&ticket=st_pJ9IrdpQ~6ad74ad4258 33d50~1511105366~def~F8R1rW64_fhOKxW0~1~zwPU4n9W4u caGyqf&captcha_response=c417

В ответ приходят JSON данные.

Можно ли как-то обойти это блокировку и вернуть в браузер ответ?

Заранее спасибо за любые советы!

19.11.2017, 19:04
Кандидат Javascript-наук
Регистрация: 04.11.2017
Сообщений: 117
Access-Control-Allow-Origin’: ‘*’ к чему этот заголовок ? вы сервер?
19.11.2017, 19:08
Новичок на форуме
Регистрация: 27.09.2014
Сообщений: 7

Нет )) Это мои пробы. не убрал.

Да, кстати, забыл написать. Решение путем отправки запроса на свой сервак, и получение ответом чрез PHP не подходит, т.к. запрос привязан IP .

19.11.2017, 19:42
Новичок на форуме
Регистрация: 27.09.2014
Сообщений: 7

Сейчас делаю запрос с такими параметрами

$.ajax(< url: url, dataType: 'jsonp', type: 'GET', async: false, crossDomain: true, cache:false, contentType: "application/json; charset=utf-8", complete: function (data) < console.log( data ) >, error:function(jqXHR, textStatus, errorThrown) < console.log(jqXHR); console.log(errorThrown); >>);

т.е. при смене dataType в jsonp и указании contentType

блокировки нет, но теперь есть ошибка

19.11.2017, 19:55
Кандидат Javascript-наук
Регистрация: 04.11.2017
Сообщений: 117
странно. А должно так работать ?
20.11.2017, 02:41
Регистрация: 02.01.2010
Сообщений: 6,455

Если конечный сервер не разрешает загрузку с себя тем самым хэдером или предоставляя jsonp, то напрямую вы не получите ответ никак. Вообще.
Тут потребуется либо договариваться с сервисом, что самый правильный но и самый утопичный вариант, либо использовать прокси. В качестве прокси лучше само собой свой сервер, но если очень надо и пофиг на зависимости и долговременную перспективу, то можно воспользоваться например сервисом yahoo:

  

__________________
20.11.2017, 10:25
Регистрация: 18.11.2017
Сообщений: 68
вопрос: а без CORS не получится скачать контент с сервера?
20.11.2017, 15:12
Интересующийся
Регистрация: 17.11.2017
Сообщений: 10

Запрос привязан к IP, но нельзя сделать запрос через свой сервер? А если сервер на том же IP? PHP/Node.js?

Еще не совсем понятно, откуда именно и с помощью чего делается запрос. Через GM_xmlhttpRequest Greasemonkey/Tampermonkey или свое расширение не вариант?

Обойти CORS ajax

Хотел использовать PHP обработку, которая находится на другом сервере. И тут узнаю, что так делать как-бы нельзя из-за некой защиты CORS (CROSS-ORIGIN RESOURCE SHARING). Пытался использовать нагугленные решения типа прокси (cors.io). получаю следующие ошибки:

Кликните здесь для просмотра всего текста

Failed to load http://www.todolist.my/get_all_info.php: Response to preflight request doesn’t pass access control check: No ‘Access-Control-Allow-Origin’ header is present on the requested resource. Origin ‘http://localhost:8888’ is therefore not allowed access.

Использую такой js код для AJAX запроса:
Кликните здесь для просмотра всего текста

1 2 3 4 5 6 7 8 9 10 11
// напихал кучу разных header-ов из гайдов - толку 0 что с ними, что без них function getAllInfo() { infoHttp = new XMLHttpRequest(); infoHttp.open('GET', 'http://www.todolist.my/get_all_info.php', true); infoHttp.setRequestHeader('Access-Control-Allow-Methods','DELETE, HEAD, GET, OPTIONS, POST, PUT'); infoHttp.setRequestHeader('Access-Control-Allow-Headers','Content-Type, Content-Range, Content-Disposition, Content-Description'); infoHttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded'); infoHttp.setRequestHeader('Access-Control-Allow-Origin','*'); infoHttp.onreadystatechange = getAllInfoReply; infoHttp.send(null); }

И есть один файл конфигурации для всех PHP файлов на сервере, к которому пытаюсь обратиться. К нему также добавлял header-ы из гайдов. Этот файл (config.php) подключается ко всем PHP на том сервере, так что решил написать 1 раз и не дублировать везде:

Кликните здесь для просмотра всего текста

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
 const PAGE_ENCODING='UTF-8'; // Connection's Parameters $db_host="localhost"; $db_name="factory"; $username="root"; $password=""; $link=mysqli_connect($db_host,$username,$password,$db_name) or die ("cannot connect"); if (!$link) { die("ERROR: ".mysqli_error($link)); } if(mb_internal_encoding(PAGE_ENCODING) != PAGE_ENCODING) die('There is no support encoding: '.PAGE_ENCODING); // Вот эти header-ы - от них тоже толку 0 header("Access-Control-Allow-Origin: *"); header("Access-Control-Allow-Methods: POST, GET, OPTIONS"); header("Access-Control-Allow-Headers: Origin"); header("Content-Type: application/json; charset=utf-8"); ?>

Может имел кто опыт работы с таким видом запросов? Можете поделиться?
Заранее благодарю за любые советы и подсказки по решению данной проблемы!

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Cors ajax
Доброго времени суток. Возникла проблема с аяксом. Когда отправляю запрос — получаю ответ.

Как обойти, Ajax не работает и выполнить php скрипт
Здравствуйте, есть ссылка по нажатию отрабатывает Ajax и выводит Hello World! Как при отключенном.

Как обойти ajax-запросы и сделать POST-отправку новости?
Имеется сайт zagrus.ru Код публикатора новостей. # -*- coding: cp1251 -*- import urllib import.

CORS
через ajax осуществляю запрос к другому хосту. браузер выдает: Access to XMLHttpRequest at . from.

Регистрация: 23.10.2017
Сообщений: 8

Нет какого-то всеобъемлющего и идеального решения обхода CORS. В любом случае нужны костыли. Я предпочитаю использовать cors-anywhere.herokuapp.com/Адрес . Этот сервис никогда не подводил еще

Эксперт JS

2434 / 1742 / 623
Регистрация: 11.07.2016
Сообщений: 4,027

SnapeEye, если у вас есть доступ к редактированию данной обработки — просто отправляйте соответствующий заголовок в ответе. В противном случае обойти защиту средствами JS нельзя.
Как вариант вы можете слать запрос на ваш сервер, а он в свою очередь может делать запрос на нужную обработку, получать ответ и отдавать клиенту.

Регистрация: 16.05.2013
Сообщений: 351

ЦитатаСообщение от M83 Посмотреть сообщение

Этот сервис никогда не подводил еще

Получаю такую ошибку в Chrome. Я правильно составил строку URL?
GET http://cors-anywhere.herokuapp.com/http://www.todolist.my/get_all_info.php 404 (Not Found)

infoHttp = new XMLHttpRequest(); infoHttp.open('GET', 'https://cors-anywhere.herokuapp.com/http://www.todolist.my/get_all_info.php', true);

Хотя такой файл есть (директория сервера, к которому обращаюсь):
Регистрация: 23.10.2017
Сообщений: 8

SnapeEye, соррян, недостаточно внимательно прочел шапку топика. Не сразу заметил, что у тебя обмен данными происходить в рамках локалки. В таком случае cors-anywhere тебе просто напросто не поможет, потому что он не сможет достучаться до твоего локального сервера. У тебя лишь остается вариант самому поднять форк сие сервиса у себя.

Но, ежели ты сам можешь заправлять сервером с приложением, то советую более детально изучить тему пробрасывания кроссдоменных запросов. У меня была подобная проблема, когда я писал SPA на Laravel и Vue. При отправке AJAX-запросов сервер ругался на то, что запросы поступают при включенном CORS. В итоге все прошло после того, как я отказался от XMLHttpRequest в пользу axios, после чего все заработало. С трудом понимаю, каким образом это связано было, но факт остается фактом. Посмотри в сторону какой-нибудь сторонней либы для запросов.

А если отправить запрос через Postman, то что вернет сервер?

Регистрация: 16.05.2013
Сообщений: 351

ЦитатаСообщение от M83 Посмотреть сообщение

В итоге все прошло после того, как я отказался от XMLHttpRequest в пользу axios, после чего все заработало.

ЦитатаСообщение от M83 Посмотреть сообщение

А если отправить запрос через Postman, то что вернет сервер?
Возвращает всё как надо.

Дело в том, что основной сервер на Node.js. И вот с него я делаю запрос к серверу Apache. Оба локальные.

Отправить POST на сервер и обойти проверку CORS

Т.е. вопрос с ответами он подгружает POST-запросом к https://baza-otvetov.ru/quiz/ask. Так вот, я никак не могу сэмулировать этот ПОСТ-запрос.

 @SpringBootApplication public class PostrequestApplication implements CommandLineRunner < private static final Logger logger = LoggerFactory.getLogger(PostrequestApplication.class); private static final String USER_AGENT = "Mozilla/5.0"; static final String COOKIES_HEADER = "Set-Cookie"; static java.net.CookieManager msCookieManager = new java.net.CookieManager(); public static void main(String[] args) < SpringApplication.run(PostrequestApplication.class, args); >@Override public void run(String. strings) throws Exception < logger.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>> START <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"); System.setProperty("sun.net.http.allowRestrictedHeaders", "true"); HttpsURLConnection get = sendGet("https://baza-otvetov.ru/quiz"); HttpsURLConnection post = preparePostConnection("https://baza-otvetov.ru/quiz/ask", get); sendPost(post); >private HttpsURLConnection preparePostConnection(String url, HttpsURLConnection get) throws Exception < System.out.println("\nGET RESPONSE HEADERS"); Map> map = get.getHeaderFields(); for (Map.Entry> entry : map.entrySet()) < System.out.println("Key : " + entry.getKey() + ", Value : " + entry.getValue()); >System.out.println("POST: "+url); URL obj = new URL(url); HttpsURLConnection con = (HttpsURLConnection) obj.openConnection(); con.setRequestMethod("POST"); //set cookies Map> headerFields = get.getHeaderFields(); List cookiesHeader = headerFields.get(COOKIES_HEADER); if (cookiesHeader != null) < for (String cookie : cookiesHeader) < msCookieManager.getCookieStore().add(null, HttpCookie.parse(cookie).get(0)); >> if (msCookieManager.getCookieStore().getCookies().size() > 0) < // While joining the Cookies, use ',' or ';' as needed. Most of the servers are using ';' con.setRequestProperty("Cookie", join(msCookieManager.getCookieStore().getCookies(), ";")); >//add reuqest header con.setRequestProperty("content-length", "0"); con.setRequestProperty("User-Agent", USER_AGENT); con.setRequestProperty("Accept-Language", "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7"); //con.setRequestProperty("Access-Control-Allow-Origin", "*"); //con.setRequestProperty("Access-Control-Allow-Credentials", "true"); con.setRequestProperty("origin", "https://baza-otvetov.ru"); con.setRequestProperty("referer", "https://baza-otvetov.ru/quiz"); System.out.println("\nPOST REQUEST HEADERS"); Map> map_post = con.getHeaderFields(); for (Map.Entry> entry : map_post.entrySet()) < System.out.println("Key : " + entry.getKey() + ", Value : " + entry.getValue()); >return con; > private HttpsURLConnection sendGet(String url) throws Exception < System.out.println("GET: "+url); URL obj = new URL(url); HttpsURLConnection con = (HttpsURLConnection) obj.openConnection(); // optional default is GET con.setRequestMethod("GET"); //add request header con.setRequestProperty("User-Agent", USER_AGENT); int responseCode = con.getResponseCode(); System.out.println("Response Code : " + responseCode); BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); String inputLine; StringBuffer response = new StringBuffer(); while ((inputLine = in.readLine()) != null) < response.append(inputLine); >in.close(); //print result System.out.println(response.toString()); return con; > private void sendPost(HttpsURLConnection con) throws Exception < // Send post request con.setDoOutput(true); int responseCode = con.getResponseCode(); System.out.println("Response Code : " + responseCode); BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); String inputLine; StringBuffer response = new StringBuffer(); while ((inputLine = in.readLine()) != null) < response.append(inputLine); >in.close(); //print result System.out.println("RESPONSE: "+response.toString()); > public static String join(List var0, String var1) < StringBuffer var2 = new StringBuffer(); for(Iterator var3 = var0.iterator(); var3.hasNext(); var2.append(var3.next().toString())) < if (var2.length() != 0) < var2.append(var1); >> return var2.toString(); > > 

Все равно сервер ничего не возвращает.

Как обойти cors?

У меня есть два сервера, один на ноде localhost:3000 (фронт на react), второй на бэке (php) через openserver , localhost.
Пытаюсь отправить ajax запрос 61fbc5ffa39c1386745737.pngВот что мне вываливает. В браузере поставил расширение для обхода cors https://chrome.google.com/webstore/detail/allow-co.
Не помогло.
61fbc658a3bbd177333616.png
Вот код файла api на php, и на js запрос
61fbc68ec4d2a956197334.png
Во вкладке сеть заголовки выглядят почему то подобным образом: 61fbc6fbe5e34216834041.png

  • Вопрос задан более года назад
  • 3137 просмотров

Комментировать
Решения вопроса 1

Совсем недавно занимался решением такой проблемы. Всего лишь нужно отдать необходимые HTTP заголовки клиенту.
Пример на php:

header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE'); header('Access-Control-Allow-Credentials: true'); header('Access-Control-Allow-Headers: Authorization, Origin, X-Requested-With, Accept, X-PINGOTHER, Content-Type');

Ответ написан более года назад
Нравится 4 2 комментария

Если же вы имели ввиду обход CORS на стороне клиента, то стоит найти другое решение проблемы, ибо шанс, что получится подобное реализовать очень мал, да и не очень то правильно это, уязвимость все-таки.

DevilPrado @DevilPrado Автор вопроса

firecorer, на стороне клиента у меня как раз расширение в браузере выключает cors, спасибо за помощь)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *