Skip to content

Commit 0456c1e

Browse files
authored
Add ChildSrc CSP directive (#259)
* Add ChildSrc CSP directive * Update public API
1 parent 08816d8 commit 0456c1e

File tree

5 files changed

+41
-0
lines changed

5 files changed

+41
-0
lines changed
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
namespace NetEscapades.AspNetCore.SecurityHeaders.Headers.ContentSecurityPolicy;
2+
3+
/// <summary>
4+
/// The <c>child</c> directive specifies valid sources for web workers and
5+
/// nested browsing contexts loaded using elements such as &lt;frame&gt; and &lt;iframe&gt;
6+
/// For workers, non-compliant requests are treated as fatal network errors by the user agent.
7+
/// </summary>
8+
public class ChildSourceDirectiveBuilder : CspDirectiveBuilder
9+
{
10+
/// <summary>
11+
/// Initializes a new instance of the <see cref="ChildSourceDirectiveBuilder"/> class.
12+
/// </summary>
13+
public ChildSourceDirectiveBuilder() : base("child-src")
14+
{
15+
}
16+
}

src/NetEscapades.AspNetCore.SecurityHeaders/Headers/ContentSecurityPolicy/CspBuilder.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,14 @@ public class CspBuilder
2626
/// <returns>A configured <see cref="DefaultSourceDirectiveBuilder"/></returns>
2727
public DefaultSourceDirectiveBuilder AddDefaultSrc() => AddDirective(new DefaultSourceDirectiveBuilder());
2828

29+
/// <summary>
30+
/// The <c>child</c> directive specifies valid sources for web workers and
31+
/// nested browsing contexts loaded using elements such as &lt;frame&gt; and &lt;iframe&gt;
32+
/// For workers, non-compliant requests are treated as fatal network errors by the user agent.
33+
/// </summary>
34+
/// <returns>A configured <see cref="ChildSourceDirectiveBuilder"/></returns>
35+
public ChildSourceDirectiveBuilder AddChildSrc() => AddDirective(new ChildSourceDirectiveBuilder());
36+
2937
/// <summary>
3038
/// The <c>connect-src</c> directive restricts the URLs which can be loaded using script interfaces
3139
/// The APIs that are restricted are: &lt;a&gt; ping, Fetch, XMLHttpRequest, WebSocket, and EventSource.

test/NetEscapades.AspNetCore.SecurityHeaders.Test/CspBuilderTests.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,15 @@ public void Build_AddDefaultSrc_WhenAddsMultipleValueEnumerable_ReturnsAllValues
4949
result.ConstantValue.Should().Be("default-src 'self' blob: data: http://testUrl.com http://testUrl2.com");
5050
}
5151

52+
[Test]
53+
public void Build_AddChildSrc_WhenAddsMultipleValue_ReturnsAllValues()
54+
{
55+
var builder = new CspBuilder();
56+
builder.AddChildSrc().Self().Blob().Data().From("http://testUrl.com");
57+
var result = builder.Build();
58+
result.ConstantValue.Should().Be("child-src 'self' blob: data: http://testUrl.com");
59+
}
60+
5261
[Test]
5362
public void Build_AddConnectSrc_WhenAddsMultipleValue_ReturnsAllValues()
5463
{
@@ -384,6 +393,7 @@ public void Build_ForAllHeaders_WhenNotUsingNonce_HasPerRequestValuesReturnsFals
384393
{
385394
var builder = new CspBuilder();
386395
builder.AddDefaultSrc().Self().Blob().Data().From("http://testUrl.com");
396+
builder.AddChildSrc().Self().Blob().Data().From("http://testUrl.com");
387397
builder.AddConnectSrc().Self().Blob().Data().From("http://testUrl.com");
388398
builder.AddFontSrc().Self().Blob().Data().From("http://testUrl.com");
389399
builder.AddObjectSrc().Self().Blob().Data().From("http://testUrl.com");
@@ -407,6 +417,7 @@ public void Build_ForAllHeaders_WhenUsingNonce_HasPerRequestValuesReturnsTrue()
407417
{
408418
var builder = new CspBuilder();
409419
builder.AddDefaultSrc().Self().Blob().Data().From("http://testUrl.com");
420+
builder.AddChildSrc().Self().Blob().Data().From("http://testUrl.com");
410421
builder.AddConnectSrc().Self().Blob().Data().From("http://testUrl.com");
411422
builder.AddFontSrc().Self().Blob().Data().From("http://testUrl.com");
412423
builder.AddObjectSrc().Self().Blob().Data().From("http://testUrl.com");

test/NetEscapades.AspNetCore.SecurityHeaders.Test/PublicApiTest.PublicApiHasNotChanged.verified.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ namespace Microsoft.AspNetCore.Builder
5454
public CspBuilder() { }
5555
public NetEscapades.AspNetCore.SecurityHeaders.Headers.ContentSecurityPolicy.BaseUriDirectiveBuilder AddBaseUri() { }
5656
public NetEscapades.AspNetCore.SecurityHeaders.Headers.ContentSecurityPolicy.BlockAllMixedContentDirectiveBuilder AddBlockAllMixedContent() { }
57+
public NetEscapades.AspNetCore.SecurityHeaders.Headers.ContentSecurityPolicy.ChildSourceDirectiveBuilder AddChildSrc() { }
5758
public NetEscapades.AspNetCore.SecurityHeaders.Headers.ContentSecurityPolicy.ConnectSourceDirectiveBuilder AddConnectSrc() { }
5859
public NetEscapades.AspNetCore.SecurityHeaders.Headers.ContentSecurityPolicy.CustomDirective AddCustomDirective(string directive) { }
5960
public NetEscapades.AspNetCore.SecurityHeaders.Headers.ContentSecurityPolicy.CustomDirective AddCustomDirective(string directive, string value) { }
@@ -301,6 +302,10 @@ namespace NetEscapades.AspNetCore.SecurityHeaders.Headers.ContentSecurityPolicy
301302
{
302303
public BlockAllMixedContentDirectiveBuilder() { }
303304
}
305+
public class ChildSourceDirectiveBuilder : NetEscapades.AspNetCore.SecurityHeaders.Headers.ContentSecurityPolicy.CspDirectiveBuilder
306+
{
307+
public ChildSourceDirectiveBuilder() { }
308+
}
304309
public class ConnectSourceDirectiveBuilder : NetEscapades.AspNetCore.SecurityHeaders.Headers.ContentSecurityPolicy.CspDirectiveBuilder
305310
{
306311
public ConnectSourceDirectiveBuilder() { }

test/RazorWebSite/Startup.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ public void Configure(IApplicationBuilder app, IHostingEnvironment env)
3535
{
3636
builder.AddUpgradeInsecureRequests();
3737
builder.AddDefaultSrc().Self();
38+
builder.AddChildSrc().From("*");
3839
builder.AddConnectSrc().From("*");
3940
builder.AddFontSrc().From("*");
4041
builder.AddFrameAncestors().From("*");

0 commit comments

Comments
 (0)