在Web开发中,身份验证和权限控制是很重要的一部分。在使用Flask框架开发网站时,我们可能需要实现IP黑名单功能来限制特定IP地址的访问。这篇文章将详细介绍如何使用Flask框架实现IP黑名单功能。
在开始使用Flask框架实现IP黑名单功能之前,我们需要先安装Flask框架。可以使用以下命令在终端中安装:
pip install Flask
接下来,我们需要创建一个Flask应用。在项目目录下创建一个名为app.py
的文件,并添加以下代码:
from flask import Flask, request, abort app = Flask(__name__) @app.route('/') def index(): return 'Hello, World!' if __name__ == '__main__': app.run()
为了实现IP黑名单功能,我们需要记录访问者的IP地址,并在每次请求时检查该IP地址是否在黑名单中。如果IP地址在黑名单中,我们将拒绝访问并返回403禁止访问状态码。以下是实现IP黑名单功能的代码:
from flask import Flask, request, abort app = Flask(__name__) # 定义一个IP黑名单列表,可以根据需要添加或删除IP地址 ip_blacklist = ['192.168.1.1', '192.168.1.2'] @app.before_request def check_ip_blacklist(): # 获取访问者的IP地址 client_ip = request.remote_addr # 检查IP地址是否在黑名单中 if client_ip in ip_blacklist: # 如果IP地址在黑名单中,返回403禁止访问状态码并结束请求处理过程 abort(403) @app.route('/') def index(): return 'Hello, World!' if __name__ == '__main__': app.run()
在上面的代码中,我们使用了before_request
装饰器来在每次请求之前执行check_ip_blacklist
函数。这个函数会获取访问者的IP地址,并检查其是否在黑名单中。如果IP地址在黑名单中,我们将调用abort
函数返回403禁止访问状态码并结束请求处理过程。这样,黑名单中的IP地址将无法访问我们的网站。
现在,我们可以运行我们的Flask应用并测试IP黑名单功能。确保你已经安装了Flask框架,在项目目录下运行以下命令启动Flask应用:
python app.py
接下来,我们尝试使用不同的IP地址访问我们的网站。我们可以使用浏览器访问http://127.0.0.1:5000/
,或者使用curl
命令行工具访问:
curl http://127.0.0.1:5000/
如果我们使用的IP地址在黑名单中(例如192.168.1.1
),我们将看到403禁止访问状态码。否则,我们将看到"Hello, World!"的欢迎信息。这表明我们的IP黑名单功能已经生效。
在实际开发中,我们可能需要根据需要动态更新IP黑名单。例如,当检测到恶意攻击时,我们可能需要将攻击者的IP地址添加到黑名单中。为了实现这一功能,我们可以将IP黑名单存储在一个文件中,并在需要时读取和更新该文件。以下是实现动态更新IP黑名单的代码:
from flask import Flask, request, abort, jsonify, send_from_directory import os import time import json import socket server_host = '' server_port = 5000 blacklist_file = 'blacklist.txt' app = Flask(__name__) # 读取IP黑名单文件 def read_blacklist_file(): try: with open(blacklist_file, 'r') as f: return f.read().splitlines() except Exception as e: # 如果读取文件失败,返回一个空列表 print(e) return [] # 写入IP黑名单文件 def write_blacklist_file(blacklist): with open(blacklist_file, 'w') as f: f.write('\n'.join(blacklist)) # 获取本机IP地址 def get_ip_address(): try: s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect(('8.8.8.8', 80)) return s.getsockname()[0] except: return 'localhost' # 定义一个IP黑名单列表,可以根据需要添加或删除IP地址 ip_blacklist = read_blacklist_file() @app.before_request def check_ip_blacklist(): # 获取访问者的IP地址 client_ip = request.remote_addr # 检查IP地址是否在黑名单中 if client_ip in ip_blacklist: # 如果IP地址在黑名单中,返回403禁止访问状态码并结束请求处理过程 abort(403) @app.route('/') def index(): return 'Hello, World!' @app.route('/ip', methods=['GET']) def get_ip(): return jsonify({'ip': request.remote_addr}) @app.route('/blacklist', methods=['GET']) def get_blacklist(): return jsonify({'blacklist': ip_blacklist}) @app.route('/blacklist', methods=['POST']) def add_to_blacklist(): if 'ip' in request.form: ip = request.form['ip'] if ip not in ip_blacklist: ip_blacklist.append(ip) write_blacklist_file(ip_blacklist) return jsonify({'status': 'ok', 'message': 'IP address added to blacklist.'}) else: return jsonify({'status': 'error', 'message': 'IP address already in blacklist.'}) else: return jsonify({'status': 'error', 'message': 'Missing IP address parameter.'}) if __name__ == '__main__': # 获取本机IP地址 server_host = get_ip_address() # 启动Flask应用 app.run(host=server_host, port=server_port)
在上面的代码中,我们使用一个blacklist.txt
文件存储IP黑名单。在启动Flask应用时,我们首先读取blacklist.txt
文件,并将其中的IP地址添加到ip_blacklist
列表中。我们还实现了三个路由函数:/ip
返回访问者的IP地址,/blacklist
返回当前的IP黑名单列表,/blacklist
接受POST请求以将IP地址添加到黑名单中。当我们调用/blacklist
路由函数以添加IP地址时,我们将更新blacklist.txt
文件。
现在,我们可以运行我们的Flask应用并测试IP黑名单功能。在终端中进入项目目录,运行以下命令启动Flask应用:
python app.py
接下来,我们可以使用浏览器或者curl
命令行工具访问不同的路由函数,例如http://127.0.0.1:5000/
、http://127.0.0.1:5000/ip
和http://127.0.0.1:5000/blacklist
。我们还可以使用curl
命令行工具向/blacklist
路由函数发送POST请求以添加IP地址到黑名单中:
curl -X POST -d "ip=192.168.1.1" http://127.0.0.1:5000/blacklist
现在,我们已经学会了如何使用Flask框架实现IP黑名单功能,以及如何动态更新IP黑名单。希望这篇文章对你有所帮助,如果你有任何疑问或建议,请在评论区留言。感谢观看!
关注点赞评论,感谢支持!