python静态框架_Python的Flask框架及Nginx实现静态文件访问限制功能

本文介绍了如何通过Nginx的XSendfile功能和Flask框架,实现对用户上传静态文件的访问权限限制。在Flask中设置X-Accel-Redirect头,并结合Nginx的internal指令,确保只有登录用户才能访问特定的静态资源。通过示例代码展示了具体的实现步骤。
摘要由CSDN通过智能技术生成

@app.router('/user/idcard'):

def user_idcard_page():

if user is login:

return '

Pemission Denied

', 403

可是这样的处理,还有一个问题,静态文件是交给 nginx 处理的,如果hacker找到了文件的绝对地址,直接访问 http://www.example.com/upload/user/xxx.png也是可以的。恰巧这些文件又涉及用户隐私,比如用户上传的身份证照片。那么码农可不希望第二天媒体报道,知名网站XXX存在漏洞,Hacker获取了用户身份证等信息。

为了做这样的限制,可以借助 Nginx 的一个小功能----XSendfile。 其原理也比较简单,大概就是使用了请求重定向。

我们知道,如果用Nginx做服务器前端的反向代理,一个请求进来,nginx先补捉到,然后再根据规则转发给后端的程序处理,或者直接处理返回。前者处理一些动态逻辑,后者多是处理静态文件。因此上面那个例子中,直接访问静态文件的绝对地址,Nginx就直接返回了,并没有调用后端的 user_idcard_page做逻辑限制。

为了解决这个问题,nginx提供的 XSendfile功能,简而言之就是用 internal 指令。该指令表示只接受内部的请求,即后端转发过来的请求。后端的视图逻辑中,需要明确的写入X-Accel-Redirect这个headers信息。

伪代码如下:

location /upload/(.*) {

alias /vagrant/;

internal;

}

@app.router('upload/')

@login_required

def upload_file(filename):

response = make_response()

response['Content-Type'] = 'application/png'

response['X-Accel-Redirect'] = '/vagrant/upload/%s' % filename

return response

经过这样的处理,就能将静态资源进行重定向。这样的用法还是比较常见的,很多下载服务器可以通过这样的手段针对用户的权限做下载处理。

Flask

Flask是我喜欢的web框架,Flask甚至实现了一个 sendfile的方法,比上面的做法还简单。我用vagrant作了一个虚拟机,用Flask实现了上面的需求,具体代码如下:

项目结构

project struct

project

app.py

templates

static

0.jpeg

upload

0.jpeg

nginx的配置 nginx conf

web.conf

server {

listen 80 default_server;

# server_name localhost;

server_name 192.168.33.10;

location / {

proxy_pass http://127.0.0.1:8888;

proxy_redirect off;

proxy_set_header Host $host:8888;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}

# 正常的静态文件

location /static/(.*) {

root /vagrant/;

}

# 用户上传的文件,需要做权限限制

location /upload/(.*) {

alias /vagrant/;

internal; # 只接受内部请求的指令

}

}

Flask 代码

app.py

from functools import wraps

from flask import Flask, render_template, redirect, url_for, session, send_file

app = Flask(__name__)

app.config['SECRET_KEY'] = 'you never guess'

def login_required(f):

@wraps(f)

def decorated_function(*args, **kwargs):

if not session.get('login'):

return redirect(url_for('login', next=request.url))

return f(*args, **kwargs)

return decorated_function

@app.route('/')

def index():

return 'index'

@app.route('/user')

@login_required

def user():

return render_template('upload.html')

# 用户上传的文件视图处理,在此处返回请求给nginx

@app.route('/upload/')

@login_required

def upload(filename):

return send_file('upload/{}'.format(filename))

@app.route('/login')

def login():

session['login'] = True

return 'log in'

@app.route('/logout')

def logout():

session['login'] = False

return 'log out'

if __name__ == '__main__':

app.run(debug=True)

简单部署

gunicorn -w4 -b0.0.0.0:8888 app:app --access-logfile access.log --error-logfile error.log

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:php中文网

本站所有资源全部来源于网络,若本站发布的内容侵害到您的隐私或者利益,请联系我们删除!

合作方式

Copyright © 2004-2018 https://www.gxlcms.com/. All Rights Reserved.

豫ICP备19030742号

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值