【问题标题】:Express param length limit for GET表示 GET 的参数长度限制
【发布时间】:2018-10-11 02:42:58
【问题描述】:

我有一个 nodejs 应用程序,我在其中使用 express 用于 REST API。

其中一个 api 接受 SQL 查询,在数据库上运行它并返回 JSON 响应。在我使用长 sql 查询测试 api 之前,一切正常。
调试后,我注意到 SQL 查询是自动修剪的。

在 GET URL 中可以传递的参数长度是否有限制?

这就是我的 api 的样子

app.get('/v1/runsql/:query', (req, res) => {
let result = runQuery.executeQuery(req.params.query);
..... execute some more code here
})

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    Node 不是对 URL 本身实施限制,而是对整个请求标头(包括 URI)实施限制 请求标头 + URI 不能超过 80 kb。

    此外,公开允许任意 SQL 查询的 API 是一个非常糟糕的主意,无论它们是否在 URL 上。大多数应用程序花费大量精力试图阻止任意 SQL 查询不应公开的记录、删除表等。故意公开这样的端点就像你在自找麻烦。

    【讨论】:

    • 感谢您的回复。我同意运行任意 sql 是一个坏主意,但是如果存在允许 1)仅选择查询 2)允许从表列表中读取操作的情况,该怎么办。
    • 这是你的系统,@A-D,做你想做的事。但如果是我,并且我可以提前知道允许哪些语句和表,我只会制作映射到底层的端点,并且仍然不允许实际的 SQL 字符串通过网络传递。
    • @A-D 如果您只是通过网络执行任意 SQL,为什么不直接连接到数据库呢?您将消除一层复杂性。相反,如果您出于某种原因需要此 API 层,请考虑对数据库进行抽象,以便您可以更改底层数据库系统,而不会破坏使用该 API 的应用程序。这是一个通用架构是有原因的......您只需要决定哪些场景适用于您。
    【解决方案2】:

    http 协议不限制 url 的长度,但是浏览器和服务器(无论是 Node 还是其他)都会做限制。如果你真的想实现它,你可以使用 POST 方法而不是 Get

    并且http协议规范规定:如果url长度超出限制,服务器可能会返回代码414

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-20
      • 1970-01-01
      • 2020-06-04
      • 1970-01-01
      • 2010-09-20
      • 1970-01-01
      • 2012-01-02
      相关资源
      最近更新 更多