详解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面向对象全攻略 (五) 封装性
Sep 30 PHP
PHP数据库调用类调用实例(详细注释)
Jul 12 PHP
php中定时计划任务的实现原理
Jan 08 PHP
apache配置虚拟主机的方法详解
Jun 17 PHP
页面利用渐进式JPEG来提升用户体验度
Dec 01 PHP
Laravel 5框架学习之表单验证
Apr 08 PHP
php结合ACCESS的跨库查询功能
Jun 12 PHP
PHP各种异常和错误的拦截方法及发生致命错误时进行报警
Jan 19 PHP
PHP读取XML格式文件的方法总结
Feb 27 PHP
PHP下载远程图片的几种方法总结
Apr 07 PHP
Thinkphp整合阿里云OSS图片上传实例代码
Apr 28 PHP
php实现通过stomp协议连接ActiveMQ操作示例
Feb 23 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
使用gd库实现php服务端图片裁剪和生成缩略图功能分享
2013/12/25 PHP
php计算函数执行时间的方法
2015/03/20 PHP
PHP MSSQL 分页实例
2016/04/13 PHP
php字符串操作常见问题小结
2016/10/11 PHP
php中try catch捕获异常实例详解
2020/08/06 PHP
jQuery AJAX回调函数this指向问题
2010/02/08 Javascript
你必须知道的Javascript知识点之&quot;深入理解作用域链&quot;的介绍
2013/04/23 Javascript
删除节点的jquery代码
2014/01/13 Javascript
node.js中的fs.fsync方法使用说明
2014/12/15 Javascript
JavaScript将当前时间转换成UTC标准时间的方法
2015/04/06 Javascript
JavaScript实现彩虹文字效果的方法
2015/04/16 Javascript
jQuery简单实现input文本框内灰色提示文本效果的方法
2015/12/02 Javascript
jQuery移动页面开发中的触摸事件与虚拟鼠标事件简介
2015/12/03 Javascript
JavaScript给input的value赋值引发的关于基本类型值和引用类型值问题
2015/12/07 Javascript
JS实现点击事件统计的简单实例
2016/07/10 Javascript
浅谈js对象属性 通过点(.) 和方括号([]) 的不同之处
2016/10/29 Javascript
深入理解JS继承和原型链的问题
2016/12/17 Javascript
HTML5+jQuery实现搜索智能匹配功能
2017/03/24 jQuery
vue时间格式化实例代码
2017/06/13 Javascript
vue实现的网易云音乐在线播放和下载功能案例
2019/02/18 Javascript
nodejs的安装使用与npm的介绍
2019/09/11 NodeJs
vue v-for 点击当前行,获取当前行数据及event当前事件对象的操作
2020/09/10 Javascript
python实现马耳可夫链算法实例分析
2015/05/20 Python
python中kmeans聚类实现代码
2018/02/23 Python
python3利用Socket实现通信的方法示例
2019/05/06 Python
Python 操作mysql数据库查询之fetchone(), fetchmany(), fetchall()用法示例
2019/10/17 Python
python DataFrame转dict字典过程详解
2019/12/26 Python
python实现贪吃蛇双人大战
2020/04/18 Python
python操作ini类型配置文件的实例教程
2020/10/30 Python
python 中 .py文件 转 .pyd文件的操作
2021/03/04 Python
CSS3实现多背景展示效果通过CSS3定位多张背景
2014/08/10 HTML / CSS
请说出这段代码执行后a和b的值分别是多少
2015/03/28 面试题
传播学专业毕业生自荐信
2013/11/04 职场文书
2014年感恩母亲演讲稿
2014/05/27 职场文书
银行实习推荐信
2015/03/27 职场文书
Java中Quartz高可用定时任务快速入门
2022/04/03 Java/Android