详解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作为Shell脚本语言使用
Oct 09 PHP
一个php作的文本留言本的例子(五)
Oct 09 PHP
PHP的开发框架的现状和展望
Mar 16 PHP
使用php+Ajax实现唯一校验实现代码[简单应用]
Nov 29 PHP
PHP goto语句简介和使用实例
Mar 11 PHP
Yii入门教程之目录结构、入口文件及路由设置
Nov 25 PHP
Yii实现MySQL多数据库和读写分离实例分析
Dec 03 PHP
php和editplus正则表达式去除空白行
Apr 17 PHP
详解ThinkPHP3.2.3验证码显示、刷新、校验
Dec 29 PHP
php的PDO事务处理机制实例分析
Feb 16 PHP
thinkphp5 框架结合plupload实现图片批量上传功能示例
Apr 04 PHP
PHP解密支付宝小程序的加密数据、手机号的示例代码
Feb 26 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读取远程gzip压缩网页的方法
2014/12/29 PHP
PHP图片水印类的封装
2017/07/06 PHP
mouse_on_title.js
2006/08/25 Javascript
js玩一玩WSH吧
2007/02/23 Javascript
JavaScript页面刷新与弹出窗口问题的解决方法
2010/03/02 Javascript
基于jQuery的Tab选项框效果代码(插件)
2011/03/01 Javascript
Ext GridPanel加载完数据后进行操作示例代码
2014/06/17 Javascript
js实现简洁的滑动门菜单(选项卡)效果代码
2015/09/04 Javascript
探讨JavaScript标签位置的存放与功能有无关系
2016/01/15 Javascript
AngularJS 文件上传控件 ng-file-upload详解
2017/01/13 Javascript
jQuery实现的分页功能示例
2017/01/22 Javascript
扩展bootstrap的modal模态框-动态添加modal框-弹出多个modal框
2017/02/21 Javascript
Vue 2.0 服务端渲染入门介绍
2017/03/29 Javascript
bootstrap table sum总数量统计实现方法
2017/10/29 Javascript
JavaScript学习教程之cookie与webstorage
2019/06/23 Javascript
基于Echarts图表在div动态切换时不显示的解决方式
2020/07/20 Javascript
Javascript类型判断相关例题及解析
2020/08/26 Javascript
微信小程序入门之绘制时钟
2020/10/22 Javascript
[00:37]食人魔魔法师轮盘吉兆顺应全新至宝将拥有额外款式
2019/12/19 DOTA
Android分包MultiDex策略详解
2017/10/30 Python
Tensorflow的可视化工具Tensorboard的初步使用详解
2018/02/11 Python
对Python捕获控制台输出流的方法详解
2019/01/07 Python
Python按钮的响应事件详解
2019/03/04 Python
pytorch 指定gpu训练与多gpu并行训练示例
2019/12/31 Python
用 Python 制作地球仪的方法
2020/04/24 Python
Pyinstaller加密打包应用的示例代码
2020/06/11 Python
迪梵英国官方网站:Darphin英国
2017/12/06 全球购物
Eton丹麦官网:精美的男式衬衫
2020/05/27 全球购物
业务主管岗位职责
2013/11/20 职场文书
护理个人求职信范文
2014/01/08 职场文书
优秀通讯员事迹材料
2014/01/28 职场文书
医院领导班子四风对照检查材料
2014/09/27 职场文书
小班上学期个人总结
2015/02/12 职场文书
2015毕业生自我评价范文
2015/03/02 职场文书
幼儿园教师工作总结2015
2015/04/02 职场文书
安全事故隐患排查治理制度
2015/08/05 职场文书