PHP 表单添加隐藏 Token 阻止外部提交

Token 法:通过一个隐藏可变的 Token 加大攻击的难度,每次提交都需要和服务器校对,如果不通过,则为外部提交(也可以通过 session + 隐藏域来验证)。

代码:

form.php

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Document</title>
 6 </head>
 7 <body>
 8     <?php
 9         define(‘SECRET‘, "67%$#ap28");
10         function m_token() {
11             $str = mt_rand(1000, 9999);
12             $str2 = dechex($_SERVER[‘REQUEST_TIME‘] - $str);
13             return $str.substr(md5($str.SECRET), 0, 10).$str2;
14         }
15     ?>
16     <form action="dopost.php" method="post">
17         name:<input type="text" name="name" id="">
18         <input type="hidden" name="token" value="<?php echo m_token();?>">
19         <input type="submit" value="提交">
20     </form>
21 </body>
22 </html>

dopost.php

<?php
define(‘SECRET‘, "67%$#ap28");

function v_token($str, $delay = 2) {
    $rs = substr($str, 0, 4);
    $middle = substr($str, 0, 14);
    $rs2 = substr($str, 14, 8);
    return ($middle == $rs.substr(md5($rs.SECRET), 0, 10))
            && ($_SERVER[‘REQUEST_TIME‘] - hexdec($rs2) - $rs <= $delay);
}
var_dump(v_token($_POST[‘token‘]));

其中 $delay 表示时间延迟,在不同的程序根据根据业务来自行修改

输出:

boolean true
时间: 2024-10-12 12:14:47

PHP 表单添加隐藏 Token 阻止外部提交的相关文章

避免url传值字符串sjstr过长,使用from表单【隐藏域】post提交

1.普通的url传值<html--------------- <!-- 隐藏域post提交url --> <form id="urlPost" action="${pageContext.request.contextPath}/iwell.disposition.sgt_1.0/newallsgtData.action" method="post"> <input type="hidden"

struct2(六) 为表单添加验证

简介 为表单添加验证 添加校验的方法: 1. first name 不能为null 2. Email address 不能为null 3. age 必须大于18岁 为了在用户提交的时候,能够校验这个表单,我们必须在Action register 中定义一个方法: validate method @Override public void validate() { if (personBean.getFirstName() == null || personBean.getFirstName().

表单元素隐藏与ajax的关系

如果表单元素隐藏(display:none;),元素里本事数据是一样会通过ajax提交过去: 如果表单元素设置只读(readonly),元素里本事数据是一样会通过ajax提交过去: 如果表单元素是隐藏域(<input type="hidden" name="name" value="value">),元素里本事数据是一样会通过ajax提交过去: 如果表单元素禁用(disabled),元素里本事数据是不会通过ajax提交过去: post

ThinkPHP框架 做个简单表单 添加数据例子__ACTION__ __SELF__

public function zhuCe(){//自定义zhuCe方法和zhuCe显示表里的__ACTiON__这个相互交接 //实现两个逻辑 //1,显示注册页面 //2.向数据库添加内容 //自动收集表单 if(empty($_POST)){ //显示页面 $this->show(); }else{ $n = D("Nation"); $n->create();//自动收集用户输进表单的值,前提是必须有_post传递数据 $z = $n->add();//执行添

解决chrome浏览器对于自动填充的input表单添加的默认的淡黄色背景问题

如果我们把一个表单设置位 autofocus ,这时这个表单在获取焦点后就会产生淡黄色的背景,我们就是使用!important的方法也无法去除. 解决方法一: 取消设置input表单的autofocus属性 解决方法二:对于没有背景图片的元素,添加下面的代码: input:-webkit-autofill { -webkit-box-shadow: 0 0 0px 1000px white inset; -webkit-text-fill-color: #333; } 解决方法三: 对于有背景图

如何为织梦表单添加时间

在使用织梦表单的时候,我们会发现没有添加提交时间的选项.而在我们日常工作中,获得访客提交的时间非常必要.下面,我来介绍一种简单的办法 首先,我们打开自定义表单管理,点击添加新字段 然后填写表单提示文字和字段名称,我们这先写为Time,重点是数据类型选择单行文本, 此时我们就生成了一个表单,通过前台预览-发布信息,然后查看源代码将表单代码复制到自己网站上去. 此时网站就有了一个表单,但是时间是空的,我们通过调用js来输出当前时间 代码如下 var nowDate = new Date(); var

小习html5为表单添加的新属性

输入框html5新增属性 在学习任何一种语言时都提到“渐进增强”原则,说白了就是兼容性有木有.虽然html5一些新属性在实际使用中受到限制,但是依然阻挡不了伟大的同伴们学习的脚步.近来有点儿忙,这是2016年第一篇文章.内容比较简单只是了解学习. 输入框按输入的内容分,也就是单行输入和多行输入,既是<input type="">和<textarea></textarea> <textarea></textarea>标签属性 a

Activiti系列: 如何给内置表单添加字段类型

对于内置的表单,除了原来支持的几种数据类型(string, long, enum, date, boolean, collection)之外,还可以自定义数据类型,比如增加一个javascript数据类型 需要增加一个自定义数据类型的处理类 public class JavascriptFormType extends AbstractFormType { @override public string getName() { return "javascript";} @overri

用HTTP状态码实现提交表单后刷新页面不重复提交

正常情况下,表单提交后如果用户刷新页面会重复提交表单,有些情况下我们不希望表单重复提交,利用HTTP协议中的307状态码重定向页面可以实现这个目的.实例如下: 表单页面代码: <form action="1.php" method="post"> <input type="text" name="na"> <input type="submit" value="提交&