可以通过HTTP传递给JavaScript服务器的数组大小的安全注意事项是什么?

时间:2017-02-22 23:57:41

标签: javascript node.js security

我正在处理Node.js中的库qs,它允许您对字符串化和解析查询字符串。

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

  

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

     

(编码的URI将是项目%5B0%5D%3D1%26items%5B1%5D%3D2%26items%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 } }

我可以通过设置一个param来覆盖此行为,例如:qs.parse(url, { arrayLimit: 1000 }),这将允许最大数组大小为1,000。因此,这会将1,001个项目的数组转换为普通的旧JavaScript对象。

根据this github issue,限制可能是针对"安全考虑因素" (同一in this other github issue)。

我的问题:

  1. 如果默认限制为20是为了帮助减轻DoS攻击,那么如何将超过20个项目的数组转换为一个普通的旧JavaScript对象应该有什么帮助?(对象是否需要更少的记忆或什么?)
  2. 如果上述情况属实,即使数组限制为20,攻击者也无法发送更多请求并仍然获得相同的DoS效果? (需要发送的请求数量会随着数组的大小限制而线性减少,我想......所以我猜测"影响"或单个请求的加载会更低)

0 个答案:

没有答案