const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World');
});

server.listen(port, hostname, () => {
console.log(Server running at http://${hostname}:${port}/); });

完成后,您可以轉到終端并使用以下命令運行代碼: 

node app.js

訪問http://localhost:3000,您將看到一條消息“Hello World”。 

很簡單,對吧?

澄清 CSRF

簡單來說,CSRF(也稱為XSRF),顧名思義,是一種依賴用戶權限通過劫持用戶會話來獲取其數(shù)據(jù)訪問權限的攻擊。  

利用這種方法,攻擊者可以欺騙用戶以他們的名義提交惡意請求,從而規(guī)避我們平臺的安全性。 

CSRF 攻擊之所以可能發(fā)生,主要有兩個原因。 

此外,惡意攻擊者可以隱藏 HTML 元素,并通過聊天或電子郵件等渠道使用社交工程策略,從而產(chǎn)生重大影響。由于這些漏洞似乎來自普通用戶的可信來源,因此這會劫持他們對日常所依賴的系統(tǒng)的信任。 

CSRF 攻擊示例

現(xiàn)在,讓我們通過以下示例來探討 CSRF 攻擊如何劫持系統(tǒng)。  

現(xiàn)在,這里可能發(fā)生無數(shù)事情。例如,當我們的受害者點擊惡意鏈接時,目標 URL 可能會利用新的經(jīng)過身份驗證的會話(或者只是在登錄時打開一個選項卡之類的簡單操作)并對易受攻擊的 Web 應用程序執(zhí)行數(shù)據(jù)庫更改。造成危害的可能性無窮無盡。 

請記住,CSRF 的背后還有更多內(nèi)容。遺憾的是,探究它如何利用網(wǎng)絡協(xié)議中的漏洞的復雜性超出了本文的討論范圍。  

但是,如果您想更深入地了解 CSRF 的海洋及其工作原理,我們建議您閱讀我們的姊妹文章,其中對此進行了更詳細的解釋。?

如何緩解 Node.js 和 TypeScript 中的 CSRF 漏洞

現(xiàn)在我們已經(jīng)了解了捕獲用戶會話是多么輕松,讓我們探索一些針對 CSRF 攻擊的緩解措施。 

路由結構

我們需要做的第一件事是重新考慮我們網(wǎng)站的路由結構的設計。  

CSRF 攻擊利用接受執(zhí)行狀態(tài)更改的 GET 請求的系統(tǒng)。這種模式已經(jīng)是一種糟糕的做法,您應該在所有情況下都避免它們。 

幸運的是,在 Express 中解決這個問題相對簡單。您需要做的就是更改路由文件(通常稱為“index.js”),并將應用程序的操作設置為接收 POST 或 PUT,而不是 GET 以進行狀態(tài)更改。  

當然,這一變化確保您遵循 HTTP 協(xié)議指南。

//router.get('/posts/create', sessionController.validateSession, postsController.postsCreate);
router.post('/posts/create', sessionController.validateSession, postsController.postsCreate);

最終你會得到類似下面的結果:

TypeScript CSRF 保護指南:示例及如何啟用圖像

請注意,所有狀態(tài)改變請求都不是 GET。 

請記住,這種方法無法保護我們免受 JavaScript 自動提交 POST 的表單標簽的攻擊。 

此外,攻擊者可以調(diào)整他們的漏洞以適應 JavaScript Ajax 請求并提交實現(xiàn)其目標所需的任何協(xié)議或參數(shù)。 

動作確認

建議所有開發(fā)人員在所有關鍵狀態(tài)改變操作中 實現(xiàn)確認機制。

在提交之間實現(xiàn)中間步驟,要求用戶確認其操作,大大減少了 CSRF 攻擊的范圍。 

然而,在需要頻繁更改的系統(tǒng)中,一些用戶可能會發(fā)現(xiàn)這個多步驟的過程很麻煩和乏味,因此請在適當?shù)臅r候使用它。 

此類基于設計的安全功能在重要的管理系統(tǒng)和賬戶管理門戶中隨處可見。 

CSRF 令牌

最后,我們可以實施的最有效的緩解策略是使用 CSRF 令牌來驗證來自客戶端的每個請求。 

這些令牌通過將用戶會話鏈接到服務器生成的令牌來工作,服務器根據(jù)請求驗證這些令牌。 

令牌在所有表單中都以隱藏字段的形式存在。因此,當客戶端繼續(xù)提交表單時,它包含一個驗證憑證,表明用戶有意執(zhí)行此操作。 

為了在 Node.js 中實現(xiàn) CSRF 令牌,我們可以使用“ csurf ”模塊來創(chuàng)建和驗證令牌。

const cookieParser = require('cookie-parser'); // CSRF Cookie parsing 
const bodyParser = require('body-parser'); // CSRF Body parsing
var csrf = require('csurf');

/**
* App Variables
*/

const app = express();

// Middlewares

var csrfProtect = csrf({ cookie: true })

app.get('/form', csrfProtect, function(req, res) {
// Generate a tocken and send it to the view
res.render('send', { csrfToken: req.csrfToken() })
})

app.post('/posts/create', parseForm, csrfProtect, function(req, res) {
res.send('data is being processed')
})

必須將此更改應用于主 app.js 類文件,使其看起來像下面這樣:

TypeScript CSRF 保護指南:示例及如何啟用圖像

請注意,我們在這里添加了路由代碼,但您可以將其放在單獨的路由類“index.js”文件中。 

完成此操作后,您可以修改所有請求和響應路由以在需要時使用令牌。 

此外,您必須在應用程序的所有表單中添加隱藏字段。  

以下是一個簡單表單的示例:

<form action="/posts/create" method="POST">
<input type="hidden" name="_csrf" value="{{csrfToken}}">
Title: <input type="text" name="title">
Text: <input type="text" name="text">
<button type="submit">Submit</button>
</form>

就是這樣了。

可持續(xù)安全

實施和維護適當?shù)陌踩胧┦且恍┲挥性谛枰獣r才會重視的虛無價值。但不幸的是,大多數(shù)團隊都很難讓上級相信這些措施的重要性。  

相反,當今時代,復雜的攻擊越來越普遍。因此,很難不證明投資于足夠的安全措施所提供的保障和安心是合理的。 

值得慶幸的是,Node.js 等現(xiàn)代平臺使保持高安全標準變得更加容易和輕松。這樣,您就可以專注于重要的事情:為用戶帶來價值。  

文章來源:TypeScript CSRF Protection Guide: Examples and How to Enable

上一篇:

應用程序安全審計:深入指導

下一篇:

REST api GraphQL有7種方式:cURL、Python、PHP、JS、Ruby、Java、Postman
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數(shù)據(jù)驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費