• 售前

  • 售后

热门帖子
入门百科

详解php curl带有csrf-token验证模仿提交方法

[复制链接]
浩渺小竹排浩az 显示全部楼层 发表于 2021-10-25 19:52:00 |阅读模式 打印 上一主题 下一主题
通常为了安全会在表单里加入一个随机的token值来防止csrf攻击。

要想模拟提交有token验证的网站其实也不难。
1.通过正则获取token
2.带上获取到的token模拟提交
下面是一个乐成的例子

目次结构
  1. │ form.php –需要模拟的表单
  2. │ getForm.php – 模拟提交程序
  3. │ post.php –表单验证程序
  4. └─cookie – cookie存放目录
复制代码
getForm.php
  1. <?php
  2. $cookie_file = './cookie/'.time().'.cookie';
  3. $str = getResponse('http://a.curl.com:81/form.php',[],$cookie_file);
  4. setcookie("PHPSESSID", "vc0heoa6lfsi3gger54pkns152");
  5. preg_match('/<input name="token" type="hidden" value="(.*)"/U', $str, $match);
  6. $post['token'] = $match[1];
  7. $post['name'] = '3333333';
  8. $post['password'] = '12121213';
  9. print_r(getResponse('http://a.curl.com:81/post.php', $post, $cookie_file));
  10. function getResponse($url, $data=[], $cookie_file='', $timeout = 3)
  11.   {
  12.     if(empty($cookie_file))
  13.     {
  14.       $cookie_file = '.cookie';
  15.     }
  16.     $ch = curl_init();
  17.     curl_setopt($ch, CURLOPT_URL, $url);
  18.     curl_setopt($ch, CURLOPT_REFERER, "https://www.baidu.com");  //构造来路
  19.     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");
  20.     if(!empty($data))
  21.     {
  22.       curl_setopt($ch, CURLOPT_POST, true);
  23.       curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
  24.     }
  25.     curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);// 取cookie的参数是
  26.     curl_setopt ($ch, CURLOPT_COOKIEFILE, $cookie_file); //发送cookie
  27.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  28.     curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
  29.     try
  30.     {
  31.        $handles = curl_exec($ch);
  32.        curl_close($ch);
  33.        return $handles;
  34.     }
  35.     catch (Exception $e)
  36.     {
  37.       echo 'Caught exception: ', $e->getMessage(), "\n";
  38.     }
  39.     unlink($cookie_file);
  40.   }
复制代码
form.php
  1. <?php
  2. session_start();
  3. $_SESSION['token'] = md5($_SERVER['REQUEST_TIME']);
  4. $_SESSION['time'] = date("Y-m-d H:i:s");
  5. session_write_close();
  6. //echo $_SESSION['auth'];
  7. ?>
  8. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  9. <html xmlns="http://www.w3.org/1999/xhtml">
  10. <head>
  11. <title> new document </title>
  12. <meta name="generator" content="editplus" />
  13. <meta name="author" content="" />
  14. <meta name="keywords" content="" />
  15. <meta name="description" content="" />
  16. </head>
  17. <body>
  18. <form action="post.php" method="post">
  19.   <p><input name="name" type="text"></p>
  20.   <p><input name="password" type="password"></p>
  21.   <p><input name="token" type="hidden" value="<?php echo $_SESSION['token']?>"></p>
  22.   <p><input type="submit"></p>
  23. </form>
  24. </body>
  25. </html>
复制代码
post.php
  1. <?php
  2. session_start();
  3. if(empty($_POST['token']))
  4. {
  5.   exit ("token is empty!");
  6. }
  7. if(empty($_SESSION['token']))
  8. {
  9. exit ("session is empty");
  10. }
  11. if($_POST['token'] != $_SESSION['token'])
  12. {
  13.   exit ("token ");
  14. } else
  15. {
  16.   unset($_SESSION['token']);
  17. }
  18. echo PHP_EOL;
  19. echo "pass";
  20. print_r($_REQUEST);
  21. echo PHP_EOL;
  22. print_r($_SERVER);
复制代码
以上就是本文的全部内容,盼望对大家的学习有所帮助,也盼望大家多多支持草根技术分享。

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作