Python flask中下载链接中的哈希int
我已经使用flask开发了一个web应用程序。 在pentesting报告中,它说,如果下载功能有一个静态链接,那么下载链接应该是不可预测的。 所以我应该在下载链接中更改intPython flask中下载链接中的哈希int,python,flask,Python,Flask,我已经使用flask开发了一个web应用程序。 在pentesting报告中,它说,如果下载功能有一个静态链接,那么下载链接应该是不可预测的。 所以我应该在下载链接中更改int @app.route('/course/download/<str:token>/csv', methods=['GET', 'POST']) def export_csv(token): try: data = jwt.decode(token, current_app.secret
@app.route('/course/download/<str:token>/csv', methods=['GET', 'POST'])
def export_csv(token):
try:
data = jwt.decode(token, current_app.secret_key, algorithms=["HS256"])
except jwt.exceptions.InvalidTokenError:
return "invalid token", 401
group_id = data["group_id"]
group = Group.query.get(group_id)
file_name = str.lower(group.title) + ".csv"
messages = Message.query.filter(Message.to_id == group.chat_id).order_by(Message.date.asc()).all()
temp = os.path.join(app.root_path, 'temp')
export_csv(messages, os.path.join(temp, file_name))
return send_from_directory(directory=temp, file_name=file_name, as_attachment=True,
attachment_filename=file_name)
html:
|
routes.py:
@app.route('/course/download/<int:group_id>/csv', methods=['GET', 'POST'])
def export_csv(group_id):
group = Group.query.get(group_id)
file_name = str.lower(group.title) + ".csv"
messages = Message.query.filter(Message.to_id == group.chat_id).order_by(Message.date.asc()).all()
temp = os.path.join(app.root_path, 'temp')
export_csv(messages, os.path.join(temp, file_name))
return send_from_directory(directory=temp, file_name=file_name, as_attachment=True,
attachment_filename=file_name)
@app.route('/course/download//csv',methods=['GET','POST'])
def导出csv(组id):
group=group.query.get(group\u id)
文件名=str.lower(group.title)+“.csv”
messages=Message.query.filter(Message.to\u id==group.chat\u id).order\u by(Message.date.asc()).all()
temp=os.path.join(app.root\u路径,“temp”)
导出csv(消息、os.path.join(临时文件、文件名))
从目录返回发送目录(目录=临时,文件名=文件名,作为附件=真,
附件(文件名=文件名)
我怎样才能做到这一点呢?你可以用它来交换下载链接
@app.route('/course/download/<str:token>/csv', methods=['GET', 'POST'])
def export_csv(token):
try:
data = jwt.decode(token, current_app.secret_key, algorithms=["HS256"])
except jwt.exceptions.InvalidTokenError:
return "invalid token", 401
group_id = data["group_id"]
group = Group.query.get(group_id)
file_name = str.lower(group.title) + ".csv"
messages = Message.query.filter(Message.to_id == group.chat_id).order_by(Message.date.asc()).all()
temp = os.path.join(app.root_path, 'temp')
export_csv(messages, os.path.join(temp, file_name))
return send_from_directory(directory=temp, file_name=file_name, as_attachment=True,
attachment_filename=file_name)
在jwt的数据部分,您还可以包括用户ID,然后检查当前登录的用户是否对应于它用于下载的url。(如果您有身份验证)
另一种需要使用数据库的方法是只更改随机长字符串的标记,然后在数据库中存储随机字符串和组ID之间的关系
当然,任何类型的加密字符串都可以工作;但是使用JWT可以为您提供一个完善的协议,您也可以使用该协议传递组id甚至用户id的数据。但是请注意,任何使用令牌的人都可以读取此类数据,因为数据本身没有加密。您使用的是哪种版本的JWT?有些版本没有编码方法您所说的版本是什么意思?你和你提到的有什么联系吗?还是说算法?
import jwt
from datetime import datetime, timedelta
JWT_EXP_DELTA_SECONDS = 20000
group_id = 25
token = jwt.encode(
{"group_id": group_id , "exp": datetime.utcnow() + timedelta(seconds=JWT_EXP_DELTA_SECONDS)}, # exp is optional, but you can use it if you want the download link only to work during a certain period of time
current_app.config["INVITES_SECRET"],
algorithm="HS256",
)