V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐工具
RoboMongo
推荐书目
50 Tips and Tricks for MongoDB Developers
Related Blogs
Snail in a Turtleneck
DoraJDJ
V2EX  ›  MongoDB

关于 MongoDB 注入的防御问题

  •  
  •   DoraJDJ · 2017-01-14 14:25:12 +08:00 · 6701 次点击
    这是一个创建于 2903 天前的主题,其中的信息可能已经有所发展或是发生改变。

    刚才想弄一个博客系统,就在设计数据库结构时突然想到,用户在后台发布文章时,文章可能会带有各种不同的字符,这些字符若处理不当可能会造成注入现象的发生。

    于是查了下有关于 MongoDB 的注入,没想到还真有:

    http://www.freebuf.com/articles/web/106085.html

    不过案例上用的是 PHP ,我按照相关关键词查了下好像查不到 Node.js 的案例。

    自己想解决掉注入的问题,但我在 npm 查了跟 escape string 有关的关键词找了大半天就是找不到相关的轮子可用。

    不知道哪位有经验的能提供下解决方案吗?谢谢。

    补充:自己目前用的 MongoDB 库是 monk ,不知道有没有自带一些防注入的安全措施?

    15 条回复    2017-01-14 19:51:46 +08:00
    jybox
        1
    jybox  
       2017-01-14 14:38:17 +08:00
    Kilerd
        2
    Kilerd  
       2017-01-14 14:52:35 +08:00
    ORM 啊.
    DoraJDJ
        3
    DoraJDJ  
    OP
       2017-01-14 15:40:13 +08:00 via Android
    @Kilerd 刚才查了一下,好像跟防注入没太大关系的样子,能否详细解释下吗?
    ryd994
        4
    ryd994  
       2017-01-14 16:12:01 +08:00
    @DoraJDJ 简单拼接字符串才要担心注入
    ORM 会帮你过滤数据,所以一般不用担心
    DoraJDJ
        5
    DoraJDJ  
    OP
       2017-01-14 16:48:39 +08:00 via Android
    @ryd994 不过我查过资料 MongoDB 好像是 ODM , ODM 和 ORM 有什么差异吗?
    nullzz
        6
    nullzz  
       2017-01-14 18:22:49 +08:00 via iPhone
    从 cnodejs 的 mongodb 注入来看, nodejs 和 php 一样支持参数数组传参,即 req.query.id 获取到的值可以是个数组比如请求 index?id[$regex]=1 后端获取到的 id 值为{"$ne": 1}
    限制你请求的参数的值只能为字符串,就不可能注入
    DoraJDJ
        7
    DoraJDJ  
    OP
       2017-01-14 18:30:06 +08:00
    @nullzz 刚才我简单地用 Koa 整了一个试验环境,照你这样做好像并没发生什么

    用 koa-router 写了个路由

    router.get('/testing', function *(next) {
    var str = this.query.value;
    if (!str) {
    this.body = 'Invaild';
    } else {
    this.body = str;
    }
    });

    然后我尝试请求 /testing?value[$val]=233 ,返回的是 Invaild
    DoraJDJ
        8
    DoraJDJ  
    OP
       2017-01-14 18:31:18 +08:00
    @DoraJDJ 把 str 的声明改成 this.query 后返回的结果是: {"value[$val]":"233"}
    nullzz
        9
    nullzz  
       2017-01-14 18:36:17 +08:00 via iPhone
    看样子我理解有误,有意思,看下这个 http://static.hx99.net/static/bugs/wooyun-2015-0112230.html
    DoraJDJ
        10
    DoraJDJ  
    OP
       2017-01-14 18:47:37 +08:00
    @nullzz 看上去是使用的框架不同,操作行为也不同

    至少我在 Koa 里操作是不会出现这种问题的,可以先放松一会了
    binux
        11
    binux  
       2017-01-14 18:58:15 +08:00
    @DoraJDJ /testing?$val=233
    DoraJDJ
        12
    DoraJDJ  
    OP
       2017-01-14 18:59:27 +08:00 via Android
    @binux 哈哈,了解了,有意思,我去看一下。
    DoraJDJ
        13
    DoraJDJ  
    OP
       2017-01-14 19:03:37 +08:00
    @binux
    /testing?$val=233 返回 {"$val":"233"}

    应该还是有可利用的空间吧?像这种字符串得怎么搞定?
    binux
        14
    binux  
       2017-01-14 19:44:01 +08:00
    @DoraJDJ 不从客户端接受 key ,不从客户端直接接受 json ,应该就可以了吧
    nullzz
        15
    nullzz  
       2017-01-14 19:51:46 +08:00 via iPhone
    @binux 哈哈,长见识了 KOA 还可以这样
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1039 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 20:19 · PVG 04:19 · LAX 12:19 · JFK 15:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.