繁体   English   中英

如何防止用户通过 URL 参数访问路由?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM