Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python flask中下载链接中的哈希int_Python_Flask - Fatal编程技术网

Python flask中下载链接中的哈希int

Python 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

我已经使用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_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",
        )