ASP.NET Core 에 서 는 어떻게 Csp 레이 블 을 이용 하여 Xss 공격 에 대항 합 니까?

콘 텐 츠 보안 정책(CSP)은 사이트 간 스 크 립 트(XSS)와 데이터 주입 공격 을 포함 하여 특정한 유형의 공격 을 감지 하고 완화 하 는 데 도움 을 줄 수 있 는 추가 보안 층 입 니 다.이 공격 들 은 데이터 에서 사이트 파괴 나 악성 소프트웨어 로 배 포 된 모든 내용 을 훔 치 는 데 사용 된다(깊이CSP)
쉽게 말 하면 CSP 는 웹 페이지 에서 어떤 자원 을 불 러 올 수 있 는 지 를 제어 하 는 방식 이다.예 를 들 어 페이지 는 자바 스 크 립 트,CSS,이미지 자원 을 불 러 올 수 있 도록 명시 할 수 있 습 니 다.크로스 사이트 스 크 립 트(XSS)공격 등 을 방지 하 는 데 도움 이 된다.
HTTPS 를 통 해 불 러 오 는 내용 을 제한 하 는 등 프로 토 콜 을 제한 하 는 데 도 사용 할 수 있다.CSP 는 Content-security-Policy HTTP 응답 에 있 는 레이 블 을 통 해 이 루어 집 니 다.
CSP 를 사용 하려 면 웹 서버 를 설정 해 야 합 니 다Content-Security-PolicyHTTP 레이 블 을 되 돌려 줍 니 다.그러면 이 글 에서 ASP.NET Core 응용 프로그램 에 CSP 를 추가 하려 고 합 니 다.

app.Use(async (ctx, next) =>
  {
  ctx.Response.Headers.Add("Content-Security-Policy",
    "default-src 'self'; report-uri /cspreport");
  await next();
  });
홈/Index 에 cdn 파일 을 도입 하고 프로젝트 를 시작 해서 무슨 일이 일어 날 지 봅 시다!

오 류 를 실행 하고 관찰 합 니 다.페이지 를 불 러 올 때 브 라 우 저 는 원 격 원본 에서 불 러 오 는 것 을 거부 합 니 다.
 
따라서 우 리 는 CSP 를 조직 하여 우리 의 화이트 리스트 를 제어 할 수 있 습 니 다.설정 에 출처 와 내용 을 작성 해 야 합 니 다.다음은 자주 사용 되 는 제한 옵션 입 니 다.
원본:
*:모든 사이트 주 소 를 허용 합 니 다.
'self':제 공 된 페이지 의 원본 을 허용 합 니 다.작은 따옴표 가 필요 하 니 주의 하 세 요.
'none':원본 을 허용 하지 않 습 니 다.작은 따옴표 가 필요 하 니 주의 하 세 요.
Host:지정 한 인터넷 호스트(이름 이나 IP 주소)를 허용 합 니 다.어댑터(별표 문자)는 http:/*.foo.com 과 같은 모든 하위 도 메 인 을 포함 하 는 데 사용 할 수 있 습 니 다.
'unsafe-line':내 연 스 크 립 트 허용
'nonce-[base 64-value]':특정한 nonce 를 가 진 내 연 스 크 립 트(한 번 의 숫자 사용)를 허용 합 니 다.모든 HTTP 요청/응답 에 대해 nonce 를 암호 화하 고 유일 하 게 해 야 합 니 다.
 명령:
script-src:유효한 자 바스 크 립 트 원본 정의
스타일 시트 의 유효한 원본 을 정의 합 니 다.
img-src:올 바른 이미지 원본 정의
connect-src:AJAX 호출 이 가능 한 유효한 원본 을 정의 합 니 다.
font-src:올 바른 글꼴 원본 정의
object-src:정의,요소 의 유효 소스
미디어-src:유효한 오디 오 와 비디오 원본 을 정의 합 니 다.
form-action:HTML
작업 에 사용 할 수 있 는 유효한 원본 을 정의 합 니 다.
default-src:내용 을 불 러 오 는 기본 정책 을 지정 합 니 다.
재 활용 가능 한 미들웨어 에 구축 과 CSP 헤드 를 패키지 하고 추가 할 수 있 습 니 다.다음은 당신 을 입문 시 키 는 예 입 니 다.너 는 필요 에 따라 그것 을 확장 할 수 있다.우선 원본 을 저장 할 클래스 를 만 듭 니 다.

public class CspOptions
 {
  public List<string> Defaults { get; set; } = new List<string>();
  public List<string> Scripts { get; set; } = new List<string>();
  public List<string> Styles { get; set; } = new List<string>();
  public List<string> Images { get; set; } = new List<string>();
  public List<string> Fonts { get; set; } = new List<string>();
  public List<string> Media { get; set; } = new List<string>();
 }
중간 부품 을 개발 하려 면 반드시 구조 기 가 필요 합 니 다.이것 은.net core 를 운영 환경 에 주입 하 는 데 사 용 될 것 입 니 다.

public sealed class CspOptionsBuilder 
 { 
  private readonly CspOptions options = new CspOptions(); 
  
  internal CspOptionsBuilder() { } 
 
  public CspDirectiveBuilder Defaults { get; set; } = new CspDirectiveBuilder(); 
  public CspDirectiveBuilder Scripts { get; set; } = new CspDirectiveBuilder(); 
  public CspDirectiveBuilder Styles { get; set; } = new CspDirectiveBuilder(); 
  public CspDirectiveBuilder Images { get; set; } = new CspDirectiveBuilder(); 
  public CspDirectiveBuilder Fonts { get; set; } = new CspDirectiveBuilder(); 
  public CspDirectiveBuilder Media { get; set; } = new CspDirectiveBuilder(); 
 
  internal CspOptions Build() 
  { 
   this.options.Defaults = this.Defaults.Sources; 
   this.options.Scripts = this.Scripts.Sources; 
   this.options.Styles = this.Styles.Sources; 
   this.options.Images = this.Images.Sources; 
   this.options.Fonts = this.Fonts.Sources; 
   this.options.Media = this.Media.Sources; 
   return this.options; 
  } 
 } 
 
 public sealed class CspDirectiveBuilder 
 { 
  internal CspDirectiveBuilder() { } 
 
  internal List<string> Sources { get; set; } = new List<string>(); 
 
  public CspDirectiveBuilder AllowSelf() => Allow("'self'"); 
  public CspDirectiveBuilder AllowNone() => Allow("none"); 
  public CspDirectiveBuilder AllowAny() => Allow("*"); 
 
  public CspDirectiveBuilder Allow(string source) 
  { 
   this.Sources.Add(source); 
   return this; 
  } 
 }
자,중간 부품 을 만 듭 시다.

namespace XSSDefenses.XSSDefenses.MiddlerWare
{
 public sealed class CspOptionMiddlerWare
 {
  private const string HEADER = "Content-Security-Policy";
  private readonly RequestDelegate next;
  private readonly CspOptions options;

  public CspOptionMiddlerWare(
   RequestDelegate next, CspOptions options)
  {
   this.next = next;
   this.options = options;
  }

  public async Task Invoke(HttpContext context)
  {
   context.Response.Headers.Add(HEADER, GetHeaderValue());
   await this.next(context);
  }

  private string GetHeaderValue()
  {
   var value = "";
   value += GetDirective("default-src", this.options.Defaults);
   value += GetDirective("script-src", this.options.Scripts);
   value += GetDirective("style-src", this.options.Styles);
   value += GetDirective("img-src", this.options.Images);
   value += GetDirective("font-src", this.options.Fonts);
   value += GetDirective("media-src", this.options.Media);
   return value;
  }
  private string GetDirective(string directive, List<string> sources)
   => sources.Count > 0 ? $"{directive} {string.Join(" ", sources)}; " : "";
 }
}
확장 방법 을 설정 합 니 다.

namespace XSSDefenses.XSSDefenses.Extensions
{
 public static class CspMiddlewareExtensions
 {
  public static IApplicationBuilder UseCsp(
    this IApplicationBuilder app, Action<CspOptionsBuilder> builder)
  {
   var newBuilder = new CspOptionsBuilder();
   builder(newBuilder);
 
   var options = newBuilder.Build();
   return app.UseMiddleware<CspOptionMiddlerWare>(options);
  }
 }
}
우 리 는 현재 Startup 클래스 에서 중간 부품 을 설정 할 수 있 습 니 다.

app.UseCsp(builder =>
   {
    builder.Styles.AllowSelf()
    .Allow(@"https://ajax.aspnetcdn.com/");
   });
시작 발견,네트워크 자원 관찰.브 라 우 저 는 로 컬 과 원 격 자원 을 허용 합 니 다.

총결산
이상 은 이 글 의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기