Download the PHP package spatie/laravel-csp without Composer
On this page you can find all versions of the php package spatie/laravel-csp. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Download spatie/laravel-csp
More information about spatie/laravel-csp
Files in spatie/laravel-csp
Package laravel-csp
Short Description Add CSP headers to the responses of a Laravel app
License MIT
Homepage https://github.com/spatie/laravel-csp
Informations about the package laravel-csp
Set content security policy headers in a Laravel app
By default, all scripts on a webpage are allowed to send and fetch data to any site they want. This can be a security problem. Imagine one of your JavaScript dependencies sends all keystrokes, including passwords, to a third party website.
It's very easy for someone to hide this malicious behaviour, making it nearly impossible for you to detect it (unless you manually read all the JavaScript code on your site). For a better idea of why you really need to set content security policy headers, read this excellent blog post by David Gilbertson.
Setting Content Security Policy headers helps solve this problem. These headers dictate which sites your site is allowed to contact. This package makes it easy for you to set the right headers.
This readme does not aim to fully explain all the possible usages of CSP and its directives. We highly recommend that you read Mozilla's documentation on the Content Security Policy before using this package. Another good resource to learn about CSP, is this edition of the Larasec newsletter by Stephen Rees-Carter.
Support us
We invest a lot of resources into creating best in class open source packages. You can support us by buying one of our paid products.
We highly appreciate you sending us a postcard from your hometown, mentioning which of our package(s) you are using. You'll find our address on our contact page. We publish all received postcards on our virtual postcard wall.
Installation
You can install the package via composer:
You can publish the config-file with:
This is the contents of the file which will be published at config/csp.php
:
You can add CSP headers to all responses of your app by registering Spatie\Csp\AddCspHeaders::class
in the http kernel.
Alternatively you can apply the middleware on the route or route group level.
You can also pass a policy class as a parameter to the middleware:
The given policy will override the one configured in the config file for that specific route or group of routes.
Usage
This package allows you to define CSP policies. A CSP policy determines which CSP directives will be set in the headers of the response.
An example of a CSP directive is script-src
. If this has the value 'self' www.google.com
then your site can only load scripts from it's own domain or www.google.com
. You'll find a list with all CSP directives at Mozilla's excellent developer site.
According to the spec certain directive values need to be surrounded by quotes. Examples of this are 'self'
, 'none'
and 'unsafe-inline'
. When using addDirective
function you're not required to surround the directive value with quotes manually. We will automatically add quotes. Script/style hashes, as well, will be auto-detected and surrounded with quotes.
You can add multiple policy options in the same directive giving an array as second parameter to addDirective
or a single string in which every option is separated by one or more spaces.
There are also a few cases where you don't have to or don't need to specify a value, eg. upgrade-insecure-requests, block-all-mixed-content, ... In this case you can use the following value:
This will output a CSP like this:
Creating policies
In the policy
key of the csp
config file is set to \Spatie\Csp\Policies\Basic::class
by default. This class allows your site to only use images, scripts, form actions of your own site. This is how the class looks:
You can allow fetching scripts from www.google.com
by extending this class:
Don't forget to set the policy
key in the csp
config file to the class name of your policy (in this case it would be App\Support\MyCustomPolicy
).
Using inline scripts and styles
When using CSP you must specifically allow the use of inline scripts or styles. The recommended way of doing that with this package is to use a nonce
. A nonce is a number that is unique per request. The nonce must be specified in the CSP headers and in an attribute on the html tag. This way an attacker has no way of injecting malicious scripts or styles.
First you must add the nonce to the right directives in your policy:
Next you must add the nonce to the html:
There are few other options to use inline styles and scripts. Take a look at the CSP docs on the Mozilla developer site to know more.
Integration with Vite
When building assets, Laravel's Vite plugin can generate a nonce that you can retrieve with Vite::cspNonce
. You can use in your own NonceGenerator
.
Don't forget to specify the fully qualified class name of your NonceGenerator
in the nonce_generator
key of the csp
config file.
Alternatively, you can instruct Vite to use a specific value that it should use as nonce.
Outputting a CSP Policy as a meta tag
In rare circumstances, a large site may have so many external connections that the CSP header actually exceeds the max header size. Thankfully, the CSP specification allows for outputting information as a meta tag in the head of a webpage.
To support this use case, this package provides a @cspMetaTag
blade directive that you may place in the <head>
of your site.
You should be aware of the following implementation details when using the meta tag blade directive:
- Note that you should manually pass the fully qualified class name of the policy we want to output a meta tag for.
The
csp.policy
andcsp.report_only_policy
config options have no effect here. - Because blade files don't have access to the
Response
object, theshouldBeApplied
method will have no effect. If you have declared the@cspMetaTag
directive and thecsp.enabled
config option is set to true, the meta tag will be output regardless. - Any configuration (such as setting your policy to report only) should be done in the
configure
method of the policy, rather than relying on settings in thecsp
config file. Thecsp.report_uri
option will be respected, so there is no need to configure that manually.
Reporting CSP errors
In the browser
Instead of outright blocking all violations, you can put a policy in report only mode. In this case all requests will be made, but all violations will display in your favourite browser's console.
To put a policy in report only mode just call reportOnly()
in the configure()
function of a report:
To an external url
Any violations against the policy can be reported to a given url. You can set that url in the report_uri
key of the csp
config file. A great service that is specifically built for handling these violation reports is http://report-uri.io/.
Using multiple policies
To test changes to your CSP policy you can specify a second policy in the report_only_policy
in the csp
config key. The policy specified in policy
will be enforced, the one in report_only_policy
will not. This is great for testing a new policy or changes to existing CSP policy without breaking anything.
Using whoops
Laravel comes with whoops, an error handling framework that helps you debug your application with a pretty visualization of exceptions. Whoops uses inline scripts and styles because it can't make any assumptions about the environment it is being used in, so it won't work unless you allow unsafe-inline
for scripts and styles.
One approach to this problem is to check config('app.debug')
when setting your policy. Unfortunately this bears the risk of forgetting to test your code with all CSP rules enabled and having your app break at deployment. Alternatively, you could allow unsafe-inline
only on error pages by adding this to the render
method of your exception handler (usually in app/Exceptions/Handler.php
):
where AppPolicy
is the name of your CSP policy. This also works in every other situation to change the policy at runtime, in which case the singleton registration should be done in a service provider instead of the exception handler.
Note that unsafe-inline
only works if you're not also sending a nonce or a strict-dynamic
directive, so to be able to use this workaround, you have to specify all your inline scripts' and styles' hashes in the CSP header.
Another approach is to overwrite the Spatie\Csp\Policies\Policy::shouldBeApplied()
-function in case Laravel responds with an error:
This approach completely deactivates the CSP and therefore also works if a strict CSP is used.
Testing
You can run all the tests with:
Changelog
Please see CHANGELOG for more information what has changed recently.
Contributing
Please see CONTRIBUTING for details.
Security
If you've found a bug regarding security please mail [email protected] instead of using the issue tracker.
Credits
- Freek Van der Herten
- Thomas Verhelst
- All Contributors
License
The MIT License (MIT). Please see License File for more information.
All versions of laravel-csp with dependencies
illuminate/http Version ^9.0|^10.0|^11.0
illuminate/support Version ^9.0|^10.0|^11.0
spatie/laravel-package-tools Version ^1.11