详解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开发入门教程之面向对象
Dec 05 PHP
PHP 错误之引号中使用变量
May 04 PHP
php ss7.5的数据调用 (笔记)
Mar 08 PHP
详解PHP内置访问资源的超时时间 time_out file_get_contents read_file
Jun 03 PHP
PHP删除HTMl标签的实现代码
Jun 30 PHP
php根据isbn书号查询amazon网站上的图书信息的示例
Feb 13 PHP
ThinkPHP中Session用法详解
Nov 29 PHP
php正则表达式获取内容所有链接
Jul 24 PHP
php实现的微信红包算法分析(非官方)
Sep 25 PHP
Laravel构建即时应用的一种实现方法详解
Aug 31 PHP
laravel 配置路由 api和web定义的路由的区别详解
Sep 03 PHP
PHP使用非对称加密算法RSA
Apr 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
php判断类是否存在函数class_exists用法分析
2014/11/14 PHP
简单谈谈php中的unicode和utf8编码
2015/06/10 PHP
Thinkphp框架 表单自动验证登录注册 ajax自动验证登录注册
2016/12/27 PHP
简单谈谈PHP面向对象之标识对象
2017/06/27 PHP
学习YUI.Ext第七日-View&amp;JSONView Part Two-一个画室网站的案例
2007/03/10 Javascript
关于jquery css的使用介绍
2013/04/18 Javascript
window.location.href的用法(动态输出跳转)
2014/08/09 Javascript
jQuery中noConflict()用法实例分析
2015/02/08 Javascript
JavaScript实现的类字典插入或更新方法实例
2015/07/10 Javascript
JavaScript结合Bootstrap仿微信后台多图文界面管理
2016/07/22 Javascript
Vue.js每天必学之表单控件绑定
2016/09/05 Javascript
JavaScript 随机验证码的生成实例代码
2016/09/22 Javascript
jQuery css() 方法动态修改CSS属性
2016/09/25 Javascript
基于Bootstrap漂亮简洁的CSS3价格表(附源码下载)
2017/02/28 Javascript
Javascript(es2016) import和require用法和区别详解
2017/08/11 Javascript
自定义类似于jQuery UI Selectable 的Vue指令v-selectable
2017/08/23 jQuery
JavaScript动态加载重复绑定问题
2018/04/01 Javascript
浅谈微信JS-SDK 微信分享接口开发(介绍版)
2018/08/15 Javascript
vuex实现像调用模板方法一样调用Mutations方法
2019/11/06 Javascript
vue+Element中table表格实现可编辑(select下拉框)
2020/05/21 Javascript
浅析Python 中整型对象存储的位置
2016/05/16 Python
python编码总结(编码类型、格式、转码)
2016/07/01 Python
解决Linux系统中python matplotlib画图的中文显示问题
2017/06/15 Python
Python中字典的浅拷贝与深拷贝用法实例分析
2018/01/02 Python
python实现播放音频和录音功能示例代码
2018/12/30 Python
在numpy矩阵中令小于0的元素改为0的实例
2019/01/26 Python
Python实现从SQL型数据库读写dataframe型数据的方法【基于pandas】
2019/03/18 Python
Python Scrapy图片爬取原理及代码实例
2020/06/12 Python
如何验证python安装成功
2020/07/06 Python
CSS3 函数技巧 用css 实现js实现的事情(clac Counters Tooltip)
2017/08/15 HTML / CSS
北美大型运动类产品商城:Champs Sports
2017/01/12 全球购物
电气工程及其自动化自我评价四篇
2013/09/24 职场文书
统计学专业毕业生的自我评价分享
2013/11/28 职场文书
2016党员学习心得体会范文
2016/01/23 职场文书
Django开发RESTful API实现增删改查(入门级)
2021/05/10 Python
vue使用Google Recaptcha验证的实现示例
2021/08/23 Vue.js