详解php curl带有csrf-token验证模拟提交方法


Posted in PHP onApril 18, 2018

通常为了安全会在表单里加入一个随机的token值来防止csrf攻击。

要想模拟提交有token验证的网站其实也不难。

1.通过正则获取token
2.带上获取到的token模拟提交

下面是一个成功的例子

目录结构

│ form.php ?需要模拟的表单 
│ getForm.php ? 模拟提交程序 
│ post.php ?表单验证程序 
│ 
└─cookie ? cookie存放目录

getForm.php

<?php
$cookie_file = './cookie/'.time().'.cookie';
$str = getResponse('http://a.curl.com:81/form.php',[],$cookie_file);
setcookie("PHPSESSID", "vc0heoa6lfsi3gger54pkns152");
preg_match('/<input name="token" type="hidden" value="(.*)"/U', $str, $match);

$post['token'] = $match[1];
$post['name'] = '3333333';
$post['password'] = '12121213';
print_r(getResponse('http://a.curl.com:81/post.php', $post, $cookie_file));

function getResponse($url, $data=[], $cookie_file='', $timeout = 3)
  {
    if(empty($cookie_file))
    {
      $cookie_file = '.cookie';
    }

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_REFERER, "https://www.baidu.com");  //构造来路
    curl_setopt($ch, CURLOPT_USERAGENT,"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36");

    if(!empty($data))
    {
      curl_setopt($ch, CURLOPT_POST, true);
      curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    }
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);// 取cookie的参数是
    curl_setopt ($ch, CURLOPT_COOKIEFILE, $cookie_file); //发送cookie
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
    try
    {
       $handles = curl_exec($ch);
       curl_close($ch);
       return $handles;
    }
    catch (Exception $e)
    {
      echo 'Caught exception: ', $e->getMessage(), "\n";
    }
    unlink($cookie_file);
  }

form.php

<?php
session_start();
$_SESSION['token'] = md5($_SERVER['REQUEST_TIME']);
$_SESSION['time'] = date("Y-m-d H:i:s");
session_write_close();
//echo $_SESSION['auth'];
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
 <head>
 <title> new document </title>
 <meta name="generator" content="editplus" />
 <meta name="author" content="" />
 <meta name="keywords" content="" />
 <meta name="description" content="" />
 </head>
 <body>
<form action="post.php" method="post">
  <p><input name="name" type="text"></p>
  <p><input name="password" type="password"></p>
  <p><input name="token" type="hidden" value="<?php echo $_SESSION['token']?>"></p>
  <p><input type="submit"></p>
</form>
 </body>
</html>

post.php

<?php
session_start();
if(empty($_POST['token']))
{
  exit ("token is empty!");
}

if(empty($_SESSION['token']))
{
 exit ("session is empty");
}

if($_POST['token'] != $_SESSION['token'])
{
  exit ("token ");
} else
{
  unset($_SESSION['token']);
}

echo PHP_EOL;
echo "pass";
print_r($_REQUEST);

echo PHP_EOL;
print_r($_SERVER);

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP调用Twitter的RSS的实现代码
Mar 10 PHP
php 带逗号千位符数字的处理方法
Jan 10 PHP
PHP压缩html网页代码(清除空格,换行符,制表符,注释标记)
Apr 02 PHP
PHP批量生成图片缩略图的方法
Jun 18 PHP
PHP判断上传文件类型的解决办法
Oct 20 PHP
thinkphp3.x中display方法及show方法的用法实例
May 19 PHP
Yii2选项卡的简单使用
May 26 PHP
微信公众号实现会员卡领取功能
Jun 08 PHP
PHP实现驼峰样式字符串(首字母大写)转换成下划线样式字符串的方法示例
Aug 10 PHP
php实现的rc4加密解密类定义与用法示例
Aug 16 PHP
Ubuntu中支持PHP5与PHP7双版本的简单实现
Aug 19 PHP
php 比较获取两个数组相同和不同元素的例子(交集和差集)
Oct 18 PHP
php-app开发接口加密详解
Apr 18 #PHP
PHPMAILER实现PHP发邮件功能
Apr 18 #PHP
PHP实现数据库的增删查改功能及完整代码
Apr 18 #PHP
php无限级评论嵌套实现代码
Apr 18 #PHP
PHP实现负载均衡下的session共用功能
Apr 17 #PHP
PHP代码重构方法漫谈
Apr 17 #PHP
php微信公众号开发之现金红包
Apr 16 #PHP
You might like
动画 《Pokemon Sword·Shield》系列WEB动画《薄明之翼》第2话声优阵容公开!
2020/03/06 日漫
探讨:如何使用PHP实现计算两个日期间隔的年、月、周、日数
2013/06/13 PHP
PHP Imagick完美实现图片裁切、生成缩略图、添加水印
2016/02/22 PHP
经验几则 推荐
2006/09/05 Javascript
javascript 异步页面查询实现代码(asp.net)
2010/05/26 Javascript
JS分割字符串并放入数组的函数
2011/07/04 Javascript
利用JQuery制作符合Web标准的QQ弹出消息
2014/01/14 Javascript
Javascript解析URL方法详解
2014/12/05 Javascript
jQuery 和 CSS 的文本特效插件集锦
2014/12/12 Javascript
JavaScript 学习笔记之变量及其作用域
2015/01/14 Javascript
Angularjs制作简单的路由功能demo
2015/04/14 Javascript
JavaScript基础篇(3)之Object、Function等引用类型
2015/11/30 Javascript
vue.js的提示组件
2017/03/02 Javascript
nodejs acl的用户权限管理详解
2018/03/14 NodeJs
VUE2.0中Jsonp的使用方法
2018/05/22 Javascript
angularJs中$scope数据序列化的实例
2018/09/30 Javascript
jQuery实现为table表格动态添加或删除tr功能示例
2019/02/19 jQuery
JavaScript的查询机制LHS和RHS解析
2019/08/16 Javascript
layui的面包屑或者表单不显示的解决方法
2019/09/05 Javascript
Vue 实现从小到大的横向滑动效果详解
2019/10/16 Javascript
vuex state中的数组变化监听实例
2019/11/06 Javascript
vue elementui tree 任意级别拖拽功能代码
2020/08/31 Javascript
[02:30]DOTA2英雄基础教程 暗影恶魔
2013/12/17 DOTA
[53:49]LGD vs Fnatic 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
[42:48]完美世界DOTA2联赛PWL S3 Magma vs INK ICE 第二场 12.11
2020/12/16 DOTA
从零学Python之hello world
2014/05/21 Python
简单介绍Python的Tornado框架中的协程异步实现原理
2015/04/23 Python
Python缩进和冒号详解
2016/06/01 Python
Python元字符的用法实例解析
2018/01/17 Python
Python实现多态、协议和鸭子类型的代码详解
2019/05/05 Python
matlab中imadjust函数的作用及应用举例
2020/02/27 Python
用python绘制樱花树
2020/10/09 Python
学雷锋先进个人事迹
2014/05/26 职场文书
浅谈Python3中datetime不同时区转换介绍与踩坑
2021/08/02 Python
Java 在线考试云平台的实现
2021/11/23 Java/Android
在虚拟机中安装windows server 2008的图文教程
2022/06/28 Servers