#asp.net-web-api #asp.net-core-webapi #content-security-policy
Вопрос:
Я кодирую неофициальный api twitter для себя. Затем я отправляю запрос на этот api, используя экран консоли в моем браузере, следующим способом.
function httpGet(theUrl)
{
var xmlHttp = new XMLHttpRequest();
xmlHttp.open( "GET", theUrl, false ); // false for synchronous request
xmlHttp.send( null );
return xmlHttp.responseText;
}
такой
httpGet(https://localhost:44311/WeatherForecast/alienationxs/true);
проблема в том, что когда я делаю это через www.google.com все в порядке, и данные json доходят до меня. но когда я делаю это через twitter.com Я получаю следующую ошибку.
через google.com
мои настройки cors в api
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddCors(options =>
options.AddDefaultPolicy(builder =>
builder.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin())); ;
services.AddMvc();
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "twitterAPI", Version = "v1" });
});
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseSwagger();
app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "twitterAPI v1"));
}
app.UseRouting();
app.UseCors(builder => builder
.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader());
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
все, что я хочу, — это получить доступ к своему api через twitter.com так же, как google.com.
Комментарии:
1. если вы можете подключиться google.com, вы должны убедиться, что этот API twitter может быть доступен в первую очередь
Ответ №1:
- Во-первых, давайте отделим мух от котлет.
- Совместное использование ресурсов между источниками (CORS)-это отдельный уровень безопасности.
- Политика безопасности контента (CSP) — это отдельный уровень безопасности, он применяется до CORS. После прохождения CSP вы можете столкнуться с CORS, если последний из них будет нарушен.
Как вы можете видеть из сообщения об ошибке «… потому что это нарушает следующую директиву Политики безопасности контента …«, вы столкнулись с нарушением CSP, поэтому ваши настройки CORS не имеют значения.
- Что происходит.
Вы заходите twitter.com
на веб-страницу и пытаетесь выполнить запрос на подключение localhost:44311
от имени веб-страницы Twitter. Но веб-страница Twitter защищена CSP, который запрещает такие запросы: обратите внимание на директиву «connect-src», которая регулирует XMLHttpRequest().
На www.google.com
веб-странице нет CSP, поэтому ваш запрос от имени Google выполняется успешно.
Комментарии:
1. Так есть ли какой-нибудь способ обойти это?
2. Ни за что. Обход CSP в Chrome стоит 20 000 долларов в рамках программы вознаграждения за ошибки.
Ответ №2:
API Twitter не поддерживает CORS.
Комментарии:
1. Очистка Twitter противоречит Условиям предоставления услуг. Я удалю тег twitter из вашего поста, так как вы спрашиваете об общей проблеме веб-программирования, а не о Twitter.