我正在撰寫一個 Express 應用程式,它根據用戶從兩個下拉串列中所做的選擇來創建和匯出檔案。按下按鈕后,下拉值作為路由引數傳遞,然后在路由方法中呼叫必要的函式來創建檔案并將其發送回用戶。
如何通過在 URL 欄中手動輸入路由引數來防止用戶(如果可能)呼叫/訪問此路由?他們應該只能通過按下按鈕來訪問路線。
以下是我的應用程式功能的一些通用代碼...
單擊按鈕后獲取/發送值的代碼:
export.onclick = function() {
let index1 = dropdown1.value;
let index2 = dropdown2.value;
fetch('/' index1 '/' index2)
// Convert response to blob object for download
}
路線代碼:
app.get('/:index1/:index2', function (req, res) {
// Call functions to create document
// Return document back to user
});
下拉串列是使用從 API 回應中獲得的資料動態填充的。每個下拉選項的值代表該選項的索引。用戶能夠輸入隨機索引允許無效輸入;但是,輸入不一定有邊界,因為下拉串列是根據各種用戶限制動態填充的。出于這個原因,通過在我的腦海中輸入引數來阻止用戶訪問路線是理想的。
uj5u.com熱心網友回復:
您無法取消在瀏覽器地址欄中輸入 URL 的能力,但您可以決定不在GET后端處理由此產生的請求。相反,您可以監聽POST請求。
app.post('/:index1/:index2', function (req, res) {
// Call functions to create document
// Return document back to user
});
export.onclick = async function() {
let index1 = dropdown1.value;
let index2 = dropdown2.value;
const response = await fetch(`/${index1}/${index2}`, {
method : 'POST'
});
}
這絕不是一項安全功能,如果用戶POST知道自己在做什么和/或使用像POSTMAN或類似的請求客戶端,她仍然可以手動創建請求。
但為什么 ?
在我看來,這可能是 XY 問題。為什么要阻止用戶在地址欄中手動輸入 URL?它會以任何方式損害您的服務器/業務嗎?如果是,那么你手頭有一個不同的、更大的問題。
uj5u.com熱心網友回復:
添加令牌以保護您在服務器端的獲取請求
像這樣
app.get('/:index1/:index2', function (req, res) {
if (req.query.token !== 'foo') {
// invalid the request
}
// Call functions to create document
// Return document back to user
});
要將請求發送到網址,您將需要令牌
/:index1/:index2?token=foo
或者只是在請求標頭上添加令牌
那么下面的問題可能是
我是否需要動態令牌來保護/:index1/:index2API?
如果不是,則用戶仍然可以使用此固定令牌鍵入 URL
如果是,您將需要另一個 API 來在“按鈕頁面”上生成令牌
fetch('/get_new_token')
// get the token via this API
const token = ...
export.onclick = function() {
let index1 = dropdown1.value;
let index2 = dropdown2.value;
fetch('/' index1 '/' index2 '?token=' token)
// Convert response to blob object for download
}
您可以使用密鑰來加密您的令牌
或在您的令牌中添加簽名以驗證令牌未修改
如果您希望您的令牌在時間戳后過期
將時間戳資訊添加到令牌中
然后驗證服務端的時間戳
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/312234.html
標籤:javascript 节点.js 表达
