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

2017-03-24 10:14:16 +08:00
 dikT

求检查以下代码.

只要是我想通过执行:

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, 但是他会变成奇奇怪怪的东西,所以只好直接拼接

1609 次点击
所在节点    问与答
3 条回复
dikT
2017-03-24 10:53:39 +08:00
求数据库爆破大神回复 - -!
holystrike
2017-03-24 11:15:59 +08:00
sqlmap 走起
dikT
2017-03-24 12:32:07 +08:00
@holystrike thanks

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/349939

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX