Я пытаюсь обновить источники CORS во время работы сервера NodeJS. Я просто пытаюсь перезаписать предыдущую конфигурацию CORS, когда пользователь делает определенное обновление.
Я пытался использовать app.use(setCors(app.get('newCorsDomains')));
.
let setCors = (domains) => {
return cors({
origin: domains
});
};
Я подтвердил, что отправляю этой функции правильные домены, но источники CORS, похоже, не обновляются при вызове app.use(setCors(app.get('newCorsDomains')));
.
Я не знаю, почему вы захотите это сделать, но если вы действительно это сделаете, вероятно, вам лучше всего будет создать функцию промежуточного программного обеспечения, которая обертывает промежуточное программное обеспечение cors. Это может выглядеть так.
app.use((req, res, next) => {
cors({ origin: app.get('newCorsDomains') })(req, res, next);
});
Это возможно, но нецелесообразно.
Поскольку промежуточное ПО CORS Express практически не выполняет защитного копирования, вы можете фактически создать маршрут, который изменяет параметры конфигурации CORS. Вот доказательство концепции:
const express = require('express')
const cors = require('cors')
const app = express()
const port = 3000
const corsOptions = {
origin: 'http://example.com',
}
app.use(cors(corsOptions));
app.get('/', (req, res) => {
res.send('Hello World!')
})
app.post('/change-allowed-origin', function (req, res, next) {
corsOptions.origin = 'http://attacker.com';
res.send('Done!')
})
app.listen(port, () => {
console.info(`Example app listening on port ${port}`)
})
После локального запуска сервера:
$ curl -s -D - -o /dev/null -H "Origin: https://attacker.com" localhost:3000
HTTP/1.1 200 OK
X-Powered-By: Express
Access-Control-Allow-Origin: http://example.com
Vary: Origin
-snip-
$ curl -XPOST localhost:3000/change-allowed-origin
Done!
$ curl -s -D - -o /dev/null -H "Origin: https://attacker.com" localhost:3000
HTTP/1.1 200 OK
X-Powered-By: Express
Access-Control-Allow-Origin: http://attacker.com
Vary: Origin
-snip-
Однако я считаю это недостатком промежуточного программного обеспечения CORS Express и не рекомендую вам обновлять конфигурацию CORS на лету. Поскольку активация CORS означает ослабление безопасности, обеспечиваемое по умолчанию Same-Origin Policy, любые изменения в конфигурации CORS следует тщательно проверять и требовать перезагрузки сервера.
Мне любопытно, почему вы хотите так обновлять свою политику CORS на лету. Вы должны дважды (или трижды!) подумать об этом. И если вы в конечном итоге разрешите обновлять конфигурацию CORS на лету, рассматриваемый маршрут лучше потребовать авторизации.
Вы обновляете его на лету?
app.use()
обычно вызывается только в первый раз, вы можете создать свое собственное промежуточное ПО, которое создает и вызывает промежуточное ПО cors() при каждом вызове.