解决js(ajax)提交后端的“ _xsrf' argument missing from POST” 的错误
首先先简述一下CSRF:
CSRF是Cross Site Request Forgery的缩写(也缩写为XSRF),直译过来就是跨站请求伪造的意思,也就是在用户会话下对某个CGI做一些GET/POST的事情——这些事情用户未必知道和愿意做,你可以把它想做HTTP会话劫持。
网站是通过cookie来识别用户的,当用户成功进行身份验证之后浏览器就会得到一个标识其身份的cookie,只要不关闭浏览器或者退出登录,以后访问
这个网站会带上这个cookie。如果这期间浏览器被人控制着请求了这个网站的url,可能就会执行一些用户不想做的功能(比如修改个人资料)。因为这个
不是用户真正想发出的请求,这就是所谓的请求伪造;呵呵,因为这些请求也是可以从第三方网站提交的,所以前缀跨站二字。
当你采用有"_xrsf"防止攻击做项目的时候,你会发现如果采用ajax提交表单的话会出现“ _xsrf' argument missing from POST” 的错误。
首先我们可能会想到在是因为表单里面input标签的type属性不是submit,而是button(用于aja提交)。所以可以将其该为submit是可以解决的,但是这会让ajax失去意义,因为拦不住form表单的action操作,也许可以在form标签里面加上onsubmit="return user_login();":
<form action="/check_login_action" method="post" onsubmit="return user_login();">
<dl><h2> 用户登录</h2><hr>
<dt>账号:<input id="user_name" name="user_name" type="text" placeholder="输入账号"/> <a href="register_user.html">注册账户</a></dt>
<dt>密码:<input id="user_password" name="user_password" type="password" placeholder="输入密码"/>
<a href="find_password.html">找回密码</a></dt>
{% raw xsrf_form_html() %}
<dt><input type="submit" value="登录" ></dt>
</dl>
</form>
但是ajax的优势也会被覆盖掉;所以如果一定要采用ajax的话(至少可以很好的操作回显的值),可以在js中拿到这个xrsf里面的值传到后端就解决了:
function user_login(){
    var _xsrf = $("input[name='_xsrf']").val();
    var user_name = $("#user_name").val();
    var username = check(1, user_name);
    if(username.split('#')[0]=='F'){
        alert(username.split('#')[1]);
    }
    else{
        var user_password = $("#user_password").val();
        var userpass = check(2, user_password);
        if(userpass.split('#')[0]=='F'){
            alert(userpass.split('#')[1]);
        }
        else{
            var xmlhttp;
            if(window.XMLHttpRequest){
                xmlhttp = new XMLHttpRequest();
            }
            else{
                xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
            }
            xmlhttp.onreadystatechange = function(){
                if(xmlhttp.readyState == 4 && xmlhttp.status == 200){
                    var json_login = eval("("+ xmlhttp.responseText +")");
                    if(json_login.returnedjson.infostatus == 'T'){
            alert(json_login.returnedjson.infomsg);
                        window.location.href = "/personal_account_temp";
            //obj.action = "/check_login_action";
                    }
                    else{
                        alert(json_login.returnedjson.infomsg);
                        $("#user_name").val("");
                        $("#user_password").val("");
                        $("#user_name").focus();
                    }
                }
            }
            var user_mess ="user_name=" + encodeURIComponent(user_name) + "&user_password=" + encodeURIComponent(user_password) + "&_xsrf=" + _xsrf;
        //传给后端,后端会自动的去接收
            xmlhttp.open("post", "/check_login_action", true);
            xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
            xmlhttp.send(user_mess);
        }
    }
}
问题解决。。。
解决js(ajax)提交后端的“ _xsrf' argument missing from POST” 的错误的更多相关文章
- pycharm 使用jupyter notebook 报错:'_xsrf' argument missing from POST
		出问题的关键点就在: 我用cmd启动的jupyter notebook,然后用pycham新建了一个jupyter notebook 结果 一直报错'_xsrf' argument missing f ... 
- 验证控件,解决用于ajax提交前的验证,不是submit提交的验证
		//解决ajax提交前的验证问题,主要用于onclick事件时对某一区域中(可以是form,div,table中的等)控件的验证.(function ($) { var v; //Create a n ... 
- jquery.form.js  ajax提交上传文件
		项目中最近有用到表单提交,是带有图片上传的表单录入,需要ajax异步提交,网上找了好多例子都是只能提交上传字段一个信息的,这里整理一下.表单里有普通文本信息字段也有图片上传字段. 1.jsp代码--引 ... 
- 解决Jquery Ajax提交 服务器端接收中文乱码问题
		看到有朋友说到用post提交方式解决,我指定了methord="post",仍然解决不了, 说一下解决办法,客户端进行编码,服务器端解码, 客户端:var where = esca ... 
- 解决js ajax跨越请求 Access control allow origin 异常
		// 解决跨越请求的问题 response.setHeader("Access-Control-Allow-Origin", "*"); 
- 解决 js ajax跨域访问报“No 'Access-Control-Allow-Origin' header is present on the requested resource.”错误
		参考页面:https://blog.csdn.net/idomyway/article/details/79572973 如果请求的是PHP页面: header("Access-Contro ... 
- Ajax提交参数的值中带有html标签不能提交成功的解决办法(ASP.NET)
		最近在公司做资源及文章上传功能遇到一个小问题,被坑了好半天. 该功能就类似利用富文本编辑器发布信息,但是用Ajax提交数据,因此提交参数值中不可避免的含有html标签. 在本地运行代码一直没问题,总是 ... 
- Ajax提交表单时验证码自动验证 php后端验证码检测
		本文通过源码展示如何实现表单提交前,验证码先检测正确性,不正确则不提交表单,更新验证码. 1.前端代码 index.html <!DOCTYPE html> <html> &l ... 
- Vue-CLI项目-axios模块前后端交互(类似ajax提交)
		08.31自我总结 Vue-CLI项目-axios前后端交互 一.模块的安装 npm install axios --save #--save可以不用写 二.配置main.js import axio ... 
随机推荐
- iOS 文档分享相关
			在非系统预览情况下 指定文件打开系统分享菜单 NSString *savedPath = [NSHomeDirectory() stringByAppendingString:[NSString s ... 
- 素数环(dfs+回溯)
			题目描述: 输入正整数n,把整数1,2...n组成一个环,使得相邻两个数和为素数.输出时从整数1开始逆时针排列并且不能重复: 例样输入: 6 例样输出: 1 4 3 2 5 6 1 6 5 2 3 4 ... 
- php基础面试题1
			问题1:谈谈你对的PHP的基本认识. 回答:PHP是Hypertext Preprocessor(超文本预处理器)的简称,是一种用来开发动态网站的服务器端脚本语言. 问题2:什么是MVC? 回答:MV ... 
- 二、JavaScript语言--JS实践--商城分类导航效果
			商城类导航菜单制作(以京东为例--竖向列表横向伸缩) 可以用两种方式来实现:用CSS实现和用JS实现 方法一:用CSS实现(要点:使用hover) <!DOCTYPE html PUBLIC & ... 
- jquery学习笔记----元素筛选
			1.eq() 筛选指定索引号的元素2.first() 筛选出第一个匹配的元素3.last() 筛选出最后一个匹配的元素4.hasClass() 检查匹配的元素是否含有指定的类5.filter() 筛 ... 
- securecrt 用心跳保持连接
			选项->会话->终端->发送协议NO-OP(P) 
- SQLServer内置函数
			类型转换函数cast和convert --cast一般更容易使用,convert的优点是可以格式化日期和数值 select CAST('123.4' as int) --失败 select CONVE ... 
- 【131031】asp.net <%%>&<%#%>&<%=%>&<%@%>&<%$%>用法区别
			1.<% %>用来绑定后台代码 如: < % for(int i=0;i<100;i++) { Reaponse.Write(i.ToString()); } %> 2. ... 
- Python科学计算发行版—Anaconda
			Python是一种强大的编程语言,其提供了很多用于科学计算的模块,常见的包括numpy.scipy和matplotlib.要利用Python进行科学计算,就需要一一安装所需的模块,而这些模块可能又依赖 ... 
- C# DateTime时间格式转换为Unix时间戳格式
			double ntime=dateTimeToUnixTimestamp(DateTime.Now); long g1 = GetUnixTimestamp(); long g2 = ConvertD ... 
