详解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 相关文章推荐
第四节--构造函数和析构函数
Nov 16 PHP
PHP编程过程中需要了解的this,self,parent的区别
Dec 30 PHP
为IP查询添加GOOGLE地图功能的代码
Aug 08 PHP
php缩放图片(根据宽高的等比例缩放)实例介绍
Jun 09 PHP
php使用date和strtotime函数输出指定日期的方法
Nov 14 PHP
Yii实现自动加载类地图的方法
Apr 01 PHP
关于WordPress的SEO优化相关的一些PHP页面脚本技巧
Dec 10 PHP
Zend Framework教程之模型Model用法简单实例
Mar 04 PHP
PHP7 新特性详细介绍
Sep 06 PHP
php 运算符与表达式详细介绍
Nov 30 PHP
利用PHP访问MySql数据库的逻辑操作以及增删改查的实例讲解
Aug 30 PHP
如何利用PHP实现上传图片功能详解
Sep 24 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/01 无线电
PHP及Zend Engine的线程安全模型分析
2011/11/10 PHP
实例讲解PHP面向对象之多态
2014/08/20 PHP
PHP的Yii框架中过滤器相关的使用总结
2016/03/29 PHP
PHP Swoole异步Redis客户端实现方法示例
2019/10/24 PHP
不能再简单的无闪刷新验证码原理很简单
2007/11/05 Javascript
node在两个div之间移动,用ztree实现
2013/03/06 Javascript
js写的方法实现上传图片之后查看大图
2014/03/05 Javascript
jquery实现键盘左右翻页特效
2015/04/30 Javascript
jQuery判断一个元素是否可见的方法
2015/06/05 Javascript
微信JSAPI支付操作需要注意的细节
2017/01/10 Javascript
从零学习node.js之模块规范(一)
2017/02/21 Javascript
使用html+js+css 实现页面轮播图效果(实例讲解)
2017/09/21 Javascript
微信小程序开发常见问题及解决方案
2019/07/11 Javascript
转换layUI的数据表格中的日期格式方法
2019/09/19 Javascript
layer.prompt使文本框为空的情况下也能点击确定的方法
2019/09/24 Javascript
Vue 数组和对象更新,但是页面没有刷新的解决方式
2019/11/09 Javascript
React服务端渲染原理解析与实践
2021/03/04 Javascript
在Django的模型中执行原始SQL查询的方法
2015/07/21 Python
Python聊天室实例程序分享
2016/01/05 Python
利用pyinstaller或virtualenv将python程序打包详解
2017/03/22 Python
利用python求解物理学中的双弹簧质能系统详解
2017/09/29 Python
Python算法输出1-9数组形成的结果为100的所有运算式
2017/11/03 Python
基于Python开发chrome插件的方法分析
2018/07/07 Python
浅谈pycharm下找不到sqlalchemy的问题
2018/12/03 Python
python找出一个列表中相同元素的多个索引实例
2019/06/11 Python
python 定义类时,实现内部方法的互相调用
2019/12/25 Python
40行Python代码实现天气预报和每日鸡汤推送功能
2020/02/27 Python
OpenCV 之按位运算举例解析
2020/06/19 Python
UGG雪地靴荷兰官网:UGG荷兰
2016/09/09 全球购物
英国最大的在线照明商店:Litecraft
2020/08/31 全球购物
城管执法人员纪律作风整顿思想汇报
2014/09/13 职场文书
家庭困难证明
2014/10/12 职场文书
软弱涣散基层党组织整改方案
2014/10/25 职场文书
2014年大学团支部工作总结
2014/12/02 职场文书
nginx 配置指令之location使用详解
2022/05/25 Servers