Условное ослабление политик CSP или ослабление CSP для определенного маршрута Nest для отображения содержимого iframe — Node/NestJS

avatar
Vishal
9 августа 2021 в 05:25
208
0
0

У меня есть приложение Angular с NestJS как BFF, и это многопользовательское приложение. Мне нужно ослабить frame-src, чтобы внести домены в белый список только для определенных маршрутов NestJS и сохранить политики без изменений, если пользователь не посещает страницу, содержащую iframe. У меня есть страница, которая содержит несколько вкладок, связанных с разными компонентами iframe. Мы использовали шлем для настройки наших заголовков ответа CSP, где по умолчанию не содержится директивы frame-src, и мы хотим добавить ее, только если посещается страница, содержащая iframe. Настройка iframe выглядит следующим образом: конфигурация используется для создания URL-адреса в BFF -

.

<iframe width="100%" height="100%" frameBorder="0" [src]="/iframewrapper?config=config1" title="Custom Wrapper"></iframe>

Контроллер BFF выглядит следующим образом:

  loadContent(@Query() query, @Res() res) {
    this.iframeService.getUrlForFrame(query.tab).subscribe((appConfig) => {
      const html = `<!DOCTYPE html>
                    <html>
                    <body>
                      <h1>Loading content!</h1>
                      <script type="text/javascript" nonce="4AEemGb0xJptoIGFP3Nd">
                        window.addEventListener('load', () => {
                          window.location = "${appConfig.url}"
                        });
                      </script>
                    </body>
                    </html>`;
      res.send(html);
    });
  }```
To solve this issue I created a NestJS middleware which is configured only for controller that takes care of iframe related requests. Somehow below setup does not work and browser complains of CSP not in place for frame-src. 

Approach - 1
```configure(consumer: MiddlewareConsumer): void {
    consumer.apply(CSPUpdateMiddleware).forRoutes(IFrameController);
  }```

But below setup works.
Approach - 2
 ```configure(consumer: MiddlewareConsumer): void {
    consumer.apply(CSPUpdateMiddleware).forRoutes({
      path: '*',
      method: RequestMethod.ALL
    });
  }```
Can we really update the CSP policies and re-apply if needed ? Also why does the approach 2 works and not the approach 1.


Источник

Ответы (0)