Completed
Push — sentry-feature-csp-inline-scri... ( e5f5b4 )
by Markus
69:20
created

ContentSecurityPolicy::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 4
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 0
1
<?php
2
3
4
namespace ZendSentry\Http\Header;
5
6
/**
7
 * Content Security Policy Header
8
 *
9
 * @link http://www.w3.org/TR/CSP/
10
 */
11
class ContentSecurityPolicy extends \Zend\Http\Header\ContentSecurityPolicy
12
{
13
    public const KEY_CSP = 'csp';
14
15
    public const DIRECTIVE_DEFAULT_SRC     = 'default-src';
16
    public const DIRECTIVE_SCRIPT_SRC      = 'script-src';
17
    public const DIRECTIVE_STYLE_SRC       = 'style-src';
18
    public const DIRECTIVE_FONT_SRC        = 'font-src';
19
    public const DIRECTIVE_IMG_SRC         = 'img-src';
20
    public const DIRECTIVE_FRAME_ANCESTORS = 'frame-ancestors';
21
    public const DIRECTIVE_BASE_URI        = 'base-uri';
22
    public const DIRECTIVE_FORM_ACTION     = 'form-action';
23
    public const DIRECTIVE_CONNECT_SRC     = 'connect-src';
24
    public const DIRECTIVE_REPORT_URI      = 'report-uri';
25
26
    public const SOURCE_ALL  = '*';
27
    public const SOURCE_SELF = "'self'";
28
    public const SOURCE_DATA = 'data:';
29
30
    // These UNSAFE directives should be avoided
31
    public const SOURCE_UNSAFE_INLINE = "'unsafe-inline'";
32
    public const SOURCE_UNSAFE_EVAL   = "'unsafe-eval'";
33
34
    /**
35
     * @var string
36
     */
37
    private static $nonce;
38
39
    /**
40
     * ContentSecurityPolicy constructor.*
41
     */
42
    public function __construct()
43
    {
44
        $this->init();
45
    }
46
47
    /**
48
     * Returns a new nonce for each request.
49
     *
50
     * @return string
51
     */
52
    public static function getNonce(): string
53
    {
54
        if (self::$nonce === null) {
55
            self::$nonce = base64_encode(random_bytes(20));
56
        }
57
        return self::$nonce;
58
    }
59
60
    /**
61
     * Set the needed CSP directives for ZendSentry
62
     */
63
    public function init(): void
64
    {
65
        $csp = [
66
            self::DIRECTIVE_SCRIPT_SRC => [
67
                'cdn.ravenjs.com',
68
                sprintf("'nonce-%s'", self::getNonce()),
69
            ]
70
        ];
71
72
        foreach ($csp as $directive => $sources) {
73
            $this->setDirective($directive, $sources);
74
        }
75
    }
76
}