CSRF跨站请求伪造的模拟GET请求实例
1、在命令行创建django工程djcsrfget,在工程内创建应用testget,命令如下:
django-admin startproject djcsrfget
cd djcsrfget
python manage.py startapp testget
2、使用PyCharm打开此工程,在工程的同名的文件夹的settings文件,添加应用配置和模板路径,修改的settings.py内容如下:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'csrfget.apps.CsrfgetConfig',
]
ROOT_URLCONF = 'djcsrftest.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR,'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
3、在项目根目录,新建templates文件夹,并在文件夹内新建‘login.html’和
‘index.html’文件,内容如下:
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/login/" method="POST">
{% csrf_token %}
<label>用户名</label>
<input type="text" name ="username">
<br/>
<br/>
<label>密码</label>
<input type="password" name="password">
<br/>
<br/>
<input type="submit" value="登录">
</form>
</body>
</html>
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
欢迎{{user}}
<a href="/transfer/">转账</a>
</body>
</html>
4、在工程的同名文件夹的urls.py文件,include到应用的urls.py文件,代码如下:
from django.conf.urls import url,include
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'',include('csrfget.urls')),
]
在应用内新建urls.py文件,并写代码如下:
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'login/',views.login),
url(r'index/',views.index),
url(r'transfer/',views.transfer)
]
5、在应用的views.py写代码如下,包含三个方法,登录,首页,转账
from django.shortcuts import render,HttpResponse,redirect
from django.contrib import auth
from django.contrib.auth.decorators import login_required
# Create your views here.
def login(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
user = auth.authenticate(username=username, password=password)
if user:
auth.login(request,user)
print ('ok')
return redirect('/index/')
return render(request,'login.html')
@login_required(login_url='/login/')
def index(request):
return render(request,'index.html')
@login_required(login_url='/login/')
def transfer(request):
return HttpResponse('you have tansfer 1000RMB')
转账和首页都是必须登录后才能进入
6、进行数据库迁移并创建一个超级用户,打开开发工具的terminal
python manage.py migrate
python manage.py createsuperuser
7、运行服务器,登录上一步创建的用户,在首页点击transfer,弹出下图第三个
试想如果这个连接是别人发过来的,在用户已经登录后同样可以操作,只要是在同一个浏览工具,就有当前用户的cookie。
python manage.py runserver