1、目的:每次表单POST提交(ajax的POST也适用)过来数据,都必须校验formhash参数是否和服务器端的一致,不一致说明重复提交或者 跨站攻击提交csrf

2、原理:参照了 KPPW 的formhash生成和校验示例。将formhash的生成写入基类构造函数,每次登陆用户操作数据,都生成hash并进行比较。

(用户未登录状态,也可以校验formhash,可以让你的网站免于 遭受  无状态脚本提交数据 攻击)

3、formHash的生成代码:注意 这里的formhash一般都是每个用户均不相同,且每个用户的formhash值在几个月以内都是不会变更的。

<?php
/*
* 再次封装的BaseController基类 --by xzz 2018/02/07
* 包括:表单formhash校验原理如下:
* 将formhash放在构造函数里,GET访问页面生成formhash并渲染在页面,用户提交表单,POST经过构造函数再一次生成一样的formhash
*/
namespace Admin\Controller;
user Think\Controller;
class BaseController extends Controller {
public function __construct(){
parent::__construct();
define("FORMHASH", self::formhash());
@session_start();
}
/* 生成表单随机码,防止XSS攻击,无需同步存储于内存缓存(redis/Mencached)中
* 返回6位随机码
*/
static function formhash() {
$uid = null;
$username = null;
if (isset ( $_SESSION ['uid'] )) {
$uid = $_SESSION ['uid'];
}
if (isset ( $_SESSION ['username'] )) {
$username = $_SESSION ['username'];
}
return substr ( md5 ( substr ( time (), 0, - 7 ) . $uid . $username ), - 6 );
}
/*
* formhash校验,传过来的formhash和提交动作再次生成的FORMHASH变量一致,校验通过;否则重复提交
*/
static function submitcheck($formhash, $return_json = false) {if (! empty ( $formhash ) && $_SERVER ['REQUEST_METHOD'] == 'POST') {
if ((empty ( $_SERVER ['HTTP_REFERER'] ) || preg_replace ( "/https?:\/\/([^\:\/]+).*/i", "\\1", $_SERVER ['HTTP_REFERER'] ) == preg_replace ( "/([^\:]+).*/", "\\1", $_SERVER ['HTTP_HOST'] )) && $formhash == FORMHASH) {
return true;
} elseif ($return_json == true) {
return false;
}
} else {
return false;
}
}
/* 发送邮件类 -xzz 2018/02/06 */
public function add2(){
    //校验用户是否登录
    // do user is login ?
header("content-type:text/html;charset=utf-8");
if(IS_POST){
var_dump($_POST);
if(self::submitcheck(trim($_POST['formhash']))){
if(SendMail($_POST['mail'],$_POST['title'],$_POST['content']))
$this->success('发送成功!');
else
$this->error('发送失败');
}else{
exit("formhash错误");
}
}elseif(IS_GET){
$this->assign("FORMHASH",FORMHASH);$this->display();
}
} }

4、代码解读:

a. 假设 我们访问上面 add2 页面,首先 输出变量$FORMHASH 并展示在页面隐藏域;

b. post方式提交后,校验登录态->校验formhash->do what u want to do ..

c. 第二步,校验formhash:提交的formhash 和 再次生成formhash比较,还看不懂 请再尝试看5遍这个方法 【submitcheck()】

5、结束。

【PHP】(原创)之表单FORM的formhash校验,以TP3.2示例的更多相关文章

  1. HTML ------ 关于表单 Form

    Form(表单)主要用于采集和提交用户输入的信息,是页面与WEB服务器交互过程中 最重要的信息来源. 掌握表单(Form)有以下几个要点: 重要form属性 form常用控件 form提交方式 § 重 ...

  2. Bootstrap~表单Form

    回到目录 在进行自己的后台改版时,大体布局都使用了bootstrap,剩下的表单部分没理由不去使用它,对于表单的美化和布局,bootstrap做的也是很不错的,有大气的边框,多功能的按钮及宏观的表单布 ...

  3. 表单 - Form - EasyUI提供的表单异步提交

    方案一 被提交的表单 <form id="loginForm" method="post"> <table align="cente ...

  4. 跟服务器交互的Web表单(form)

    使用HTML来构建可以跟服务器交互的Web表单(form),通过给你的form元素添加一个action属性来达到此目的. action属性的值指定了表单提交到服务器的地址. 例如: <form ...

  5. 3、网页制作Dreamweaver(表单form)

    表单form (虚线不显示) 1.写法: <form id="form1" name="form1" method="post" ac ...

  6. DHTMLX 前端框架 建立你的一个应用程序 教程(九)--绑定表单Form到表格Grrid中

    绑定表单Form到表格Grrid中 现在我们需要选中一行表格数据的时候 数据能在表单中显示出来 我们可以使用DHTMLX 丰富的组件功能实现它. 绑定表单到表格 1.调用bind方法将表单绑定到网格, ...

  7. DHTMLX 前端框架 建立你的一个应用程序 教程(八)-- 添加表单Form

    添加表单Form 我们下一步是在页面中添加一个表单,表格中的选中字段将会显示在表单中.提供一个提交按钮 可以对显示的数据进行修改提交. 添加表单到布局单元格中 1.在右侧布局中使用attachForm ...

  8. 微信小程序基础之表单Form的使用

    表单Form的应用很广泛,我们可以利用form设计登录注册,也可以设计一种答题问卷的形式,今天主要讲一下form的使用 form表单,将组件内输入的"switch","i ...

  9. HTML(七)HTML 表单(form元素介绍,input元素的常用type类型,input元素的常用属性)

    前言 表单是网页与用户的交互工具,由一个<form>元素作为容器构成,封装其他任何数量的表单控件,还有其他任何<body>元素里可用的标签 表单能够包含<input> ...

随机推荐

  1. 【最短路】【spfa】hdu6071 Lazy Running

    给你一个4个点的环,问你从2号点出发, 再回到2号点,长度>=K的最短路是多少.环上的边长度不超过30000. 跑出来所有dis(2,j)以后,然后for一遍j,根据dis(2,j)+t*2*w ...

  2. 【强联通分量缩点】【Tarjan】bzoj1051 [HAOI2006]受欢迎的牛

    就是看是否有一些点,从其他任何点出发都可到达 定理:有向无环图中唯一出度为0的点,一定可以由任何点出发均可达. 所以缩点,若出度为零的点(强联通分量)唯一,则答案为该强联通分量中点的度数. 若不唯一, ...

  3. 20162303 实验一 Java开发环境的熟悉(Linux + Eclipse)

    北京电子科技学院(BESTI) 实 验 报 告 课程:程序设计与数据结构 班级: 1623 姓名: 石亚鑫 学号:20162303 成绩: 2分 指导教师:娄嘉鹏 王志强 实验日期:3月17日 实验密 ...

  4. 记录Debug神经网络的方法

    debugNNIntroduction to debugging neural networksThe following advice is targeted at beginners to neu ...

  5. Codeforces Gym 100269F Flight Boarding Optimization 树状数组维护dp

    Flight Boarding Optimization 题目连接: http://codeforces.com/gym/100269/attachments Description Peter is ...

  6. [HTML/CSS]div显示在object、embed之上~

    引言 帮一个朋友弄前端布局,一切都正常,但是嵌入object之后,div总是在object的下面,就上网找了一下解决方案,这里记录一下,好像只对flash有效. 用embed插入一个flash(比如优 ...

  7. Express优化-合并路由

    原app.js var express = require('express'); var app = express(); /*start*/ app.get('/',function(req,re ...

  8. js禁止复制粘贴

    1. oncontextmenu="window.event.returnValue=false" 将彻底屏蔽鼠标右键,其实是禁止快捷菜单,因为不光右键可以弹出这个菜单,键盘上空格 ...

  9. Android内存优化8 内存检测工具2 LeakCanary——直白的展现Android中的内存泄露

    之前碰到的OOM问题,终于很直白的呈现在我的眼前:我尝试了MAT,但是发现不怎么会用.直到今天终于发现了这个新工具: 当我们的App中存在内存泄露时会在通知栏弹出通知: 当点击该通知时,会跳转到具体的 ...

  10. JS跳转页面的几种方法

    JS的几种跳转方式: 1. window.open(”url“) 2.用自定义函数 <script> function openWin(tag,obj) { obj.target=&quo ...