详解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 相关文章推荐
PHPShop存在多个安全漏洞
Oct 09 PHP
php 移除数组重复元素的一点说明
Nov 27 PHP
php 魔术方法使用说明
Oct 20 PHP
php中将地址生成迅雷快车旋风链接的代码[测试通过]
Apr 20 PHP
探讨:array2xml和xml2array以及xml与array的互相转化
Jun 24 PHP
实现在同一方法中获取当前方法中新赋值的session值解决方法
Jun 26 PHP
PHP解码unicode编码的中文字符代码分享
Aug 13 PHP
Laravel框架中实现使用阿里云ACE缓存服务
Feb 10 PHP
分享php分页的功能模块
Jun 16 PHP
PHP 访问数据库配置通用方法(json)
May 20 PHP
PHP实现打包zip并下载功能
Jun 12 PHP
解决Laravel无法使用COOKIE和SESSION的问题
Oct 16 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中\r \r\n \t的区别示例介绍
2014/02/08 PHP
php获取图片信息的方法详解
2015/12/10 PHP
yii2缓存Caching基本用法示例
2016/07/18 PHP
php使用curl_init()和curl_multi_init()多线程的速度比较详解
2018/08/15 PHP
改写一个简单的菜单 弹性大小
2010/12/02 Javascript
基于jquery的内容循环滚动小模块(仿新浪微博未登录首页滚动微博显示)
2011/03/28 Javascript
jQuery.get、jQuery.getJSON、jQuery.post无法返回JSON问题的解决方法
2011/07/28 Javascript
javascript中的事件代理初探
2014/03/08 Javascript
js点击事件链接的问题解决
2014/04/25 Javascript
JavaScript encodeURI 和encodeURIComponent
2015/12/04 Javascript
js中字符串编码函数escape()、encodeURI()、encodeURIComponent()区别详解
2016/04/01 Javascript
Bootstrap实现带动画过渡的弹出框
2016/08/09 Javascript
JavaScript 监控微信浏览器且自带返回按钮时间
2016/11/27 Javascript
nodejs个人博客开发第七步 后台登陆
2017/04/12 NodeJs
Angular js 实现添加用户、修改密码、敏感字、下拉菜单的综合操作方法
2017/10/24 Javascript
解决koa2 ctx.render is not a function报错问题
2018/08/07 Javascript
vue 中几种传值方法(3种)
2019/11/12 Javascript
微信小程序入门之绘制时钟
2020/10/22 Javascript
Python中subprocess的简单使用示例
2015/07/28 Python
Python3 适合初学者学习的银行账户登录系统实例
2017/08/08 Python
解决Pycharm调用Turtle时 窗口一闪而过的问题
2019/02/16 Python
Python生成MD5值的两种方法实例分析
2019/04/26 Python
简单分析python的类变量、实例变量
2019/08/23 Python
Python 使用多属性来进行排序
2019/09/01 Python
python中的selenium安装的步骤(浏览器自动化测试框架)
2020/03/17 Python
Jupyter Notebook添加代码自动补全功能的实现
2021/01/07 Python
css3制作彩色边线3d立体按钮的示例(css3按钮)
2014/05/06 HTML / CSS
html5启动原生APP总结
2020/07/03 HTML / CSS
模具数控专业自荐信
2014/01/27 职场文书
喷漆工的岗位职责
2014/03/17 职场文书
入党积极分子自我鉴定范文
2014/03/25 职场文书
就业意向书范文
2014/04/01 职场文书
国企干部对照检查材料
2014/08/22 职场文书
英语读书笔记
2015/07/02 职场文书
2015年国庆节新闻稿
2015/07/18 职场文书
详细聊聊Oracle表碎片对性能有多大的影响
2022/03/19 Oracle