Перейти к содержимому

Sec fetch mode что это

  • автор:

Sec-Fetch-Mode и почему он не везде?

Если запустить веб сервер встроенный в php командой php -S . и в devtool выполнить команду
fetch(location.href)
то на вкладке network -> request headers видим
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
И такой результат получим и на этом сайте и на гитхабе и на многих других.

А если зайти на 4pda и выполнить
fetch(location.href)
То Sec-Fetch-Mode и Sec-Fetch-Site вообще отсутствуют.

Заметил это случайно когда увидел что у меня request headers отличается на localhost’e и на vps’ке с запущенным nginx

Для чего нужны Sec-Fetch-Mode и Sec-Fetch-Site ?
И почему не на всех сайтах эти заголовки присутствуют?
И как их добавить?

  • Вопрос задан более трёх лет назад
  • 14260 просмотров

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

Они отсутствуют при обращении на http сайты.

Добавляются автоматически браузером (можно и самому с помощью расширения) при обращении на https сайты.

В Chromuim’е c 76 версии.

Реализована поддержка группы HTTP-заголовков Fetch Metadata (Sec-Fetch-Dest, Sec-Fetch-Mode, Sec-Fetch-Site и Sec-Fetch-User), позволяющих отправить дополнительные метаданные о характере запроса (межсайтовый запрос, запрос через тег img и т.п.) для принятия на сервере мер для защиты от некоторых типов атак (например, маловероятно, что ссылка на обработчик для перевода денег будет задана через тег img, поэтому такие запросы можно блокировать без передачи приложению);

Ответ написан более трёх лет назад
Комментировать
Нравится 1 Комментировать

DevMan

Для чего нужны Sec-Fetch-Mode и Sec-Fetch-Site ?

для управления доступом.

И почему не на всех сайтах эти заголовки присутствуют?

потому что не везде они нужны. да и использовать их не заставляют.

И как их добавить?

Ответ написан более трёх лет назад

DevMan, куда их добавить?(нужны HTTP_SEC_FETCH_SITE=same_origin, HTTP_SEC_FETCH_MODE=cors, HTTP_SEC_FETCH_DEST=empty)
в nginx?
(у меня связка nginx+apache)
ошибка в браузере
«ERR_NETWORK» axios

Ответы на вопрос 0
Ваш ответ на вопрос

Войдите, чтобы написать ответ

веб-разработка

  • Веб-разработка
  • +2 ещё

Что тут задача фронтенда, а что бэкэнда?

  • 1 подписчик
  • 2 часа назад
  • 93 просмотра

Ведение журнала HTTP в ASP.NET Core

Это не последняя версия этой статьи. В текущем выпуске см . версию .NET 8 этой статьи.

[!IMPORTANT] > This information relates to a pre-release product that may be substantially modified before it’s commercially released. Microsoft makes no warranties, express or implied, with respect to the information provided here. > > For the current release, see the [.NET 8 version of this article](?view=aspnetcore-8.0&preserve-view=true). . moniker-end —>

Ведение журнала HTTP — это ПО промежуточного слоя, которое регистрирует сведения о входящих HTTP-запросах и ответах HTTP. Ведение журнала HTTP предоставляет журналы со следующими сведениями:

  • HTTP-запросы;
  • Общие свойства
  • Заголовки
  • Текст
  • HTTP-ответы.

Ведение журнала HTTP может:

  • Регистрируют все запросы и ответы или только запросы и ответы, соответствующие определенным критериям.
  • Выберите, какие части запроса и ответа регистрируются.
  • Разрешите отредактировать конфиденциальную информацию из журналов.

Ведение журнала HTTP может снизить производительность приложения, особенно при ведении журналов запросов и ответов. При выборе регистрируемых полей учитывайте возможное влияние на производительность. Проверьте влияние выбранных свойств ведения журнала на производительность.

Ведение журнала HTTP может потенциально ведения журнала личных сведений (PII). Примите во внимание возможные риски и не записывайте конфиденциальную информацию.

Включение ведения журнала HTTP

Ведение журнала HTTP включено путем вызова AddHttpLogging и UseHttpLogging, как показано в следующем примере:

var builder = WebApplication.CreateBuilder(args); builder.Services.AddHttpLogging(o => < >); var app = builder.Build(); app.UseHttpLogging(); if (!app.Environment.IsDevelopment()) < app.UseExceptionHandler("/Error"); >app.UseStaticFiles(); app.MapGet("/", () => "Hello World!"); app.Run(); 

Пустая лямбда в предыдущем примере вызова AddHttpLogging добавляет ПО промежуточного слоя с конфигурацией по умолчанию. По умолчанию протоколирование HTTP регистрирует общие свойства, такие как путь, код состояния и заголовки для запросов и ответов.

Добавьте следующую строку в файл appsettings.Development.json на уровне «LogLevel»: < , чтобы отображались журналы HTTP:

 "Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware": "Information" 

При настройке по умолчанию запрос и ответ регистрируются как пара сообщений, аналогичных следующему примеру:

info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[1] Request: Protocol: HTTP/2 Method: GET Scheme: https PathBase: Path: / Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 Host: localhost:52941 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.2088.61 Accept-Encoding: gzip, deflate, br Accept-Language: en-US,en;q=0.9 Upgrade-Insecure-Requests: [Redacted] sec-ch-ua: [Redacted] sec-ch-ua-mobile: [Redacted] sec-ch-ua-platform: [Redacted] sec-fetch-site: [Redacted] sec-fetch-mode: [Redacted] sec-fetch-user: [Redacted] sec-fetch-dest: [Redacted] info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[2] Response: StatusCode: 200 Content-Type: text/plain; charset=utf-8 Date: Tue, 24 Oct 2023 02:03:53 GMT Server: Kestrel 

Параметры ведения журнала HTTP

Чтобы настроить глобальные параметры ПО промежуточного слоя ведения журнала HTTP, вызовите AddHttpLogging его Program.cs , используя лямбда-файл для настройки HttpLoggingOptions.

using Microsoft.AspNetCore.HttpLogging; var builder = WebApplication.CreateBuilder(args); builder.Services.AddHttpLogging(logging => < logging.LoggingFields = HttpLoggingFields.All; logging.RequestHeaders.Add("sec-ch-ua"); logging.ResponseHeaders.Add("MyResponseHeader"); logging.MediaTypeOptions.AddText("application/javascript"); logging.RequestBodyLogLimit = 4096; logging.ResponseBodyLogLimit = 4096; logging.CombineLogs = true; >); var app = builder.Build(); if (!app.Environment.IsDevelopment()) < app.UseExceptionHandler("/Error"); >app.UseStaticFiles(); app.UseHttpLogging(); app.Use(async (context, next) => < context.Response.Headers["MyResponseHeader"] = new string[] < "My Response Header Value" >; await next(); >); app.MapGet("/", () => "Hello World!"); app.Run(); 

В предыдущем примере и следующих примерах UseHttpLogging вызывается после UseStaticFiles этого, поэтому ведение журнала HTTP не включено для статических файлов. Чтобы включить ведение журнала HTTP статического файла, вызовите перед UseStaticFiles вызовом UseHttpLogging .

LoggingFields

HttpLoggingOptions.LoggingFields — это флаг перечисления, который позволяет настроить определенные регистрируемые части запроса и ответа. HttpLoggingOptions.LoggingFields по умолчанию использует RequestPropertiesAndHeaders | ResponsePropertiesAndHeaders.

RequestHeaders и ResponseHeaders .

RequestHeaders и ResponseHeaders представляют собой наборы заголовков HTTP, которые регистрируются. Значения заголовков регистрируются только для имен заголовков, которые находятся в этих коллекциях. Следующий код добавляется sec-ch-ua в RequestHeadersжурнал, поэтому значение заголовка sec-ch-ua регистрируется. И он добавляется MyResponseHeader в ResponseHeadersжурнал, поэтому значение заголовка MyResponseHeader регистрируется. Если эти строки удалены, значения этих заголовков являются [Redacted] .

using Microsoft.AspNetCore.HttpLogging; var builder = WebApplication.CreateBuilder(args); builder.Services.AddHttpLogging(logging => < logging.LoggingFields = HttpLoggingFields.All; logging.RequestHeaders.Add("sec-ch-ua"); logging.ResponseHeaders.Add("MyResponseHeader"); logging.MediaTypeOptions.AddText("application/javascript"); logging.RequestBodyLogLimit = 4096; logging.ResponseBodyLogLimit = 4096; logging.CombineLogs = true; >); var app = builder.Build(); if (!app.Environment.IsDevelopment()) < app.UseExceptionHandler("/Error"); >app.UseStaticFiles(); app.UseHttpLogging(); app.Use(async (context, next) => < context.Response.Headers["MyResponseHeader"] = new string[] < "My Response Header Value" >; await next(); >); app.MapGet("/", () => "Hello World!"); app.Run(); 

MediaTypeOptions

MediaTypeOptions предоставляет конфигурацию для выбора кодировки, используемой для конкретного типа носителя.

using Microsoft.AspNetCore.HttpLogging; var builder = WebApplication.CreateBuilder(args); builder.Services.AddHttpLogging(logging => < logging.LoggingFields = HttpLoggingFields.All; logging.RequestHeaders.Add("sec-ch-ua"); logging.ResponseHeaders.Add("MyResponseHeader"); logging.MediaTypeOptions.AddText("application/javascript"); logging.RequestBodyLogLimit = 4096; logging.ResponseBodyLogLimit = 4096; logging.CombineLogs = true; >); var app = builder.Build(); if (!app.Environment.IsDevelopment()) < app.UseExceptionHandler("/Error"); >app.UseStaticFiles(); app.UseHttpLogging(); app.Use(async (context, next) => < context.Response.Headers["MyResponseHeader"] = new string[] < "My Response Header Value" >; await next(); >); app.MapGet("/", () => "Hello World!"); app.Run(); 

Этот подход также можно использовать для включения ведения журнала для данных, которые не регистрируются по умолчанию (например, данные формы, которые могут иметь тип носителя, application/x-www-form-urlencoded например или multipart/form-data ).

Методы MediaTypeOptions

RequestBodyLogLimit и ResponseBodyLogLimit .

  • RequestBodyLogLimit
  • ResponseBodyLogLimit
using Microsoft.AspNetCore.HttpLogging; var builder = WebApplication.CreateBuilder(args); builder.Services.AddHttpLogging(logging => < logging.LoggingFields = HttpLoggingFields.All; logging.RequestHeaders.Add("sec-ch-ua"); logging.ResponseHeaders.Add("MyResponseHeader"); logging.MediaTypeOptions.AddText("application/javascript"); logging.RequestBodyLogLimit = 4096; logging.ResponseBodyLogLimit = 4096; logging.CombineLogs = true; >); var app = builder.Build(); if (!app.Environment.IsDevelopment()) < app.UseExceptionHandler("/Error"); >app.UseStaticFiles(); app.UseHttpLogging(); app.Use(async (context, next) => < context.Response.Headers["MyResponseHeader"] = new string[] < "My Response Header Value" >; await next(); >); app.MapGet("/", () => "Hello World!"); app.Run(); 

CombineLogs

Параметр CombineLogs настройки true ПО промежуточного слоя для консолидации всех включенных журналов запроса и ответа в один журнал в конце. К ним относятся запрос, текст запроса, ответ, текст ответа и длительность.

using Microsoft.AspNetCore.HttpLogging; var builder = WebApplication.CreateBuilder(args); builder.Services.AddHttpLogging(logging => < logging.LoggingFields = HttpLoggingFields.All; logging.RequestHeaders.Add("sec-ch-ua"); logging.ResponseHeaders.Add("MyResponseHeader"); logging.MediaTypeOptions.AddText("application/javascript"); logging.RequestBodyLogLimit = 4096; logging.ResponseBodyLogLimit = 4096; logging.CombineLogs = true; >); var app = builder.Build(); if (!app.Environment.IsDevelopment()) < app.UseExceptionHandler("/Error"); >app.UseStaticFiles(); app.UseHttpLogging(); app.Use(async (context, next) => < context.Response.Headers["MyResponseHeader"] = new string[] < "My Response Header Value" >; await next(); >); app.MapGet("/", () => "Hello World!"); app.Run(); 

Конфигурация для конкретной конечной точки

Для конфигурации для конкретной конечной точки в минимальных приложениях WithHttpLogging API доступен метод расширения. В следующем примере показано, как настроить ведение журнала HTTP для одной конечной точки:

app.MapGet("/response", () => "Hello World! (logging response)") .WithHttpLogging(HttpLoggingFields.ResponsePropertiesAndHeaders); 

Для конфигурации для конкретной конечной точки в приложениях, использующих контроллеры, [HttpLogging] атрибут доступен. Атрибут также можно использовать в минимальных приложениях API, как показано в следующем примере:

app.MapGet("/duration", [HttpLogging(loggingFields: HttpLoggingFields.Duration)] () => "Hello World! (logging duration)"); 

IHttpLoggingInterceptor

IHttpLoggingInterceptor — это интерфейс для службы, которая может быть реализована для обработки запросов и обратных вызовов для каждого ответа для настройки сведений, которые регистрируются в журнале. Все параметры журнала, относящиеся к конечной точке, применяются сначала и затем можно переопределить в этих обратных вызовах. Реализация может:

  • Проверьте запрос или ответ.
  • Включите или отключите любой HttpLoggingFields.
  • Измените объем регистра запроса или ответа.
  • Добавьте настраиваемые поля в журналы.

В следующем примере показано, как зарегистрировать реализацию IHttpLoggingInterceptor :

var builder = WebApplication.CreateBuilder(args); builder.Services.AddHttpLogging(logging => < logging.LoggingFields = HttpLoggingFields.Duration; >); builder.Services.AddHttpLoggingInterceptor(); 

В следующем примере показана IHttpLoggingInterceptor реализация:

  • Проверяет метод запроса и отключает ведение журнала для запросов POST.
  • Для запросов, отличных от POST:
    • Редактирует путь запроса, заголовки запросов и заголовки ответа.
    • Добавляет настраиваемые поля и значения полей в журналы запросов и ответов.
    using Microsoft.AspNetCore.HttpLogging; namespace HttpLoggingSample; internal sealed class SampleHttpLoggingInterceptor : IHttpLoggingInterceptor < public ValueTask OnRequestAsync(HttpLoggingInterceptorContext logContext) < if (logContext.HttpContext.Request.Method == "POST") < // Don't log anything if the request is a POST. logContext.LoggingFields = HttpLoggingFields.None; >// Don't enrich if we're not going to log any part of the request. if (!logContext.IsAnyEnabled(HttpLoggingFields.Request)) < return default; >if (logContext.TryDisable(HttpLoggingFields.RequestPath)) < RedactPath(logContext); >if (logContext.TryDisable(HttpLoggingFields.RequestHeaders)) < RedactRequestHeaders(logContext); >EnrichRequest(logContext); return default; > public ValueTask OnResponseAsync(HttpLoggingInterceptorContext logContext) < // Don't enrich if we're not going to log any part of the response if (!logContext.IsAnyEnabled(HttpLoggingFields.Response)) < return default; >if (logContext.TryDisable(HttpLoggingFields.ResponseHeaders)) < RedactResponseHeaders(logContext); >EnrichResponse(logContext); return default; > private void RedactPath(HttpLoggingInterceptorContext logContext) < logContext.AddParameter(nameof(logContext.HttpContext.Request.Path), "RedactedPath"); >private void RedactRequestHeaders(HttpLoggingInterceptorContext logContext) < foreach (var header in logContext.HttpContext.Request.Headers) < logContext.AddParameter(header.Key, "RedactedHeader"); >> private void EnrichRequest(HttpLoggingInterceptorContext logContext) < logContext.AddParameter("RequestEnrichment", "Stuff"); >private void RedactResponseHeaders(HttpLoggingInterceptorContext logContext) < foreach (var header in logContext.HttpContext.Response.Headers) < logContext.AddParameter(header.Key, "RedactedHeader"); >> private void EnrichResponse(HttpLoggingInterceptorContext logContext) < logContext.AddParameter("ResponseEnrichment", "Stuff"); >> 

    При использовании этого перехватчика запрос POST не создает журналы, даже если для журнала HTTP настроено ведение журнала HttpLoggingFields.All . Запрос GET создает журналы, аналогичные следующему примеру:

    info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[1] Request: Path: RedactedPath Accept: RedactedHeader Host: RedactedHeader User-Agent: RedactedHeader Accept-Encoding: RedactedHeader Accept-Language: RedactedHeader Upgrade-Insecure-Requests: RedactedHeader sec-ch-ua: RedactedHeader sec-ch-ua-mobile: RedactedHeader sec-ch-ua-platform: RedactedHeader sec-fetch-site: RedactedHeader sec-fetch-mode: RedactedHeader sec-fetch-user: RedactedHeader sec-fetch-dest: RedactedHeader RequestEnrichment: Stuff Protocol: HTTP/2 Method: GET Scheme: https info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[2] Response: Content-Type: RedactedHeader MyResponseHeader: RedactedHeader ResponseEnrichment: Stuff StatusCode: 200 info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[4] ResponseBody: Hello World! info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[8] Duration: 2.2778ms 

    Порядок настройки ведения журнала приоритета

    В следующем списке показано порядок приоритета для конфигурации ведения журнала:

    1. Глобальная конфигурация из HttpLoggingOptions, заданная путем вызова AddHttpLogging.
    2. Конфигурация для конкретной конечной точки из атрибута [HttpLogging] или WithHttpLogging метода расширения переопределяет глобальную конфигурацию.
    3. IHttpLoggingInterceptor вызывается с результатами и может дополнительно изменять конфигурацию для каждого запроса.

    Ведение журнала HTTP реализуется с помощью ПО промежуточного слоя, которое регистрирует сведения о входящих HTTP-запросах и ответах. Ведение журнала HTTP предоставляет журналы со следующими сведениями:

    • HTTP-запросы;
    • Общие свойства
    • Заголовки
    • Текст
    • HTTP-ответы.

    Ведение журнала HTTP можно использовать в нескольких сценариях:

    • запись сведений о входящих запросах и ответах;
    • фильтрация регистрируемых частей запросов и ответов;
    • фильтрация регистрируемых заголовков.

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

    В ходе ведения журнала HTTP могут записываться личные сведения. Примите во внимание возможные риски и не записывайте конфиденциальную информацию.

    Включение ведения журнала HTTP

    Ведение журнала HTTP включается с использованием UseHttpLogging для добавления соответствующего ПО промежуточного слоя.

    var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); app.UseHttpLogging(); if (!app.Environment.IsDevelopment()) < app.UseExceptionHandler("/Error"); >app.UseStaticFiles(); app.MapGet("/", () => "Hello World!"); app.Run(); 

    По умолчанию в ходе ведения журнала HTTP в журнал записываются общие свойства, такие как путь, код состояния и заголовки для запросов и ответов. Добавьте следующую строку в файл appsettings.Development.json на уровне «LogLevel»: < , чтобы отображались журналы HTTP:

     "Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware": "Information" 

    Выходные данные записываются в журнал как одно сообщение в LogLevel.Information .

    Sample request output

    Параметры ведения журнала HTTP

    Чтобы настроить ПО промежуточного слоя для ведения журнала HTTP, вызовите AddHttpLogging в Program.cs .

    using Microsoft.AspNetCore.HttpLogging; var builder = WebApplication.CreateBuilder(args); builder.Services.AddHttpLogging(logging => < logging.LoggingFields = HttpLoggingFields.All; logging.RequestHeaders.Add("sec-ch-ua"); logging.ResponseHeaders.Add("MyResponseHeader"); logging.MediaTypeOptions.AddText("application/javascript"); logging.RequestBodyLogLimit = 4096; logging.ResponseBodyLogLimit = 4096; >); var app = builder.Build(); if (!app.Environment.IsDevelopment()) < app.UseExceptionHandler("/Error"); >app.UseStaticFiles(); app.UseHttpLogging(); app.Use(async (context, next) => < context.Response.Headers["MyResponseHeader"] = new string[] < "My Response Header Value" >; await next(); >); app.MapGet("/", () => "Hello World!"); app.Run(); 

    В предыдущем примере и следующих примерах UseHttpLogging вызывается после UseStaticFiles этого, поэтому ведение журнала HTTP не включено для статического файла. Чтобы включить ведение журнала HTTP статического файла, вызовите перед UseStaticFiles вызовом UseHttpLogging .

    LoggingFields

    HttpLoggingOptions.LoggingFields — это флаг перечисления, который позволяет настроить определенные регистрируемые части запроса и ответа. HttpLoggingOptions.LoggingFields по умолчанию использует RequestPropertiesAndHeaders | ResponsePropertiesAndHeaders.

    RequestHeaders

    Headers — это набор заголовков HTTP-запросов, которые разрешено регистрировать. Значения заголовков регистрируются только для имен заголовков в этой коллекции. Следующий код регистрирует заголовок «sec-ch-ua» запроса. Если удалить logging.RequestHeaders.Add(«sec-ch-ua»); , значение заголовка запроса «sec-ch-ua» исключается из записи. Следующий выделенный код вызывает HttpLoggingOptions.RequestHeaders и HttpLoggingOptions.ResponseHeaders :

    using Microsoft.AspNetCore.HttpLogging; var builder = WebApplication.CreateBuilder(args); builder.Services.AddHttpLogging(logging => < logging.LoggingFields = HttpLoggingFields.All; logging.RequestHeaders.Add("sec-ch-ua"); logging.ResponseHeaders.Add("MyResponseHeader"); logging.MediaTypeOptions.AddText("application/javascript"); logging.RequestBodyLogLimit = 4096; logging.ResponseBodyLogLimit = 4096; >); var app = builder.Build(); if (!app.Environment.IsDevelopment()) < app.UseExceptionHandler("/Error"); >app.UseStaticFiles(); app.UseHttpLogging(); app.Use(async (context, next) => < context.Response.Headers["MyResponseHeader"] = new string[] < "My Response Header Value" >; await next(); >); app.MapGet("/", () => "Hello World!"); app.Run(); 

    MediaTypeOptions

    MediaTypeOptions предоставляет конфигурацию для выбора кодировки, используемой для конкретного типа носителя.

    using Microsoft.AspNetCore.HttpLogging; var builder = WebApplication.CreateBuilder(args); builder.Services.AddHttpLogging(logging => < logging.LoggingFields = HttpLoggingFields.All; logging.RequestHeaders.Add("sec-ch-ua"); logging.ResponseHeaders.Add("MyResponseHeader"); logging.MediaTypeOptions.AddText("application/javascript"); logging.RequestBodyLogLimit = 4096; logging.ResponseBodyLogLimit = 4096; >); var app = builder.Build(); if (!app.Environment.IsDevelopment()) < app.UseExceptionHandler("/Error"); >app.UseStaticFiles(); app.UseHttpLogging(); app.Use(async (context, next) => < context.Response.Headers["MyResponseHeader"] = new string[] < "My Response Header Value" >; await next(); >); app.MapGet("/", () => "Hello World!"); app.Run(); 

    Этот подход также можно использовать для включения ведения журнала для данных, которые не регистрируются по умолчанию (например, данные формы, которые могут иметь тип носителя, например application/x-www-form-urlencoded или multipart/form-data ).

    Методы MediaTypeOptions

    RequestBodyLogLimit и ResponseBodyLogLimit .

    • RequestBodyLogLimit
    • ResponseBodyLogLimit
    using Microsoft.AspNetCore.HttpLogging; var builder = WebApplication.CreateBuilder(args); builder.Services.AddHttpLogging(logging => < logging.LoggingFields = HttpLoggingFields.All; logging.RequestHeaders.Add("sec-ch-ua"); logging.ResponseHeaders.Add("MyResponseHeader"); logging.MediaTypeOptions.AddText("application/javascript"); logging.RequestBodyLogLimit = 4096; logging.ResponseBodyLogLimit = 4096; >); var app = builder.Build(); if (!app.Environment.IsDevelopment()) < app.UseExceptionHandler("/Error"); >app.UseStaticFiles(); app.UseHttpLogging(); app.Use(async (context, next) => < context.Response.Headers["MyResponseHeader"] = new string[] < "My Response Header Value" >; await next(); >); app.MapGet("/", () => "Hello World!"); app.Run(); 

    Совместная работа с нами на GitHub

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

    Не могу сделать запрос через fetch на другой сайт

    в консоли выдаёт Access to fetch at ‘https://kladr-api.ru/api.php?oneString=true&withParent=true&limit=10&query=%D0%BA%D0%B8%D1%80&_=1633499111351’ from origin ‘http://49.gidpokzn03.beget.tech’ has been blocked by CORS policy: Response to preflight request doesn’t pass access control check: No ‘Access-Control-Allow-Origin’ header is present on the requested resource. If an opaque response serves your needs, set the request’s mode to ‘no-cors’ to fetch the resource with CORS disabled.

    При этом их библиотека работает. Вот какие заголовки отправляет https://i.imgur.com/n8xUINE.png

    Вроде у меня те же заголовки. Как можно пофиксить? Их библиотеку не хочу, хочу свою, с блекджеком, fetch и es6

    el-d ★★
    06.10.21 09:00:44 MSK

    Так CORS должен сервер разрешить.

    neversleep ★★
    ( 06.10.21 09:13:17 MSK )

    Присмотрись к параметру callback

    cobold ★★★★★
    ( 06.10.21 09:15:57 MSK )

    В браузерах запрещены кросс-доменные запросы. Кроме случаев когда сервер отдает заголовок типа Access-Control-Allow-Origin: * (или список доменов с которых можно).

    Если сделаешь opaque request, то не сможешь в содержимое залезть. Его можно будет только юзать как кота в мешке — например воткнуть в страницу картинку, не зная что внутри (если ничего не путаю).

    Так что обломись.

    Vit ★★★★★
    ( 06.10.21 09:17:51 MSK )
    Ответ на: комментарий от Vit 06.10.21 09:17:51 MSK

    а их библиотека почему работает?

    el-d ★★
    ( 06.10.21 09:19:19 MSK ) автор топика
    Ответ на: комментарий от el-d 06.10.21 09:19:19 MSK

    Без понятия, не вникал. Может она на разрешенном домене хостится, или делает серверный запрос, а не из браузера.

    Мне неохота разбираться. Я написал ровно то, про что тебе вываливают ошибку, и что в этой ошибке пишут. Дальше думаю сам справишься. Но чуда не жди, ограничения CORS в браузере обойти нельзя. Только если сервер явно укажет, что к его данным может лезть кто угодно.

    Vit ★★★★★
    ( 06.10.21 09:23:18 MSK )
    Ответ на: комментарий от Vit 06.10.21 09:23:18 MSK

    в общем сделал костыль. обращаюсь к php файлу, а он уже делает запрос к api

    el-d ★★
    ( 06.10.21 09:50:19 MSK ) автор топика
    Ответ на: комментарий от el-d 06.10.21 09:50:19 MSK

    Ну как-то так все и поступают. Только ограничь по каким-нибудь признакам, по возможности, чтобы кулхацкеры не могли твой скрипт юзать как прокси для любых запросов.

    Vit ★★★★★
    ( 06.10.21 11:26:43 MSK )
    Ответ на: комментарий от el-d 06.10.21 09:19:19 MSK

    а их библиотека почему работает?

    Их библиотека (плагин для jQuery) не посылает ajax запросы. Она использует jsonp-запросы.

    JSONP — это когда ты в get запросе передаешь дополнительный параметр callback, с названием функции определенной на твоем сайте. А их сервер отдает в ответ не голый json, а javascript-код — json завернутый в вызов этой функции.

    То есть ответ будет не а fn()

    Ну и в итоге, ты просто посылаешь такие запросы не фетчем, а динамическим встраиванием в свою страницу.

    let src = 'https://kladr-api.ru/api.php?oneString=true&withParent=true&limit=10&query=%D0%BA%D0%B8%D1%80&_=1633499111351&callback=cb' function cb(data) < console.dir(data) >document.body.append( Object.assign( document.createElement('script'), < src >) ) 

    javascript ★
    ( 06.10.21 11:57:22 MSK )
    Последнее исправление: javascript 06.10.21 12:17:21 MSK (всего исправлений: 6)

    Ответ на: комментарий от Vit 06.10.21 09:17:51 MSK

    Его можно будет только юзать как кота в мешке — например воткнуть в страницу картинку, не зная что внутри (если ничего не путаю)

    Вроде как можно использовать для кэша через Service Workers.

    theNamelessOne ★★★★★
    ( 06.10.21 12:03:34 MSK )
    Ответ на: комментарий от theNamelessOne 06.10.21 12:03:34 MSK

    Ну тоже вариант. Короче, там очень ограниченный и специфический способ использования, почти никуда не годный.

    Vit ★★★★★
    ( 06.10.21 12:09:33 MSK )
    Ответ на: комментарий от el-d 06.10.21 09:50:19 MSK

    в общем сделал костыль. обращаюсь к php файлу, а он уже делает запрос к api

    а что CORS разрешить это слишком сложно чтоли?

    drsm ★★
    ( 06.10.21 18:17:35 MSK )
    Ответ на: комментарий от drsm 06.10.21 18:17:35 MSK

    а что CORS разрешить это слишком сложно чтоли?

    На чужом сервере довольно сложно.

    ddidwyll ★★★★
    ( 06.10.21 19:31:36 MSK )
    Ответ на: комментарий от ddidwyll 06.10.21 19:31:36 MSK

    Чтобы придти к своей цели, нужно идти.

    Sec-Fetch-Mode

    The Sec-Fetch-Mode fetch metadata request header indicates the mode of the request.

    Broadly speaking, this allows a server to distinguish between: requests originating from a user navigating between HTML pages, and requests to load images and other resources. For example, this header would contain navigate for top level navigation requests, while no-cors is used for loading an image.

    Header type Fetch Metadata Request Header
    Forbidden header name yes (prefix Sec- )
    CORS-safelisted request header no

    Syntax

    Sec-Fetch-Mode: cors Sec-Fetch-Mode: navigate Sec-Fetch-Mode: no-cors Sec-Fetch-Mode: same-origin Sec-Fetch-Mode: websocket 

    Servers should ignore this header if it contains any other value.

    Directives

    Note: These directives correspond to the values in Request.mode .

    The request is a CORS protocol request.

    The request is initiated by navigation between HTML documents.

    The request is a no-cors request (see Request.mode ).

    The request is made from the same origin as the resource that is being requested.

    The request is being made to establish a WebSocket connection.

    Examples

    If a user clicks on a page link to another page on the same origin, the resulting request would have the following headers (note that the mode is navigate ):

    Sec-Fetch-Dest: document Sec-Fetch-Mode: navigate Sec-Fetch-Site: same-origin Sec-Fetch-User: ?1 
    Sec-Fetch-Dest: image Sec-Fetch-Mode: no-cors Sec-Fetch-Site: cross-site 

    Specifications

    Specification
    Fetch Metadata Request Headers
    # sec-fetch-mode-header

    Browser compatibility

    BCD tables only load in the browser

    See also

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

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