详解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脚本的10个技巧(4)
Oct 09 PHP
PHP用户指南-cookies部分
Oct 09 PHP
APMServ使用说明
Oct 23 PHP
Wordpress php 分页代码
Oct 21 PHP
php中实现记住密码自动登录的代码
Mar 02 PHP
PHP数组操作汇总 php数组的使用技巧
Jul 17 PHP
Linux Apache PHP Oracle 安装配置(具体操作步骤)
Jun 17 PHP
PHP随机获取未被微信屏蔽的域名(微信域名检测)
Mar 19 PHP
PHP实现的简单操作SQLite数据库类与用法示例
Jun 19 PHP
浅谈Laravel模板实体转义带来的坑
Oct 22 PHP
php 命名空间(namespace)原理与用法实例小结
Nov 13 PHP
laravel与thinkphp之间的区别与优缺点
Mar 02 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
我的群发邮件程序
2006/10/09 PHP
php二维数组用键名分组相加实例函数
2013/11/06 PHP
php代码审计比较有意思的例子
2014/05/07 PHP
javascript offsetX与layerX区别
2010/03/12 Javascript
js实现网页随机切换背景图片的方法
2014/11/01 Javascript
JS仿iGoogle自定义首页模块拖拽特效的方法
2015/02/13 Javascript
使用Node.js为其他程序编写扩展的基本方法
2015/06/23 Javascript
jQuery实现简单的列表式导航菜单效果代码
2015/08/31 Javascript
JavaScript添加随滚动条滚动窗体的方法
2016/02/23 Javascript
jquery 判断div show的状态实例
2016/12/03 Javascript
nodejs入门教程三:调用内部和外部方法示例
2017/04/24 NodeJs
微信小程序 开发之全局配置
2017/05/05 Javascript
vue 系列——vue2-webpack2框架搭建踩坑之路
2017/12/22 Javascript
JS实现指定区域的全屏显示功能示例
2019/04/25 Javascript
微信小程序点餐系统开发常见问题汇总
2019/08/06 Javascript
Vue触发input选取文件点击事件操作
2020/08/07 Javascript
布同自制Python函数帮助查询小工具
2011/03/13 Python
使用Python下载歌词并嵌入歌曲文件中的实现代码
2015/11/13 Python
python批量制作雷达图的实现方法
2016/07/26 Python
Python3.X 线程中信号量的使用方法示例
2017/07/24 Python
Python爬虫框架scrapy实现的文件下载功能示例
2018/08/04 Python
在Python中Dataframe通过print输出多行时显示省略号的实例
2018/12/22 Python
Python 实现还原已撤回的微信消息
2019/06/18 Python
Python学习笔记之lambda表达式用法详解
2019/08/08 Python
Python3批量创建Crowd用户并分配组
2020/05/20 Python
用python实现学生管理系统
2020/07/24 Python
UGG雪地靴德国官网:UGG德国
2016/11/19 全球购物
查找廉价航班和发现新目的地:Kiwi.com
2019/02/25 全球购物
卡拉威高尔夫官方网站:Callaway Golf
2020/09/16 全球购物
电子商务专业个人的自我评价分享
2013/10/29 职场文书
公司新员工的演讲稿注意事项
2014/01/01 职场文书
大一军训感言
2014/01/09 职场文书
群众路线领导对照材料
2014/08/23 职场文书
2015年感恩节演讲稿(优选篇)
2015/03/20 职场文书
Nginx配置https原理及实现过程详解
2021/03/31 Servers
Python实现智慧校园自动评教全新版
2021/06/18 Python