ajax跨站请求伪造
用ajax提交数据到后台:
{#<!DOCTYPE html>#}
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="/static/jquery-3.2.1.min.js"></script>
<style>
.sp{
color: red;
}
</style>
</head>
<body>
<p>姓名:<input type="text"></p>
<p>密码:<input type="password"></p>
<p>
<button class="sub">提交</button><span class="sp"></span>
</p>
<script>
function foo() {
$(".sp").html("");
}
$(".sub").click(function () {
$.ajax({
url: "/demo_ajax/",
type: "POST",
data: {
username: $(":text").val(),
password: $(":password").val()
},
success: function (data) {
var data = JSON.parse(data);
if (!data["flag"]){
$(".sp").html("用户名或密码错误"),
setTimeout(foo,3000)
}
}
})
})
</script>
</body>
</html>
前端采取这种方式提交会报forbidden的错误是因为没有加csrf_token,可是这个不是采用form表单的方式提交的:

怎么解决这种问题呢?一般来说解决这种问题的办法有三种,下边就说一下这三种方式都怎么用:
方式一:
在提交ajax请求的时候给他事先设置一个值:
function foo() {
$(".sp").html("");
}
$(".sub").click(function () {
#######################################
$.ajaxSetup({
data: {csrfmiddlewaretoken: '{{ csrf_token }}'}
});
#######################################
$.ajax({
url: "/demo_ajax/",
type: "POST",
data: {
username: $(":text").val(),
password: $(":password").val()
},
success: function (data) {
var data = JSON.parse(data);
if (!data["flag"]){
$(".sp").html("用户名或密码错误"),
setTimeout(foo,3000)
}
}
})
})
方式二:
body部分:
<form action="">
{% csrf_token %}
<p>姓名:<input type="text"></p>
<p>密码:<input type="password"></p>
</form>
<p>
<button class="sub">提交</button><span class="sp"></span>
</p>
button要写在外边,否则会默认以get提交
----------------------------------------------------------------------------------------
这里是js代码:
function foo() {
$(".sp").html("");
}
$(".sub").click(function () {
$.ajax({
url: "/demo_ajax/",
type: "POST",
data: {
username: $(":text").val(),
password: $(":password").val(),
csrfmiddlewaretoken:$("[name='csrfmiddlewaretoken']").val(),
},
success: function (data) {
var data = JSON.parse(data);
if (!data["flag"]){
$(".sp").html("用户名或密码错误"),
setTimeout(foo,3000)
}
}
})
})
方式三:
function foo() {
$(".sp").html("");
}
$(".sub").click(function () {
$.ajax({
url: "/demo_ajax/",
type: "POST",
headers:{"X-CSRFToken":$.cookie('csrftoken')},
data: {
username: $(":text").val(),
password: $(":password").val()
},
success: function (data) {
var data = JSON.parse(data);
if (!data["flag"]){
$(".sp").html("用户名或密码错误"),
setTimeout(foo,3000)
}
}
})
})
方式三可以在form表单提交,也可以不在form表单中提交:
ajax跨站请求伪造的更多相关文章
- 跨站请求伪造 | ajax
一.简介 django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成.而对于django中设置防跨站请求伪造功 ...
- ajax向Django前后端提交请求和CSRF跨站请求伪造
1.ajax登录示例 urls.py from django.conf.urls import url from django.contrib import admin from app01 impo ...
- python 全栈开发,Day87(ajax登录示例,CSRF跨站请求伪造,Django的中间件,自定义分页)
一.ajax登录示例 新建项目login_ajax 修改urls.py,增加路径 from app01 import views urlpatterns = [ path('admin/', admi ...
- (22)Ajax的基本使用(实现登录功能和局部刷新以及防止跨站请求伪造攻击)
Ajax的作用 前后端分离的项目,需要交互,就要通过Ajax来完成交互 AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”.即 ...
- Django框架 之 基于Ajax中csrf跨站请求伪造
Django框架 之 基于Ajax中csrf跨站请求伪造 ajax中csrf跨站请求伪造 方式一 1 2 3 $.ajaxSetup({ data: {csrfmiddlewaretoken: ...
- Web安全相关(二):跨站请求伪造(CSRF/XSRF)
简介 CSRF(Cross-site request forgery跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对 ...
- 关于XSS(跨站脚本攻击)和CSRF(跨站请求伪造)
我们常说的网络安全其实应该包括以下三方面的安全: 1.机密性,比如用户的隐私被窃取,帐号被盗,常见的方式是木马. 2.完整性,比如数据的完整,举个例子,康熙传位十四子,被当时四阿哥篡改遗诏:传位于四子 ...
- xss(跨站脚本攻击),crsf(跨站请求伪造),xssf
我们常说的网络安全其实应该包括以下三方面的安全: 1.机密性,比如用户的隐私被窃取,帐号被盗,常见的方式是木马. 2.完整性,比如数据的完整,举个例子,康熙传位十四子,被当时四阿哥篡改遗诏:传位于四子 ...
- Django之CSRF 跨站请求伪造
一.简介 1.点我了解什么是跨站请求伪造 2.django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成.而对 ...
随机推荐
- Maven版本号中隐藏的惊天大秘密
一.背景 现在主流的Java系的互联网公司里,绝大多数公司都使用Maven作为依赖管理工具,一般我们对于依赖的版本号,常见两种类型:一种以“-RELEASE”结尾,另一种以“-SNAPSHOT”结尾. ...
- iOS开发 字符串的转化 小技巧
/字典或者数组转化为nsstring NSArray *arr = [NSArray arrayWithObject:@"1"]; NSString *str = [arr JSO ...
- InfluxDB:cannot use field in group by clause
最近在使用InfluxDB时,发现一个很奇怪的问题,一个本来正常的功能,做了一次改动后,就不能正常显示了. 一.查询语句 SELECT MEMORY FROM "ACM_PROCESS_MO ...
- iOS 多线程 简单学习NSThread NSOperation GCD
1:首先简单介绍什么叫线程 可并发执行的,拥有最小系统资源,共享进程资源的基本调度单位. 共用堆,自有栈(官方资料说明iOS主线程栈大小为1M,其它线程为512K). 并发执行进度不可控,对非原子操作 ...
- mvn命令笔记
#发布到本地仓库 mvn deploy -DaltDeploymentRepository=snapshots::default::http://mvnrepo.xxx.com/mvn/snapsho ...
- Find all factorial numbers less than or equal to N
A number N is called a factorial number if it is the factorial of a positive integer. For example, t ...
- SpringMVC对包的扫描范围扩大后,导致的事务配置不生效问题
问题场景 项目使用的框架:Spring 4.1.4 + Hibernate 4.3.8 + MySQL. web.xml中对Spring的配置: <!-- 把 Spring 容器集成到 Web ...
- js把通过图片路径生成base64
主要思想: 使用canvas.toDataURL()方法将图片的绝对路径转换为base64编码. 一.图片在本地服务器: var imgSrc = "img/1.jpg";//本地 ...
- Git详解之三:Git分支
Git 分支 几乎每一种版本控制系统都以某种形式支持分支.使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作.在很多版本控制系统中,这是个昂贵的过程,常常需要创建一个源代码目录的 ...
- 8、公司的上市问题 - CEO之公司管理经验谈
在公司发展到一定阶段之后,CEO就能够考虑公司上市的问题了.一条线路,就是先成立公司,进行投资,然后上市赚取利润,根据不同公司的总经理的想法不同而定.这条路是现在很多公司领导要求的做法.因为,通过发行 ...