Skip to main content

Secweb is a pack of security middlewares for fastApi and starlette server it includes CSP, HSTS, and many more

Project description

Secweb logo

Secweb helps in setting security headers for FastApi and Starlette



Secweb is the pack of middlewares for setting security headers for fastapi and can also be used for any framework created on starlette it has 14 middlewares for setting headers of your website and also for your api`s

The PermissionsPolicy middleware lies in development branch here

The list of middleware is as follows:

  1. Content Security Policy (CSP)

  1. ExpectCT

  1. Origin Agent Cluster

  1. Referrer Policy

  1. HTTP Strict Transport Security(HSTS)

  1. X-Content-Type-Options

  1. X-DNS-Prefetch-Control

  1. X-Download-Options

  1. X-Frame

  1. X-Permitted-Cross-Domain-Policies

  1. X-XSS-Protection

  1. Cross-Origin-Embedder-Policy

  1. Cross-Origin-Opener-Policy

  1. Cross-Origin-Resource-Policy

Requirements

Installation

pip install Secweb

Usage

The package Secweb can be used in two different ways

  1. To use SecWeb class it includes all the 14 classes together

  1. To use the 14 middleware classes separately

SecWeb class

from Secweb import SecWeb

SecWeb(app=app)  # The app is the ASGIapp required by the starlette to give access to the different methods to the class

The above example uses all the default headers value that are are preset you can change the values by creating the option dict you can also set flags for nonce generation for csp header using the script_nonce=True and style_nonce=True flags

from Secweb import SecWeb

SecWeb(app=app, Option={'referrer': {'Referrer-Policy': 'no-referrer'}}, script_nonce=False, style_nonce=False)

The Option uses 11 keys for calling middleware classes to set the user-defined policies. 3 middleware classes doesn`t take any values.

The values are as follows:

  1. 'csp' for calling ContentSecurityPolicy class to set the user-defined values

  1. 'expectCt' for calling ExpectCt class to set the user-defined values

  1. 'referrer' for calling ReferrerPolicy class to set the user-defined values

  1. 'xdns' for calling XDNSPrefetchControl class to set the user-defined values

  1. 'xcdp' for calling XPermittedCrossDomainPolicies class to set the user-defined values

  1. 'hsts' for calling HSTS class to set the user-defined values

  1. 'xss' for calling xXSSProtection class to set the user-defined values

  1. 'xframe' for calling XFrame class to set the user-defined values

  1. 'coep' for calling CrossOriginEmbedderPolicy class to set the user-defined values

  1. 'coop' for calling CrossOriginOpenerPolicy class to set the user-defined values

  1. 'corp' for calling CrossOriginResourcePolicy class to set the user-defined values
# Example of the values
SecWeb(app=app, Option={'csp': {'default-src': ["'self'"]}, 'xframe': {'X-Frame-Options': 'SAMEORIGIN'}, 'xss': {'X-XSS-Protection': '1; mode=block'}, 'hsts': {'max-age': 4, 'preload': True}, 'xcdp': {'X-Permitted-Cross-Domain-Policies': 'all'}, 'xdns': {'X-DNS-Prefetch-Control': 'on'}, 'referrer': {'Referrer-Policy': 'no-referrer'}, 'expectCt': {'max-age': 128, 'enforce': True, 'report-uri': "https://example.com/example"}, 'coep': {'Cross-Origin-Embedder-Policy': 'require-corp'}, 'coop': {'Cross-Origin-Opener-Policy': 'same-origin-allow-popups'}, 'corp': {'Cross-Origin-Resource-Policy': 'same-site'}})

Middleware Classes

Content Security Policy (CSP)

ContentSecurityPolicy class sets the csp header

The Nonce_Processor module generates nonce for csp header

Nonce Processor

    # Some Code
    nonce = Nonce_Processor(DEFAULT_ENTROPY=20)  # inject the nonce variable into the jinja or html
    # Some Code

DEFAULT_ENTROPY is used to set the nonce length. The nonce processor needs to be called on the route the following example is of FastApi calling the nonce processor on the route

from fastapi import FastAPI
from Secweb.ContentSecurityPolicy import Nonce_Processor

app = FastAPI()


@app.get("/")
async def root():
    # some code
    nonce = Nonce_Processor(DEFAULT_ENTROPY=20)  # inject the nonce variable into the jinja or html
    # some more code

ContentSecurityPolicy

This is for the FastApi

from fastapi import FastAPI
from Secweb.ContentSecurityPolicy import Nonce_Processor

app = FastAPI()

app.add_middleware(ContentSecurityPolicy, Option={'default-src': ["'self'"], 'base-uri': ["'self'"], 'block-all-mixed-content': []}, script_nonce=False, style_nonce=False)

This is for the Starlette

from starlette.applications import Starlette
from Secweb.ContentSecurityPolicy import Nonce_Processor

app = Starlette()

app.add_middleware(ContentSecurityPolicy, Option={'default-src': ["'self'"], 'base-uri': ["'self'"], 'block-all-mixed-content': []}, script_nonce=False, style_nonce=False)

script_nonce=False This is the nonce flag for inline Js

style_nonce=False This is the nonce flag for inline css

For more detail on CSP header go to this MDN Docs

ExpectCT

ExpectCt class sets the ExpectCt header

from fastapi import FastAPI
from Secweb.ExpectCt import ExpectCt

app = FastAPI()

app.add_middleware(ExpectCt, Option={'max-age': 128, 'enforce': True, 'report-uri': "https://example.com/example"})

# OR
from starlette.applications import Starlette
from Secweb.ExpectCt import ExpectCt

app = Starlette()

app.add_middleware(ExpectCt, Option={'max-age': 128, 'enforce': True, 'report-uri': "https://example.com/example"})

For more detail on ExpectCt header go to this MDN Docs

Origin Agent Cluster

OriginAgentCluster class sets the Origin-Agent-Cluster header the class takes no parameters

from fastapi import FastAPI
from Secweb.OriginAgentCluster import OriginAgentCluster

app = FastAPI()

app.add_middleware(OriginAgentCluster)

# OR

from starlette.applications import Starlette
from Secweb.OriginAgentCluster import OriginAgentCluster

app = Starlette()

app.add_middleware(OriginAgentCluster)

For more detail on Origin-Agent-Cluster header go to this WHATWG Site

Referrer Policy

ReferrerPolicy class sets the Referrer-Policy header

from fastapi import FastAPI
from Secweb.ReferrerPolicy import ReferrerPolicy

app = FastAPI()

app.add_middleware(ReferrerPolicy, Option={'Referrer-Policy': 'strict-origin-when-cross-origin'})

# OR

from starlette.applications import Starlette
from Secweb.ReferrerPolicy import ReferrerPolicy

app = Starlette()

app.add_middleware(ReferrerPolicy, Option={'Referrer-Policy': 'strict-origin-when-cross-origin'})

For more detail on Referrer-Policy header go to this MDN Docs

HTTP Strict Transport Security (HSTS)

HSTS class sets the Strict-Transport-Security header

from fastapi import FastAPI
from Secweb.StrictTransportSecurity import HSTS

app = FastAPI()

app.add_middleware(HSTS, Option={'max-age': 4, 'preload': True})

# OR

from starlette.applications import Starlette
from Secweb.StrictTransportSecurity import HSTS

app = Starlette()

app.add_middleware(HSTS, Option={'max-age': 4, 'preload': True})

For more detail on Strict-Transport-Security header go to this MDN Docs

X-Content-Type-Options

XContentTypeOptions class sets the X-Content-Type-Options header the class takes no parameters

from fastapi import FastAPI
from Secweb.XContentTypeOptions import XContentTypeOptions

app = FastAPI()

app.add_middleware(XContentTypeOptions)

# OR

from starlette.applications import Starlette
from Secweb.XContentTypeOptions import XContentTypeOptions

app = Starlette()

app.add_middleware(XContentTypeOptions)

For more detail on X-Content-Type-Options header go to this MDN Docs

X-DNS-Prefetch-Control

XDNSPrefetchControl class sets the X-DNS-Prefetch-Control header

from fastapi import FastAPI
from Secweb.XDNSPrefetchControl import XDNSPrefetchControl

app = FastAPI()

app.add_middleware(XDNSPrefetchControl, Option={'X-DNS-Prefetch-Control': 'on'})

# OR

from starlette.applications import Starlette
from Secweb.XDNSPrefetchControl import XDNSPrefetchControl

app = Starlette()

app.add_middleware(XDNSPrefetchControl, Option={'X-DNS-Prefetch-Control': 'off'})

For more detail on X-DNS-Prefetch-Control header go to this MDN Docs

X-Download-Options

XDownloadOptions class sets the X-Download-Options header the class takes no parameter

from fastapi import FastAPI
from Secweb.XDownloadOptions import XDownloadOptions

app = FastAPI()

app.add_middleware(XDownloadOptions)

# OR

from starlette.applications import Starlette
from Secweb.XDownloadOptions import XDownloadOptions

app = Starlette()

app.add_middleware(XDownloadOptions)

For more detail on X-Download-Options header go to this NWebsec Site

X-Frame

XFrame class sets the X-Frame-Options header

from fastapi import FastAPI
from Secweb.XFrameOptions import XFrame

app = FastAPI()

app.add_middleware(XFrame, Option={'X-Frame-Options': 'DENY'})

# OR

from starlette.applications import Starlette
from Secweb.XFrameOptions import XFrame

app = Starlette()

app.add_middleware(XFrame, Option={'X-Frame-Options': 'DENY'})

For more detail on X-Frame-Options header go to this MDN Docs

X-Permitted-Cross-Domain-Policies

XPermittedCrossDomainPolicies class sets the X-Permitted-Cross-Domain-Policies header

from fastapi import FastAPI
from Secweb.XPermittedCrossDomainPolicies import XPermittedCrossDomainPolicies

app = FastAPI()

app.add_middleware(XPermittedCrossDomainPolicies, Option={'X-Permitted-Cross-Domain-Policies': 'none'})

# OR

from starlette.applications import Starlette
from Secweb.XPermittedCrossDomainPolicies import XPermittedCrossDomainPolicies

app = Starlette()

app.add_middleware(XPermittedCrossDomainPolicies, Option={'X-Permitted-Cross-Domain-Policies': 'none'})

For more detail on X-Permitted-Cross-Domain-Policies header go to this OWASP Site

X-XSS-Protection

xXSSProtection class sets the X-XSS-Protection header

from fastapi import FastAPI
from Secweb.xXSSProtection import xXSSProtection

app = FastAPI()

app.add_middleware(xXSSProtection, Option={'X-XSS-Protection': '0'})

# OR

from starlette.applications import Starlette
from Secweb.xXSSProtection import xXSSProtection

app = Starlette()

app.add_middleware(xXSSProtection, Option={'X-XSS-Protection': '0'})

For more detail on X-XSS-Protection header go to this MDN Docs

Cross Origin Embedder Policy

CrossOriginEmbedderPolicy class sets the Cross Origin Embedder Policy header

from fastapi import FastAPI
from Secweb.CrossOriginEmbedderPolicy import CrossOriginEmbedderPolicy

app = FastAPI()

app.add_middleware(CrossOriginEmbedderPolicy, Option={'Cross-Origin-Embedder-Policy': 'unsafe-none'})

# OR

from starlette.applications import Starlette
from Secweb.CrossOriginEmbedderPolicy import CrossOriginEmbedderPolicy

app = Starlette()

app.add_middleware(CrossOriginEmbedderPolicy, Option={'Cross-Origin-Embedder-Policy': 'unsafe-none'})

For more detail on Cross Origin Embedder Policy header go to this MDN Docs

Cross Origin Opener Policy

CrossOriginOpenerPolicy class sets the Cross Origin Opener Policy header

from fastapi import FastAPI
from Secweb.CrossOriginOpenerPolicy import CrossOriginOpenerPolicy

app = FastAPI()

app.add_middleware(CrossOriginOpenerPolicy, Option={'Cross-Origin-Opener-Policy': 'unsafe-none'})

# OR

from starlette.applications import Starlette
from Secweb.CrossOriginOpenerPolicy import CrossOriginOpenerPolicy

app = Starlette()

app.add_middleware(CrossOriginOpenerPolicy, Option={'Cross-Origin-Opener-Policy': 'unsafe-none'})

For more detail on Cross Origin Opener Policy header go to this MDN Docs

Cross Origin Resource Policy

CrossOriginResourcePolicy class sets the Cross Origin Resource Policy header

from fastapi import FastAPI
from Secweb.CrossOriginResourcePolicy import CrossOriginResourcePolicy

app = FastAPI()

app.add_middleware(CrossOriginResourcePolicy, Option={'Cross-Origin-Resource-Policy': 'same-site'})

# OR

from starlette.applications import Starlette
from Secweb.CrossOriginResourcePolicy import CrossOriginResourcePolicy

app = Starlette()

app.add_middleware(CrossOriginResourcePolicy, Option={'Cross-Origin-Resource-Policy': 'same-site'})

For more detail on Cross Origin Resource Policy header go to this MDN Docs

Contributing

Pull requests and Issues are welcome. For major changes, please open an issue first to discuss what you would like to change.


Github

License

MLP 2.0

Secweb Icon

Secweb Icon © 2021 by Motagamwala Taha Arif Ali is licensed under Attribution-NonCommercial-NoDerivatives 4.0 International

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

Secweb-1.3.0.tar.gz (19.4 kB view details)

Uploaded Source

Built Distribution

Secweb-1.3.0-py3-none-any.whl (28.4 kB view details)

Uploaded Python 3

File details

Details for the file Secweb-1.3.0.tar.gz.

File metadata

  • Download URL: Secweb-1.3.0.tar.gz
  • Upload date:
  • Size: 19.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.9.0

File hashes

Hashes for Secweb-1.3.0.tar.gz
Algorithm Hash digest
SHA256 ca615cfe328d914aa36ba14bfa8d9aff08f93dbe31e7d6341018e290021d3a96
MD5 decd53ac8254354b3fb009a75a46bee8
BLAKE2b-256 c2d5b26874b66418c6973f46c8c20753d837daf3a8fc0b0601efc1bb561938ab

See more details on using hashes here.

File details

Details for the file Secweb-1.3.0-py3-none-any.whl.

File metadata

  • Download URL: Secweb-1.3.0-py3-none-any.whl
  • Upload date:
  • Size: 28.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.9.0

File hashes

Hashes for Secweb-1.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 ac793c622a3f9cff5b996f45d4afb63b1cc0b62b27636930a55660682d190fda
MD5 9be546215ff311c0f765a8f7990d14f5
BLAKE2b-256 aa423d1af796f0b572499835a255f8c8e061ffab163b6eae4f74ed4ccab08af9

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page