Перейти к содержимому

SRI для SSR контента

По умолчанию, Astro-Shield не включает SRI для контента, отрендеренного на стороне сервера (Server-Site-Rendering, SSR), но вы можете легко включить его, установив опцию sri.enableMiddleware в true в вашем конфигурационном файле Astro.

import { resolve } from 'node:path'
import { defineConfig } from 'astro/config'
import { shield } from '@kindspells/astro-shield'
const rootDir = new URL('.', import.meta.url).pathname
const modulePath = resolve(rootDir, 'src', 'generated', 'sriHashes.mjs')
export default defineConfig({
integrations: [
shield({
sri: {
hashesModule: modulePath,
enableMiddleware: true,
},
}),
],
})

Усиление безопасности для динамического контента

Списки разрешенных ресурсов

Astro-Shield будет блокировать любые кросс-доменные ресурсы, которые не разрешены явно. В противном случае это может открыть возможности для различных уязвимостей безопасности, вызванных загрузкой ненадежного контента и его пометкой как безопасного.

Мы можем определить список разрешенных URL-адресов ресурсов, как в примере ниже:

import { resolve } from 'node:path'
import { defineConfig } from 'astro/config'
import { shield } from '@kindspells/astro-shield'
const rootDir = new URL('.', import.meta.url).pathname
const modulePath = resolve(rootDir, 'src', 'generated', 'sriHashes.mjs')
export default defineConfig({
integrations: [
shield({
sri: {
hashesModule: modulePath,
enableMiddleware: true,
scriptsAllowListUrls: [
'https://code.jquery.com/jquery-3.7.1.slim.min.js',
],
stylesAllowListUrls: [
'https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css',
],
},
}),
],
})

Блокировка inline-ресурсов

Хотя Astro-Shield по умолчанию не блокирует inline-ресурсы, в некоторых случаях это может быть хорошей идеей, чтобы предотвратить XSS атаки. Вы можете сделать это установив опции sri.allowInlineScripts и sri.allowInlineStyles в false или 'static' (этот параметр позволяет использовать inline-ресурсы только в статическом контенте).

import { resolve } from 'node:path'
import { defineConfig } from 'astro/config'
import { shield } from '@kindspells/astro-shield'
const rootDir = new URL('.', import.meta.url).pathname
const modulePath = resolve(rootDir, 'src', 'generated', 'sriHashes.mjs')
export default defineConfig({
integrations: [
shield({
sri: {
hashesModule: modulePath,
enableMiddleware: true,
allowInlineScripts: false,
allowInlineStyles: 'static',
},
}),
],
})