首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以使用字符串concatenation+eval()构建SQLAlchemy查询,还是有更好的替代方案?

是否可以使用字符串concatenation+eval()构建SQLAlchemy查询,还是有更好的替代方案?
EN

Stack Overflow用户
提问于 2019-07-24 16:00:15
回答 1查看 264关注 0票数 0

我使用React Admin作为我的前端,它使用烧瓶-Restful调用我的API。

当我使用过滤器时,它会在dict中发送一个键值对。根据一次使用筛选器的数量,可以从我的API中请求0到3个键值对。

我已经成功地使用了一系列if语句来查看键是否在dict中,以及是否正在将过滤器的相应部分添加到查询中。

但是,我听说使用eval()是不安全的,因为其他人可以向您的应用程序中注入代码。我相信,因为我正在设定字符串,这是不可能的。这是安全的使用,还是有更好的方法来设置查询使用烧瓶-sqlalchemy?

代码语言:javascript
复制
    def find_all(cls, sort, fltr):
        order = sort[1]
        if order == 'ASC':
            s = sort[0]
        else:
            s = sort[0] + " desc"
        query_name = "cls.query."
        if "T" in fltr:
            query_name += 'filter(cls.title.like("%"+fltr["T"]+"%")).'
        if "c" in fltr:
            if fltr['c']:
                query_name += "filter_by(complete=False)."
        if "a" in fltr:
            query_name += 'filter(cls.assigned_id.like("%"+str(fltr["a"])+"%")).'
        query_name += 'order_by(s).all()'
        return eval(query_name)

其中fltr是最重要的。

这是很好的工作,虽然它的安全使用在一个网络应用?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-24 16:08:05

这里有两个截然不同的问题。

安全吗?

因为查询只能由由您自己编写和审计的常量子字符串组成的段组成,所以yes。如果您曾经将用户提供的数据替换到这些查询中,那就不再是真的了。

这是很好的练习吗?

绝对不是。存在性能损失、可读性损失、正确性损失(因为静态检查工具无法读取隐藏在eval()后面的语句的AST ),而且如果将来有人想在用户提供的数据中替换,那么原始代码使他们更容易选择字符串替换路由并在以后引入漏洞。

相反,请考虑:

代码语言:javascript
复制
    def find_all(cls, sort, fltr):
        order = sort[1]
        if order == 'ASC':
            s = sort[0]
        else:
            s = sort[0] + " desc"
        q = cls.query
        if "T" in fltr:
            q = q.filter(cls.title.like("%"+fltr["T"]+"%"))
        if "c" in fltr and fltr['c']:
            q = q.filter_by(complete=False)
        if "a" in fltr:
            q = q.filter(cls.assigned_id.like("%"+str(fltr["a"])+"%"))
        return q.order_by(s).all()
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57187033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档