详解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 cookis创建实现代码
Mar 16 PHP
php中检查文件或目录是否存在的代码小结
Oct 22 PHP
thinkphp验证码显示不出来的解决方法
Mar 29 PHP
PHP批量生成静态HTML的简单原理和方法
Apr 20 PHP
PHP实现获取客户端IP并获取IP信息
Mar 17 PHP
php实现随机显示图片方法汇总
May 21 PHP
CI框架简单邮件发送类实例
May 18 PHP
PHP通过加锁实现并发情况下抢码功能
Aug 10 PHP
php实现的网页版剪刀石头布游戏示例
Nov 25 PHP
yii2利用自带UploadedFile实现上传图片的示例
Feb 16 PHP
PHP微信模板消息操作示例
Jun 29 PHP
PHPCrawl爬虫库实现抓取酷狗歌单的方法示例
Dec 21 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
为什么那些咖啡爱好者大多看不上连锁咖啡店?
2021/03/06 咖啡文化
PHP file_get_contents 函数超时的几种解决方法
2009/07/30 PHP
ThinkPHP与PHPExcel冲突解决方法
2011/08/08 PHP
ThinkPHP利用PHPMailer实现邮件发送实现代码
2013/09/26 PHP
Laravel框架中Blade模板的用法示例
2017/08/30 PHP
Jquery上传插件 uploadify v3.1使用说明
2012/06/18 Javascript
onkeypress字符按键兼容所有浏览器使用介绍
2013/04/24 Javascript
javascript版的in_array函数(判断数组中是否存在特定值)
2014/05/09 Javascript
浅谈jQuery中replace()方法
2015/05/13 Javascript
JS实现点击事件统计的简单实例
2016/07/10 Javascript
详解js中Number()、parseInt()和parseFloat()的区别
2016/12/20 Javascript
微信小程序用户授权,以及判断登录是否过期的方法
2019/05/10 Javascript
JQuery特殊效果和链式调用操作示例
2019/05/13 jQuery
JavaScript键盘事件响应顺序详解
2019/09/30 Javascript
使用uni-app开发微信小程序的实现
2019/12/13 Javascript
[53:10]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs VG 第一场
2018/04/11 DOTA
浅谈编码,解码,乱码的问题
2016/12/30 Python
解决Django后台ManyToManyField显示成Object的问题
2019/08/09 Python
python 初始化一个定长的数组实例
2019/12/02 Python
win10系统Anaconda和Pycharm的Tensorflow2.0之CPU和GPU版本安装教程
2019/12/03 Python
Pytoch之torchvision.transforms图像变换实例
2019/12/30 Python
浅谈tensorflow之内存暴涨问题
2020/02/05 Python
Windows环境下Python3.6.8 importError: DLLload failed:找不到指定的模块
2020/11/01 Python
CSS3田字格列表的样式编写方法
2018/11/22 HTML / CSS
浅谈基于Canvas的手绘风格图形库Rough.js
2018/03/19 HTML / CSS
英国领先的高街书籍专家:Waterstones
2018/02/01 全球购物
请问软件开发中的设计模式你会使用哪些
2015/05/13 面试题
简单的JAVA编程面试题
2013/03/19 面试题
制药工程专业毕业生推荐信
2013/12/24 职场文书
纠风工作实施方案
2014/03/15 职场文书
小学优秀班集体申报材料
2014/05/25 职场文书
医院深入开展党的群众路线教育实践活动实施方案
2014/08/27 职场文书
交通事故协议书范本
2014/11/18 职场文书
Python djanjo之csrf防跨站攻击实验过程
2021/05/14 Python
Vue3.0中Ref与Reactive的区别示例详析
2021/07/07 Vue.js
浅谈spring boot使用thymeleaf版本的问题
2021/08/04 Java/Android