首页 > php > php curl post 登录发帖详解

php curl post 登录发帖详解

通过这个例子来学习一下模拟登录,模拟发帖, 也应该明白一下验证码的重要性

1.思路

1.先登录一遍目标网站,用谷歌浏览器的F12调试工具或fiddler 来抓一个包 看看登录要提交哪些字段数据。

2.创建一个cookie文件 ,开始curl post登录 ,登录成功后把cookie写入刚创建的文件

3.curl post 发帖,发帖时带上刚保存的cookie文件,打印发帖结果

2.实践

1.登录抓包 抓包打开浏览器F12看一下header头就可以了(附图)

php  curl post 登录发帖详解 - 第1张  | 博客一个

上代码

header("content-Type: text/html; charset=UTF-8");
$cookie_file = tempnam('./temp', 'cookie');
$login_url="http://bbs.xxx/user/login";
$post_fields="user=111111&pass=111111";


//提交登录表单请求
$ch=curl_init($login_url);
//获取http头部信息 0为不获取
curl_setopt($ch,CURLOPT_HEADER,0);

//显示网页信息逻辑 ,还是存储到变量  1为保存到变量 0为显示
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);

//发生post请求
curl_setopt($ch,CURLOPT_POST,1);

//post 字段,如果有汉字需要 url转码
curl_setopt($ch,CURLOPT_POSTFIELDS,$post_fields);


//关键!存储提交后得到的cookie数据 发帖要用到
curl_setopt($ch,CURLOPT_COOKIEJAR,$cookie_file); 


//保存结果 
$t=curl_exec($ch);


//关闭链接
curl_close($ch);


//把登录结果放到  日志里,查看登录是否成功
file_put_contents('login.log', $t);





//可以用数组,也可以拼接例如 
//$field="title=11111111&content=222222222&forum=0&fileid=&filegold=&filemess=&filehide=&thide=0&tgold=";
$data['title']="框架很优秀,点赞!";
$data['content']="再次点赞,再次点赞";
$data['forum']=1;
$data['thide']=0;


$refer= 'http://bbs.xxx.com/post.html?fid=0'; 
$url="http://bbs.xxx.com/post.html";



//发帖过程,前几步都大同小异,就是cookie 步骤上这里是 发送cookie 不是保存cookie
$ch1=curl_init($url);
curl_setopt($ch1,CURLOPT_HEADER,0);

//这里显示一下发帖结果
curl_setopt($ch1,CURLOPT_RETURNTRANSFER,0);
curl_setopt($ch1, CURLOPT_REFERER, $refer); 
curl_setopt($ch1,CURLOPT_POST,1);
curl_setopt($ch1,CURLOPT_POSTFIELDS,$data);
curl_setopt($ch1,CURLOPT_COOKIEFILE,$cookie_file); //关键!!!带上登录后的cookie去发帖
curl_setopt($ch1, CURLOPT_FOLLOWLOCATION, 0);
curl_exec($ch1);
curl_close($ch1);


 3.安全

到了这时候,这个论坛已经沦陷,有了模拟发帖脚本,再写一个多线程脚本,几分钟内就可以发出几万,几十万万帖子,导致论坛无法正常运营

如果登录要加验证码,会增加难度,但依然无法避免,因为可以用浏览器拿到登录后的cookie, 然后发帖的时候带上已登陆的cookie 依然可以发帖,如果每次发帖都需要填写验证码倒是可以避免,但是用户体验又会下降,

最好的解决办法是用 令牌 token, 打开发帖页面 从服务器请求一个 加密后的token, 提交发帖请求的时候必须带上这个token, 然后服务器来对比token是否正确,这个token 应该与uid绑定,并且时间戳也参与进来,

或限制用户每次发帖间隔时间,和每日发帖上限,这样可以减轻这种风险,但无法避免。

安全和注入一直都是一场博弈,怎样能在兼顾用户体验的前提下下 ,还能做到足够安全,这就需要专业人士来解答了。