我使用React Admin作为我的前端,它使用烧瓶-Restful调用我的API。
当我使用过滤器时,它会在dict中发送一个键值对。根据一次使用筛选器的数量,可以从我的API中请求0到3个键值对。
我已经成功地使用了一系列if语句来查看键是否在dict中,以及是否正在将过滤器的相应部分添加到查询中。
但是,我听说使用eval()是不安全的,因为其他人可以向您的应用程序中注入代码。我相信,因为我正在设定字符串,这是不可能的。这是安全的使用,还是有更好的方法来设置查询使用烧瓶-sqlalchemy?
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是最重要的。
这是很好的工作,虽然它的安全使用在一个网络应用?
发布于 2019-07-24 16:08:05
这里有两个截然不同的问题。
安全吗?
因为查询只能由由您自己编写和审计的常量子字符串组成的段组成,所以yes。如果您曾经将用户提供的数据替换到这些查询中,那就不再是真的了。
这是很好的练习吗?
绝对不是。存在性能损失、可读性损失、正确性损失(因为静态检查工具无法读取隐藏在eval()后面的语句的AST ),而且如果将来有人想在用户提供的数据中替换,那么原始代码使他们更容易选择字符串替换路由并在以后引入漏洞。
相反,请考虑:
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()https://stackoverflow.com/questions/57187033
复制相似问题