将跨站请求伪造和验证码的东西记一下

CSRF

Cross Site Request Forgery。跨站请求伪造

链接:GET请求;表单:POST请求

某些恶意的网站上,包含链接、表单、按钮、JavaScript。利用用户在浏览器上的认证信息试图在网站上完成某些操作,称为CSRF(跨站请求伪造)

例子:

设计两个页面,一个用于提交请求(POST),一个用于展示请求提交的数据

booktest/urls.py

urlpatterns = [
url('^csrf1$',views.csrf1, name="csrf1"),
url('^csrf2$',views.csrf2, name="csrf2"),
]

booktest/views.py

def csrf1(request):
context = {}
return render(request, 'booktest/csrf1.html', context) def csrf2(request):
uname = request.POST['uname']
context = {'uname': uname}
return render(request, 'booktest/csrf2.html', context)

templates/booktest/csrf1.html

<body>
<form method="post" action="/booktest/csrf2">
<input type="text" name="uname"/>
<input type="submit" value="提交"/>
</form>
</body>

templates/booktest/csrf2.html

<body>
{{ uname }}
</body>

输入姓名,点击提交按钮,会出现如下效果

出现这个是因为django默认使用了CSRF的认证。把Django中的CSRF功能关闭

django4/settings.py

MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
#'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware',
)

改成发布模式

django4/settings.py

DEBUG = False

ALLOWED_HOSTS = ['*']

然后,启动服务器。需要带上IP地址

python manage.py runserver 192.168.30.2:8080

此时,在浏览器上访问服务器的时候,输入的URL是 http://192.168.30.2:8080/booktest/csrf1

注意:现在是真实访问服务器的场景。

任意提交数据,都可以在csrf2中显示(比如嵌入一段html代码)

<script>
for(;;) alert(123);
</script>

另外,还有一种可能。现在访问服务器上的URL http://192.168.30.2:8080/booktest/csrf1 获得一个网页的时候,可以把网页的源码抠下来。

MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware',
)

但是禁止了CSRF结果就会连自己都无法访问了(http://192.168.30.2:8080/booktest/csrf1 )所以不能这样做。

防止跨域攻击的方法:在csrf1.html中,在表单中添加一个标签

<body>
<form method="post" action="/booktest/csrf2">
{% csrf_token %}
<input type="text" name="uname"/>
<input type="submit" value="提交"/>
</form>
</body>

此时,访问http://192.168.30.2:8080/booktest/csrf1 的时候,查看源码,会发现表单中多了一项

这个就是CSRF的保护措施了

此时,只有在服务器的URL http://192.168.30.2:8080/booktest/csrf1 给 http://192.168.30.2:8080/booktest/csrf2 发送请求,才能接收。而在本地的URL file:///D:/gz1833_python/20180918/test.html 给http://192.168.30.2:8080/booktest/csrf2 发送请求,则会有403的错误(Forbidden CSRF verification failed)。

验证码

验证码的作用:防爬虫、减轻服务器的压力、防CSRF

原理:画一张图。图片上随机输出几个字。要求登录的人输入值要和图片随机生成的值一致

首先,我们要让服务器返回一张图片,需要安装一个库pillow

pip install pillow

安装后在python终端尝试:

from PIL import Image, ImageDraw, ImageFont

# Image:画布
# ImageDraw:画笔
# ImageFont:字体(推荐使用一个字体库FreeFont) # 注意:访问服务器的图片,响应头中的MIME类型必须为image/png或image/jpeg(之前都是text/html)

编写返回图片验证码的代码

booktest/urls.py

urlpatterns = [
url('^verifyCode$',views.verifyCode, name="verifyCode"),
]

booktest/views.py

def verifyCode(request):
from PIL import Image, ImageDraw, ImageFont
import random
# 规定宽高 宽和高的比例决定验证码的长度是多少 这里是100/25=4
width = 100
height = 25
# 背景色
bgColor = (63,63,63) # 较深
# 创建画布
# 参数1 mode 模式 RGB
# 参数2 size 长度为2的元组 (width, height)
# 参数3 color 画布的背景色 长度为3的元组 (R,G,B)
image = Image.new('RGB', (width, height), bgColor)
# 创建画笔
# 参数1 im 画布对象
# 参数2 mode 模式 默认为None
draw = ImageDraw.Draw(image)
# 创建字体
# 参数1 font 字体文件
# 参数2 字体大小
font = ImageFont.truetype('FreeMono.ttf', 24)
# 文字
text = ''
textTemp = ''
# 逐个描绘字符
for i in range(4):
textTemp1 = text[random.randrange(0,len(text))]
textTemp += textTemp1
# 使用画笔对象在画布上描绘字符
# 参数1 xy 要描绘的字符左上角的坐标 长度为2的元组
# 参数2 text 要描述的字符
# 参数3 fill 要描述的字符的颜色
# 参数4 font 字体
draw.text((i*25,0), textTemp1, (255,255,255), font) print(textTemp)
# 把画布保存到内存中
#import cStringIO # python2的内存库
import io # python3中的内存库
buf = io.BytesIO()
image.save(buf, 'png')
# 将内存流中的内容输出到客户端
return HttpResponse(buf.getvalue(), 'image/png')

接下来在网页上显示验证码

booktest/urls.py

urlpatterns = [
url('^verifyCode$',views.verifyCode, name="verifyCode"),
url('^verifyTest$',views.verifyTest, name="verifyTest"),
]

booktest/views.py

def verifyTest(request):
context = {}
return render(request, 'booktest/verifyTest.html', context)

templates/booktest/verifyTest.html

<body>
<form method="post" action="/booktest/verifyTest2">
{% csrf_token %}
姓名:<input type="text" name="uname"/><br/>
验证码:<input type="text" name="verifycode"/><img src="/booktest/verifyCode"><br/>
<input type="submit" value="提交"/>
</form>
</body>

在verifyCode中,把随机产生的验证码保存到session中

booktest/views.py

def verifyCode(request):
from PIL import Image, ImageDraw, ImageFont
... ...
print(textTemp) # 保存到session中
request.session['code'] = textTemp
# 把画布保存到内存中
... ...

添加路由

booktest/urls.py

urlpatterns = [
url('^verifyTest2$',views.verifyTest2, name="verifyTest2"),
]

booktest/views.py

def verifyTest2(request):
ori_code = request.session['code']
post_code = request.POST['verifycode']
print('ori_code:%s, post_code:%s' % (ori_code, post_code))
if ori_code == post_code:
return HttpResponse('ok')
else:
return HttpResponse('fail')

访问 http://127.0.0.1:8080/booktest/verifyTest 提交正确/错误验证码,后台可以自行检查了。

Django:模板template(二)的更多相关文章

  1. django模板(template)

    模板层(template) 你可能已经注意到我们在例子视图中返回文本的方式有点特别. 也就是说,HTML被直接硬编码在 Python代码之中. 1 2 3 4 def current_datetime ...

  2. [django]模板template原理

    django 中的render和render_to_response()和locals(): http://www.cnblogs.com/wangchaowei/p/6750512.html 什么是 ...

  3. Django模板语言(二)

    1,装饰器:在不改变原函数的调用方式情况下为原函数增加一些功能(遵循开放封闭的原则) def outter(fn): def inner(*args, **kwargs): # 可以在执行函数前执行一 ...

  4. Django学习(二)---使用模板Templates

    学会使用渲染模板的方法来显示html内容. 一.Templates是什么: HTML文件 使用了Django模板语言(Django Tamplate Language DTL) 可以使用第三方模板 二 ...

  5. Python学习(二十八)—— Django模板系统

    转载自http://www.cnblogs.com/liwenzhou/p/7931828.html Django模板系统 官方文档 一.常用语法 只需要记两种特殊符号: {{  }}和 {% %} ...

  6. Django模板系统:Template

    一.模板常用语法 1.1 变量 符号:{{ }} 表示变量,在模板渲染的时候替换成值 使用方式:{{ 变量名 }}:变量名由字母数字和下划线组成 点(.)在模板语言中有特殊的含义,用来获取对象的相应属 ...

  7. Django系列(二):Django的路由层,视图层和模板层

    1.Django的路由层 URL配置(URLconf)就像Django所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:我们就是以这种方式告诉Django,对于客户端发来的某 ...

  8. Django——模板层(template)(模板语法、自定义模板过滤器及标签、模板继承)

    前言:当我们想在页面上给客户端返回一个当前时间,一些初学者可能会很自然的想到用占位符,字符串拼接来达到我们想要的效果,但是这样做会有一个问题,HTML被直接硬编码在 Python代码之中. 1 2 3 ...

  9. django的模板(二)

    模板(二) 实验简介 本节继续介绍模板的常用标签,for.if.ifequal和注释标签. 一.基本的模板标签和过滤器 1. 标签 if/else {% if %} 标签检查(evaluate)一个变 ...

  10. Django模板语言(Template)

    1.变量 变量相关用 { { } }   逻辑相关用{% %} 2.Filter过滤器 (1)default 如果一个变量是false或者为空,使用给定的默认值. 否则,使用变量的值.   {{ va ...

随机推荐

  1. Warning: Function created with compilation errors.

    SQL> create or replace function 2 remove_constants(p_query in varchar2) return varchar2 3 as 4 l_ ...

  2. Nginx 访问认证

    简介 在实际工作中,企业中有些网站,要求使用账号和密码才能访问,如网站后台.phpMyAdmin .Wiki 平台 等 模块ngx_http_auth_basic_module 允许使用"H ...

  3. VisualStudio2013下安装Python Flask/jade

    为什么是Python? 不做程序的工作好久了,当创业成为工作后越发发现时间的宝贵.时间那么少,需求确实多样的,软件的,web的,还得跨平台,以前熟悉的.Net明显每一项满足的.选来选去还是Python ...

  4. 解决python-memcache报错:“Unknown flags on get: 20”

    [本文出自天外归云的博客园] 在使用python的pytho-memcache库时出现了一个问题,在调用get方法获取键值的时候报错:Unknown flags on get: 20 在网上查了,发现 ...

  5. 3. ELMo算法原理解析

    1. 语言模型 2. Attention Is All You Need(Transformer)算法原理解析 3. ELMo算法原理解析 4. OpenAI GPT算法原理解析 5. BERT算法原 ...

  6. [转]bootstrap table 动态列数

    原文地址:https://my.oschina.net/u/2356355/blog/1595563 据说bootstrap table非常好用,从入门教程中了解到它的以下主要功能: 由于固定表头意味 ...

  7. ambari安装 QA

    1.在安装时 出现Public key for ambari-server-2.4.2.0-136.x86_64.rpm is not installed 安装ambari报错 在安装HST服务时也报 ...

  8. vscode忽略node_module

    1.文件 ---> 首选项  ---> 设置 英文版对应:File ---> Preferences-> User Settings 2.打开 setting.json 3.将 ...

  9. Java8学习笔记(九)--日期/时间(Date Time)API指南

    Java 8日期/时间( Date/Time)API是开发人员最受追捧的变化之一,Java从一开始就没有对日期时间处理的一致性方法,因此日期/时间API也是除Java核心API以外另一项倍受欢迎的内容 ...

  10. ASP.NET实现从服务器下载文件问题处理

    假设在服务器的根目录下有个名为Download的文件夹,这个文件夹存放一些提供给引用程序下载的文件    public void DownloadFile(string path, string na ...