补充模块importlib
介绍
importlib模块是Python中用于动态加载和导入模块的内置模块。它提供了一组函数和类,使得我们可以在运行时根据需要加载模块,并且可以对已导入的模块进行操作和管理。
动态加载模块
python
# 导入模块 : 动态加载一个模块
import importlib
# 定义模块的名字
module_name = 'math'
# 动态导入模块
math_module = importlib.import_module(module_name)
导入指定模块成员
python
# 导入模块 : 动态加载一个模块
import importlib
# 定义模块的名字
module_name = 'math'
# 动态导入模块
math_module = importlib.import_module(module_name)
# 从模块中获取相关的值
sqrt_func = getattr(math_module, 'sqrt')
print(sqrt_func) # <built-in function sqrt>
重新加载模块
python
import importlib
# 要重新加载的模块名
module_name = 'my_module'
# 加载模块
my_module = importlib.import_module(module_name)
# 重新加载模块
my_module = importlib.reload(my_module)
获取已导入的模块列表
python
import sys
for module_name, module in sys.modules.items():
print(module_name, module)
CSRF跨域请求伪造
介绍
CSRF(Cross-Site Request Forgery)跨站请求伪造是一种常见的网络攻击方式。
攻击者通过诱导受害者访问恶意网站或点击恶意链接
将恶意请求发送到目标网站上
利用受害者在目标网站中已登录的身份来执行某些操作
从而达到攻击的目的。
要保护自己免受CSRF攻击,网站开发者可以采取以下措施:
- 使用CSRF令牌: - 在用户的请求中添加随机生成的令牌,并将该令牌保存在用户会话中。 - 每次提交请求时都会验证该令牌,以确保请求是合法的。 - 启用SameSite属性: - 将Cookie的SameSite属性设置为Strict或Lax,以限制跨站请求。 - 这可以在一定程度上缓解CSRF攻击。 - 严格验证请求来源: - 服务器端可以验证请求的来源是否为预期的网站域名 - 例如检查HTTP Referer头部。 - 使用验证码: - 在敏感操作(如转账、更改密码等)上使用验证码 - 增加用户身份验证的防护。
正常服务端
页面
html
<h1>这是正规的网站</h1>
<form action="" method="post">
<p>当前账户 :>>>> <input type="text" name="start_user"></p>
<p>目标账户 :>>>> <input type="text" name="end_user"></p>
<p>转账金额 :>>>> <input type="text" name="money"></p>
<input type="submit">
</form>
视图函数
python
def transform_normal(request):
if request.method == "POST":
user_start = request.POST.get("start_user")
user_end = request.POST.get("end_user")
money = request.POST.get("money")
return HttpResponse(f"当前账户 :>>> {user_start} 向目标用户 :>>> {user_end} 转账了 :>>> {money}")
return render(request, 'transform_normal.html')
钓鱼服务端
页面
html
<h1>这是钓鱼的网站</h1>
<form action="http://127.0.0.1:8000/transform_normal/" method="post">
<p>当前账户 :>>>> <input type="text" name="start_user" ></p>
<p>目标账户 :>>>> <input type="text"></p>
<p><input type="text" name="end_user" value="Hopes" style="display: none"></p>
<p>转账金额 :>>>> <input type="text" name="money"></p>
<input type="submit">
</form>
视图函数
python
def transform_normal(request):
return render(request, 'transform_normal.html')
crsf校验
form表单校验
html
<form action="" method="post">
{% csrf_token %}
<p>username:<input type="text" name="username"></p>
<p>transfer_user<input type="password" name="password"></p>
<p>money<input type="text" name="money"></p>
<input type="submit">
</form>
ajax校验
html
<button id="b1">ajax请求提交</button>
<script>
$("#b1").click(function () {
$.ajax({
url: '',
type: 'post',
// (2) 利用模板语法提供的快捷书写
data: {"username": "dream",
"csrfmiddlewaretoken": "{{ csrf_token }}"},
success: function () {
}
})
})
</script>
Auth模块
引入
我们在创建一个Django项目之后,直接执行数据库迁移命令会自动生成很多表,其中有:
django_session、uth_user两张表。
jango在启动之后就可以直接访问admin路由,需要输入用户名和密码,数据参考的就是auth_user表,并且必须是管理员用户才能进入
创建超级用户(管理员)
html
python3 manage.py createsuperuser
依赖于auth_user表完成登录注册功能
页面
html
<form action="" method="post">
{% csrf_token %}
<p>username:<input type="text" name="username"></p>
<p>password:<input type="text" name="password"></p>
<input type="submit" class="btn btn-success">
</form>
视图函数
python
def login(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
user_obj = auth.authenticate(request, username=username, password=password)
print(user_obj)
print(user_obj.username)
print(user_obj.password)
print(user_obj)
return render(request, 'login.html')