python - eval() 的更好替代方案
问题描述
我正在寻找 python 字符串评估器的替代品eval()
from telethon import Button
c = "Click Here To Open Google | [Button.url('Google', 'google.com')]"
if "|" in c:
filter, options= c.split("|")
filter = filter.strip()
button = options.strip()
g = eval(button)
await event.reply(filter, buttons=g)
这里的使用与此相关eval()
是危险的,我可以用什么替代?
解决方案
一个更安全的替代方法是ast.literal_eval
,但与 相比,它非常受限制eval()
,仅适用于代表有效 Python 文字的字符串,至少对于您的示例而言。
更好的建议是自己解析字符串,首先您可以使用正则表达式获取两个参数:
import re
c = "Click Here To Open Google | [Button.url('Google', 'google.com')]"
if "|" in c:
filter, options= c.split("|")
filter = filter.strip()
button = options.strip()
params = re.findall(r'\'(.*)\'',button)
它返回["Google', 'google.com"]
in 的列表params
。
然后你可以if
用来检查它是否包含恶意输入,如果然后修改它或阻止用户,否则解压到使用的方法Button.url(*params)
推荐阅读
- sql - 划分数据记录
- python-3.x - 如果日期相同,如何从另一个数据框中填充列值
- file - 但是为什么我通过 `heroku ps:exec` 所做的更改没有生效?
- c# - EF6 缓慢的首次查询对部署的影响
- javascript - 水平条形图索引关闭
- tensorflow - 让 Tensorflow 自动检测和使用 XLA GPU
- postgresql - How do I compare two TIMESTAMP columns to check for a difference of at most 15 minutes?
- php - 如何让下面的代码先用php开始,再用html
- php - 如何使用php中的rest api将用户个人资料地址发送给followupboss
- android - 智能转换为“Int”是不可能的,因为“mViewModel.counter.value”是一个复杂的表达式