DoraCMS v.1.1.1 权限bug解析 

感谢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;

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

发表评论

登录 后参与评论

评论列表 (33条)

  • mkui2016
    3 个月前
    @doramart  我竟然不能能回复 what happend?????
  • mkui2016
    3 个月前
    @doramart  啥时候有时间可以试试
  • fanys0806
    8 个月前
    @yoooyu  这个项目比较老了,现在不维护了。计划出doracms2,敬请关注!
  • fanys0806
    8 个月前
    @doramart  ...........
  • fanys0806
    8 个月前
    @doramart  .............
  • fanys0806
    8 个月前
    @yoooyu  @fanys0806 test
  • fanys0806
    8 个月前
    @jl89757  jjhjhkkhj
  • doramart [  管理员]
    8 个月前
    @fanys0806  这个项目比较老了,现在不维护了。计划出doracms2,敬请关注!
  • fanys0806
    8 个月前
    @fanys0806  例如说文件的关于留言板的功能模块,可以有一个专门的使用教程
  • fanys0806
    8 个月前
    使用起来非常不错的CMS,如果开发文档可以再丰富一些就更好了
  • yoooyu
    9 个月前
    @limos  看看具体是什么错,mongodb如果没设密码 是可以直接访问的,当然放服务器不能这么做
  • limos
    9 个月前
    这个CMS很好用,感谢楼主大大,可是有个小问题,为什么文档的存为草稿和上传时都会报500的错误? 用户组的添加时完全没问题的,说明mongdb的访问是不受限制的,希望楼主大大解答一下这个问题
  • doramart [  管理员]
    1 年前
    @mkui2016  还得有时间才行
  • mkui2016
    1 年前
    录制一个cms开发视频,立马火爆
  • hengwujun
    1 年前
    @doramart  ,hello,我下载模版之后解压,还是没有public.ejs,我试了两套模版,好像都是这样,博主,可能没有把public.ejs 上传骑牛么,请博主赐教
  • doramart [  管理员]
    1 年前
    @hengwujun  报错貌似是模板安装有问题,你可以重新安装下模板
  • hengwujun
    1 年前
    我昨天在mac上安装了这个cms,后台没有问题,进入前台有点问题:ENOENT: no such file or directory, open '/Users/tianshanlaike/Documents/test/node-cms/views/web/temp/dorawhite/public.ejs' 我们正在加紧处理,请稍后访问...,类似这样的问题,还有就是替换模版有些问题,报模版文件找不到,
  • gdhzkk
    2 年前
    url命名可以修改下嘛? 特别是分页的url,太长了
  • jl89757
    2 年前
    MongoError: Mod on _id not allowed 这个报错是因为从前台传过来的req.body中有_id 这个字段,所以更新的时候会报错,把这个字段删了就可以了。。
  • jl89757
    2 年前
    而且,为何文档一修改就会报错? MongoError: Mod on _id not allowed
  • jl89757
    2 年前
    不对吧,我看新增的文档类型都是singer 的,这个怎么破?
  • doramart [  管理员]
    2 年前
    @jl89757  添加普通文档,类型都是content,添加插件是plug,是我个性化的一个类别,用不上可以去掉,或者改成自己需要的类型
  • jl89757
    2 年前
    请问下哪里发布的文档类型是 content 这个?
  • jl89757
    2 年前
    @doramart  那这样就有问题了吧?直接把这个query对象回传到前端,这样是显示不出来的吧?
  • doramart [  管理员]
    2 年前
    @jl89757  是的 query对象
  • jl89757
    2 年前
    @doramart  不对啊,我这用JSON.stringify()打印的时候报类型错误的。。 这resultList = obj.find().or(q,filed).sort(sq).skip(startNum).limit(limit); 查询的resultList不是个JSON对象,是个query对象吧?
  • doramart [  管理员]
    2 年前
    @jl89757  是mongodb返回的list对象,包含条件查询文档列表的结果
  • jl89757
    2 年前
    @doramart  这个documentList是个什么东西?不应该是json对象吗?还是其他什么呢?
  • doramart [  管理员]
    2 年前
    @jl89757  要进去方法里面看
  • jl89757
    2 年前
    /* GET home page. */ router.get('/', function (req, res, next) { siteFunc.renderToTargetPageByType(req,res,'index'); }); 首页这块的代码是不是没写完啊?怎么没有获取documentList的代码呢
  • doramart [  管理员]
    2 年前
    @zyy258963  现在可以了吧,用supervisor启动的原因
  • zyy258963
    2 年前
    后台一直 报 :{ [Error: Not Found] status: 404 } 错误,
  • zyy258963
    2 年前
    为什么用最新的 master 的代码,安装模板,一直不成功,提示成功之后,也不能正常启用。