V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
dikT
V2EX  ›  问与答

不想老老实实写 SQL,也不想用 ORM,求检查以下代码

  •  
  •   dikT · 2017-03-24 10:14:16 +08:00 · 1605 次点击
    这是一个创建于 2587 天前的主题,其中的信息可能已经有所发展或是发生改变。

    求检查以下代码.

    只要是我想通过执行:

    db.query(table='users', columns=['name', 'money'], locate={'group': 'customer'}, order_by='money desc', limit=10)
    

    这样的操作来进行查询,以及插入,修改什么的.

    但是应该有很大的安全隐患, 因为我用的是 psql, 所以 我可以 $$ 来代替 单引号('),并且过滤掉用户的 $ 符号,这样的话,如果还有安全问题应该是出现在哪里?

    以下是 db 类提取出来的两个方法

    def group_location(self, locate={}):
        cond = dict(locate)
        args = []
        sql = ' WHERE '
        if 'union' in cond:
            union = cond['union']
            del cond['union']
        else:
            union = ' AND '
        for k, v in cond.items():
            if isinstance(v, str):
                if v.startswith('%') or v.endswith('%'):
                    sql += "%s LIKE %%s" % k
                else:
                    sql += "%s=%%s" % k
                args.append(v)
            elif isinstance(v, int) or isinstance(v, float):
                sql += "%s=%%s" % k
                args.append(v)
            elif isinstance(v, list):
                sql += '%s in (%s)' % (k, ','.join(['%s'] * len(v)))
                args.extend(v)
            sql += union
        return sql[:-5], tuple(args)
    
    
    def query(self, table=None, columns=None, locate={}, order_by='', limit=0):
        sql = "SELECT %s FROM %s " % (','.join(columns), table,)
    
        args = ()
        if locate:
            sql_cond, args = group_location(locate)
            sql += sql_cond
        if order_by:
            sql += ' ORDER BY %s' % order_by
            # args += (order_by, )
        if limit:
            sql += ' LIMIT %s' % limit
            # args += (limit, )
    
        cursor = self.__getCursor()
        # print(sql, '--sql')
        cursor.execute(sql, args)
    

    其实,我也想把 order,limit 里面的东西也放进 args, 但是他会变成奇奇怪怪的东西,所以只好直接拼接

    3 条回复    2017-03-24 12:32:07 +08:00
    dikT
        1
    dikT  
    OP
       2017-03-24 10:53:39 +08:00
    求数据库爆破大神回复 - -!
    holystrike
        2
    holystrike  
       2017-03-24 11:15:59 +08:00   ❤️ 1
    sqlmap 走起
    dikT
        3
    dikT  
    OP
       2017-03-24 12:32:07 +08:00
    @holystrike thanks
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3591 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 00:06 · PVG 08:06 · LAX 17:06 · JFK 20:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.