最近闲来无事看到MongoDB的注入问题。目前使用Express.JS,假设构建一个如下的登陆http请求: http://[email protected]&password[$ne]=idontknow
bodyParser解析之后,从拿到的参数就是: { email : '[email protected]’, password : { ‘$ne’ : ‘idontknow’ } }
那么去MongoDB执行查询的时候,查询就变成: db.accounts.findOne( { email : '[email protected]’, password : { ‘$ne’ : ‘idontknow’ } } ); 因为 password : { ‘$ne’ : ‘idontknow’ } } 这个条件一般都会成立(至少密码会做个加密什么的,当然idontknow这个字符串也可以写成空字符串),判断成账号存在,然后返回账号信息,这样,在不知道密码的情况下就能拿到信息了。
目前我的思路是:所有的http参数key-value,value都必须是string,如果传递复杂的类型,value先转换成JSON字符串,服务器解析。Express.JS的第一个router或者middleware对参数的类型进行判断,只允许string或number,把object类型过滤掉。简单粗暴但是感觉不怎么体面,所以开个帖子大家来讨论一下,欢迎拍砖。