详解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 读取文件内容代码(txt,js等)
Dec 06 PHP
apache和php之间协同工作的配置经验分享
Apr 08 PHP
PHP cURL初始化和执行方法入门级代码
May 28 PHP
PHP伪造来源HTTP_REFERER的方法实例详解
Jul 06 PHP
PHP读取配置文件类实例(可读取ini,yaml,xml等)
Jul 28 PHP
PHP多维数组遍历方法(2种实现方法)
Dec 10 PHP
PHP实现针对日期,月数,天数,周数,小时,分,秒等的加减运算示例【基于strtotime】
Apr 19 PHP
PHP CodeIgniter分页实例及多条件查询解决方案(推荐)
May 20 PHP
PHP Socket网络操作类定义与用法示例
Aug 30 PHP
PHP获取文件扩展名的常用方法小结【五种方式】
Apr 27 PHP
laravel 解决crontab不执行的问题
Oct 22 PHP
php面向对象基础详解【星际争霸游戏案例】
Jan 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
php实现计数器方法小结
2015/01/05 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
2017/09/16 PHP
javascript 操作select下拉列表框的一点小经验
2010/03/20 Javascript
使用ajax+jqtransform实现动态加载select
2014/12/01 Javascript
Javascript堆排序算法详解
2014/12/03 Javascript
jQuery学习笔记之jQuery中的$
2015/01/19 Javascript
JavaScript使用setInterval()函数实现简单轮询操作的方法
2015/02/02 Javascript
JQuery实现简单的图片滑动切换特效
2015/11/22 Javascript
JavaScript模拟数组合并concat
2016/03/06 Javascript
jquery实现跳到底部,回到顶部效果的简单实例(类似锚)
2016/07/10 Javascript
手机浏览器 后退按钮强制刷新页面方法总结
2016/10/09 Javascript
JavaScript 计算笛卡尔积实例详解
2016/12/02 Javascript
jfinal与bootstrap的登出实战详解
2017/11/27 Javascript
10个最受欢迎的 JavaScript框架(推荐)
2019/04/24 Javascript
vue引入微信sdk 实现分享朋友圈获取地理位置功能
2019/07/04 Javascript
vscode vue 文件模板的配置方法
2019/07/23 Javascript
Python遍历numpy数组的实例
2018/04/04 Python
使用Python监视指定目录下文件变更的方法
2018/10/15 Python
python将list转为matrix的方法
2018/12/12 Python
python utc datetime转换为时间戳的方法
2019/01/15 Python
python os模块简单应用示例
2019/05/23 Python
Python面向对象之类的封装操作示例
2019/06/08 Python
Python和Sublime整合过程图示
2019/12/25 Python
Jupyter notebook 启动闪退问题的解决
2020/04/13 Python
基于python实现上传文件到OSS代码实例
2020/05/09 Python
深入理解HTML5定时器requestAnimationFrame的使用
2018/12/12 HTML / CSS
华润集团网上药店:健一网
2016/09/19 全球购物
ruby如何进行集成操作?Ruby能进行多重继承吗?
2013/10/16 面试题
开学季活动策划方案
2014/02/28 职场文书
平面设计专业大学生职业规划书
2014/03/12 职场文书
《特殊的葬礼》教学反思
2014/04/27 职场文书
夫妻双方自愿离婚协议书
2014/10/24 职场文书
2016年大学自主招生自荐信范文
2015/03/24 职场文书
债务追讨律师函
2015/06/24 职场文书
银行客户经理培训心得体会
2016/01/09 职场文书
python关于集合的知识案例详解
2021/05/30 Python