详解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 相关文章推荐
中英文字符串翻转函数
Dec 09 PHP
php设计模式 Mediator (中介者模式)
Jun 26 PHP
php的memcache类分享(memcache队列)
Mar 26 PHP
PHP内置过滤器FILTER使用实例
Jun 25 PHP
PHP中iconv函数转码时截断字符问题的解决方法
Jan 21 PHP
php实现概率性随机抽奖代码
Jan 02 PHP
PHP实现简单实用的分页类代码
Apr 08 PHP
php处理json格式数据经典案例总结
May 19 PHP
基于PHP生成简单的验证码
Jun 01 PHP
php实现base64图片上传方式实例代码
Feb 22 PHP
PHP中的日期时间处理利器实例(Carbon)
Jun 09 PHP
PHP自定义函数实现数组比较功能示例
Oct 19 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
php 数组动态添加实现代码(最土团购系统的价格排序)
2011/12/30 PHP
修改apache配置文件去除thinkphp url中的index.php
2014/01/17 PHP
PHP实现的购物车类实例
2015/06/17 PHP
PHP大文件分割上传 PHP分片上传
2017/08/28 PHP
Swoole扩展的6种模式深入详解
2021/03/04 PHP
建议大家看下JavaScript重要知识更新
2007/07/08 Javascript
颜色选择器 Color Picker,IE,Firefox,Opera,Safar
2010/11/25 Javascript
菜鸟javascript基础整理1
2010/12/06 Javascript
火狐textarea输入法的bug的触发及解决
2013/07/24 Javascript
jQuery简单实现iframe的高度根据页面内容自适应的方法
2016/08/01 Javascript
Js获取当前日期时间及格式化代码
2016/09/17 Javascript
jQuery实现Select下拉列表进行状态选择功能
2017/03/30 jQuery
jquery 禁止鼠标右键并监听右键事件
2017/04/27 jQuery
什么是Vue.js框架 为什么选择它?
2017/10/17 Javascript
vue如何在自定义组件中使用v-model
2018/05/14 Javascript
解决Mac下安装nmp的淘宝镜像失败问题
2018/05/16 Javascript
layui table复选框禁止某几条勾选的实例
2019/09/20 Javascript
[49:41]NB vs NAVI Supermajor小组赛A组 BO3 第一场 6.2
2018/06/03 DOTA
[01:47]2018年度DOTA2最具人气解说-完美盛典
2018/12/16 DOTA
python人人网登录应用实例
2014/09/26 Python
python optparse模块使用实例
2015/04/09 Python
Python编程中字符串和列表的基本知识讲解
2015/10/14 Python
python selenium UI自动化解决验证码的4种方法
2018/01/05 Python
python计算两个矩形框重合百分比的实例
2018/11/07 Python
python lambda表达式在sort函数中的使用详解
2019/08/28 Python
Python基于DB-API操作MySQL数据库过程解析
2020/04/23 Python
如何在Win10系统使用Python3连接Hive
2020/10/15 Python
英国时尚服饰电商:Boohoo
2017/10/12 全球购物
移动通信行业实习自我鉴定
2013/09/28 职场文书
教师实习自我鉴定
2013/12/18 职场文书
篮球友谊赛通讯稿
2014/10/10 职场文书
2015年女工委工作总结
2015/07/27 职场文书
女方家长婚礼致辞
2015/07/27 职场文书
使用golang编写一个并发工作队列
2021/05/08 Golang
源码解读Spring-Integration执行过程
2021/06/11 Java/Android
不负正版帝国之名 《重返帝国》引领SLG手游制作新的标杆
2022/04/07 其他游戏