对于可以通过HTTP传递给JavaScript服务器的数组大小,有哪些安全考虑因素?

我正在处理Node.js中的库qs ,它使您可以对查询string进行string化和分析。

例如,如果我想发送一个包含项目的数组的查询,我会做qs.stringify({ items: [1,2,3] }) ,这将作为我的查询string发送:

http://example.com/route?items[0]=1&items[1]=2&items[2]=3

(编码的URI将是项目%5B0%5D%3D1%26项目%5B1%5D%3D2%26项目%5B2%5D%3D3)

当我在服务器上执行qs.parse(url)时,我会返回原始对象:

 let query = qs.parse(url) // => { items: [1,2,3] } 

但是,根据文档, qs数组的默认大小限制为20。

qs也将数组中的指定索引限制为最大索引值20.任何索引大于20的数组成员将被转换为以索引为键的对象

这意味着如果数组中有超过20个项目, qs.parse会给我一个像这样的对象(而不是我期望的数组):

 { items: { '0': 1, '1': 2 ...plus 19 more items } } 

我可以通过设置一个参数来覆盖这个行为,例如: qs.parse(url, { arrayLimit: 1000 }) ,这将允许最大数组大小为1000。 这样就可以把一个1001个数组变成一个普通的旧的JavaScript对象。

根据这个github问题 ,限制可能是“安全考虑”( 在这个其他github问题相同)。

我的问题:

  1. 如果20的默认限制是为了帮助减轻DoS攻击, 那么如何将一个超过20个项目的数组变成一个普通的旧JavaScript对象应该有所帮助? (对象是否需要更less的内存或什么?)
  2. 如果上述情况属实,即使数组限制为20,那么攻击者是否可以发送更多的请求并获得相同的DoS效果呢? (需要发送的请求的数量会随着数组大小的限制线性减less,我想…所以我想单个请求的“影响”或负载会更低)