感谢github 的@monday-ch 提出这个bug,在权限校验中,如果手动修改请求路径大小写,会发现没有权限的页面也可以访问到,这是个很严重的bug,原因在于校验不够严谨,相关代码如下:

//模块管理页面
router.get('/manage/:targetPage', function(req, res, next) {
    var currentPage = req.params.targetPage;
    if(settings[currentPage]){
        if(!adminFunc.checkAdminPower(req,settings[currentPage][0] + '_view')){
            res.render("manage/public/notice", adminFunc.setDataForInfo('danger','对不起,您无权操作 <strong>'+settings[currentPage][1]+'</strong> 模块!'));
        }else{
            next();
        }
    }else{
        next();
    }
});


settings[currentPage] 校验不过,直接next,在admin.js中的路由如下:

//文档列表页面
router.get('/manage/contentList', function(req, res) {
    res.render('manage/contentList', adminFunc.setPageInfo(req,res,settings.contentList));
});


这里express默认对大小写不做处理,导致了直接请求到对应路由。这里@monday-ch提供了下面的处理方法,对小写的路由做容错处理,代码如下:


bug修复.PNG


在这里这样处理是可以的,但是考虑到不光是在后台菜单访问入口,还有每个数据请求接口都有类似问题,这


样处理就过于繁琐了,于是想到了express 路由的一个属性caseSensitive。api是这样介绍的:

Router([options])

Create a new router as follows:

var router = express.Router([options]);

The optional options parameter specifies the behavior of the router.

PropertyDescriptionDefaultAvailability
caseSensitiveEnable case sensitivity.Disabled by default, treating “/Foo” and “/foo” as the same.
mergeParamsPreserve the req.params values from the parent router. If the parent and the child have conflicting param names, the child’s value take precedence.false4.5.0+
strictEnable strict routing.Disabled by default, “/foo” and “/foo/” are treated the same by the router.


caseSensitive属性可以设置路由的大小写严格模式,默认为false,于是可以在admin.js中加一句话:

var router = express.Router();
router.caseSensitive = true;

问题就可以解决了,个人觉得好像没必要适配大小写,因为路由是不需要手动输入的,接口也不提倡手动修改,不然情况就比较复杂了。