我的印象是,跨域請求被阻止主要是為了防止惡意網站獲取或更新有關您的 Web 服務的資訊的安全問題。
然而,我注意到即使請求在我的前端被阻止,代碼仍然在后端執行。
例如:
import express = require('express')
const app = express()
const port = 80
app.use(function (req, res, next) {
// res.header("Access-Control-Allow-Origin", "*")
// res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept")
next()
});
app.get('/foo', (req, res) => {
console.log("test1")
res.json({
data: "Hello"
})
console.log("test2")
})
app.listen(port, () => {
console.log(`app listening at http://localhost:${port}`)
})
如果我的前端然后向快遞服務發出請求,請求將失敗,cross-origin但快遞服務仍會記錄
test1
test2
由于不允許使用源,express 是否應該阻止服務繼續運行?如果即使前端出錯,express 代碼仍然執行,這不是安全威脅嗎?
uj5u.com熱心網友回復:
瀏覽器實作中有兩種型別的 COR 請求,使用哪種型別取決于發出的特定請求。
對于不需要預飛行的請求,向后端發出請求,然后瀏覽器檢查生成的標頭以查看是否允許 COR 請求。如果不允許(如您所示),則請求的結果將被客戶端阻止,因此它無法看到請求的結果(即使服務器已完全處理它)。
我可以從你展示的內容中看出,這里的一切都按預期作業。該請求被視為“簡單請求”,不需要預檢。如果不是同一來源,則不允許基于瀏覽器的 Javascript 從此路線獲取結果。
對于確實需要預檢的請求(請求中有一系列可以觸發預檢的事物),那么瀏覽器將首先通過向同一路由發送 OPTIONS 請求來詢問服務器是否允許該請求。然后服務器決定是否允許請求。如果瀏覽器獲得了服務器的許可,它就會發送真正的請求。
您可以在此處查看觸發預檢的原因。
據推測,瀏覽器不會一直使用預檢,因為它效率較低(需要兩倍的請求)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/312228.html
