MongoDB如何有效防止注入式攻击?



  • 和SQL数据库一样,MongoDB也存在注入式攻击的风险,如何有效地避免呢?


  • Lv 1

    @x4_965be

    來個注入攻擊範例吧?

    防止就是不允許的資料不給餵進 mgo


  • 註冊用戶

    這裡有提到 NoSQL injection

    https://www.owasp.org/index.php/Testing_for_NoSQL_injection


  • 大中华区MongoDB顾问

    很难。注入的本质是用一种语言操纵另一种语言的语句,被操纵的语言不会问执行的是什么,操纵的语言又没有做足够的安全验证就把从客户处得到的“数据”传给被操纵方。而这些“数据”其实是带有攻击性的语句。比如:

    var sql = "SELECT * FROM Users WHERE USER_NAME='admin' AND PWD='" + pwd + "'";

    如果pwd="1' OR 1=1 --",整条语句就变成了

    SELECT * FROM Users WHERE USER_NAME='admin' AND PWD='1' OR 1=1 --';

    如果对MongoDB的驱动比较熟悉,可以发现很少会有机会进行这样的拼语句操作。以NodeJS为例,

    collection.find({
      user: "admin",
      pwd: pwd
    }, function(err, docs) {
      // do something
    });

    可见无论pwd等于什么值,它都不可能影响到整个查询的语义。其他语言的驱动原理也是类似,所以注入是比较困难的。

    但也并非不可能。比如使用db.eval()去执行一段自己拼出来的语句,则可能出现跟SQL一样的问题。不过通常我们不建议使用db.eval()。理论上db.eval()也都可以转换成其他写法,所以在正常使用MongoDB驱动的时候不必过于担心注入的问题。


  • 註冊用戶

    其實在client端與server端再寫些代碼過濾變數也能有效防止注入式攻击



  • @zhangyaoxing

    在密码输入框输入 1' OR 1=1 --  字符串,就被注入,这是因为其资料表存储密码是 明码存储的,完全不符合资安,所以才会被注入:

    SELECT * FROM Users WHERE USER_NAME='admin' AND PWD='1' OR 1=1 --';

     如果资料表存储密码是加密存储的,那么在应用程序里,就应该把用户在密码输入框里的输入的字符串进行加密后再存储,

    如,用户输入:1' OR 1=1 -- ,进行加密,加密后是:

    M6SYvVWnJpSKyS9qzYBNpxWyc5PQi3zGvf4FcQ8Y47Yfw3VlezMgl6sOL4odEUT3PxG76LnuI+J1K9xcC64jAgkQNKs2rQLN0kgsXwNT335L+bliPxnPzViUlvt4e2nx9AqpWA

    那么其SQL语句就变成:

    SELECT * FROM Users WHERE USER_NAME='admin' 
    AND PWD='M6SYvVWnJpSKyS9qzYBNpxWyc5PQi3zGvf4FcQ8Y47Yfw3VlezMgl6sOL4odEUT3PxG76LnuI+J1K9xcC64jAgkQNKs2rQLN0kgsXwNT335L+bliPxnPzViUlvt4e2nx9AqpWA';

    这样就不会发生注入了,还可以加盐。

    所以,MongoDB也可以在客户端进行加密再存储,道理是一样的。

    至于,@Kenji 说在客户端过虑变数,不建议这样做,假设用户A的密码是:ae--23f, 用户B的密码是:ae23f--,

    被你一滤掉“--”,那么用户A与用户B的密码都是一样的:ae23f,万一用户C的密码是ae23f,那么就三个人的密码都一样。

    故,客户端必须进行加密,资料库存密码必须密文存储,才是万全之策。


登录后回复
 

与 萌阔论坛 的连接断开,我们正在尝试重连,请耐心等待