当前位置:首页 > PHP教程 > php高级应用 > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2021-09-11 10:44:25 浏览: 评论:0 

这篇文章主要介绍了详解php curl带有csrf-token验证模拟提交方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考,一起跟随小编过来看看吧。

通常为了安全会在表单里加入一个随机的token值来防止csrf攻击。

要想模拟提交有token验证的网站其实也不难。

1.通过正则获取token

2.带上获取到的token模拟提交

下面是一个成功的例子

目录结构

  1. │ form.php –需要模拟的表单  
  2. │ getForm.php – 模拟提交程序  
  3. │ post.php –表单验证程序  
  4. │  
  5. └─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.  
  7. $post['token'] = $match[1]; 
  8. $post['name'] = '3333333'
  9. $post['password'] = '12121213'
  10. print_r(getResponse('http://a.curl.com:81/post.php'$post$cookie_file)); 
  11.  
  12. function getResponse($url$data=[], $cookie_file=''$timeout = 3) 
  13.   { 
  14.     if(emptyempty($cookie_file)) 
  15.     { 
  16.       $cookie_file = '.cookie'
  17.     } 
  18.  
  19.     $ch = curl_init(); 
  20.     curl_setopt($ch, CURLOPT_URL, $url); 
  21.     curl_setopt($ch, CURLOPT_REFERER, "https://www.baidu.com");  //构造来路 
  22.     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"); 
  23.  
  24.     if(!emptyempty($data)) 
  25.     { 
  26.       curl_setopt($ch, CURLOPT_POST, true); 
  27.       curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 
  28.     } 
  29.     curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);// 取cookie的参数是 
  30.     curl_setopt ($ch, CURLOPT_COOKIEFILE, $cookie_file); //发送cookie 
  31.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
  32.     curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 
  33.     try 
  34.     { 
  35.        $handles = curl_exec($ch); 
  36.        curl_close($ch); 
  37.        return $handles
  38.     } 
  39.     catch (Exception $e
  40.     { 
  41.       echo 'Caught exception: '$e->getMessage(), "\n"
  42.     } 
  43.     unlink($cookie_file); 
  44.   } 

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(emptyempty($_POST['token'])) 
  4.   exit ("token is empty!"); 
  5.  
  6. if(emptyempty($_SESSION['token'])) 
  7.  exit ("session is empty"); 
  8.  
  9. if($_POST['token'] != $_SESSION['token']) 
  10.   exit ("token "); 
  11. else 
  12.   unset($_SESSION['token']); 
  13.  
  14. echo PHP_EOL; 
  15. echo "pass"
  16. print_r($_REQUEST); 
  17.  
  18. echo PHP_EOL; 
  19. print_r($_SERVER);

Tags: curl csrf-token

分享到: