[英]How can I prevent a user from accessing a route via URL parameters?
我正在编写一个 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 响应中获得的数据动态填充的。 每个下拉选项的值代表该选项的索引。 用户能够输入随机索引允许无效输入; 但是,输入不一定有边界,因为下拉列表是根据各种用户限制动态填充的。 出于这个原因,通过在我的脑海中输入参数来阻止用户访问路线是理想的。
您无法取消在浏览器地址栏中输入 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'
});
}
这绝不是一个安全功能,如果用户知道她在做什么和/或使用像POSTMAN或类似的请求客户端,她仍然可以手动创建POST
请求。
在我看来,这可能是 XY 问题。 为什么要阻止用户在地址栏中手动输入 URL? 它会以任何方式损害您的服务器/业务吗? 如果是,那么你手头有一个不同的、更大的问题。
添加令牌以保护您在服务器端的获取请求
像这样
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/:index2
API?
如果不是,则用户仍然可以使用此固定令牌键入 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
}
您可以使用密钥来加密您的令牌
或在您的令牌中添加签名以验证令牌未修改
如果您希望您的令牌在时间戳后过期
将时间戳信息添加到令牌中
然后验证服务端的时间戳
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.