Archive for the '网络技术' Category

不良访问记录

Wednesday, May 7th, 2008

近段把玩statpress,为了加强对其运作机理的掌握,时不时下载访问记录数据库浏览下,作用不少:可以补充完善搜索数据库数据,比如陆续增加了对Google cn、Soso、Vnet cn、3721和Yahoo cn的支持;可以补充完善Spider数据库;可以检验修改后代码的执行效果,比如对spider记录的删除操作验证,但偶然间,me发现了不少让me倒吸一口冷气的urlrequested。难道这就是传说中的恶意访问记录?意图何在,想拿me的小站试试黑手啊?!

、先看这样两个:/data/dvbbs7.mdb/bbs/data/dvbbs7.mdb,IP是121.22.12.35。看来是试图下载me的论坛数据库(Microsoft Access格式的),但问题是me没有架论坛啊。估计是遍地撒网式的恶意访问,而不是某黑客有意为之。

、还有一个奇怪的referrer:

http://219.133.33.37:8080/update/step1.aspx?
p=c3pmZHc5ODVAMTYzLmdkAAAAAAAAAAAAAAAAAAAA
|1210055246|
undefined|994|1280
|32|1024|1280

me把这个拷贝到地址栏,晕啊,汗啊,居然自动进入了me的后台管理界面。把这个地址拷贝到IE下访问,过了几秒钟后地址居然变成了含有step2.aspx字样的地址。看来是有意为之的恶意访问记录,还是假设在服务器上的。好在IP明目张胆的存在着,Google之Yahoo之。结果都差不多,这是个病毒网站,后来翻到月光博客的一篇专题文章“谁控制了我们的浏览器?”才得缘由底细,原来是被劫持了,居然又是天杀的流氓--中国电信。me在这里推荐月光的解决办法:

A、请各单位的网络管理员,在网络的边界设备上,完全封锁211.147.5.121。
B、在你自己的个人防火墙上,完全封锁211.147.5.121。
C、如果你的浏览器是FireFox、Opera、GreenBrowser、或者MyIE,可以把“http://211.147.5.121/*”丢到弹出窗口过滤列表中去。

(更新:更完全的讨论和解决办法见有效解决电信ADSL用户HTTP会话被劫持的好办法

、还有这样的访问:

/Editor/admin_login.asp
/eWebEditor/admin_login.asp
/Editor/z9v8admin_login.asp
/Editor/admin_login.asp
/admin/edit/z9v8admin_login.asp
之类的,IP是61.178.82.56,两分钟内试着访问了24个类似上面的地址,看来又是个恶意网站或机器人,又是asp。查IP是甘肃省兰州市电信。

twitter on 2008-05-06

Tuesday, May 6th, 2008

  • feedcount无法正常访问feedburner的api了?! #
  • 居然发现这样的访问记录:May 6, 2008 11:08:25 /data/dvbbs7.mdb,来着不善啊! #

Powered by Twitter Tools.

twitter on 2008-05-04

Sunday, May 4th, 2008
  • 好惨啊!http://52good.skylast.com/ 居然被墙了 #
  • 被墙时间:2008年5月4日下午1:51左右,+8区时间。 #
  • 世界真美好! #
  • Please download file: http://tinyurl.com/5cczgh #
  • 今天立夏,是不是已经进入一伏了呢?! #

Powered by Twitter Tools.

升级StatPress的功能(完美支持中文)

Monday, April 28th, 2008

自从不经意间中对StatPress做了些小修改后,me跌跌撞撞的进入了php空间。感觉还不错,确实简单易学,也很强大。很想在学习的过程中做点什么,最后还是选择了那这个statpress开刀,以它为基础进行扩展升级。

完美支持中文的搜索关键词统计

在后台浏览统计信息发现搜索关键词有不少是乱码,能正确识别的中文字符没几个。把鼠标放上去点到来源地址去看又是好的,看来是statpress对中文不太友好导致的。到作者主页反应了这个问题,好久没有回音,看来还是自己解决算了。检查源码,发现在处理referrer时仅仅使用了urldecode函数对url进行解码,这对utf-8编码的是非常有效的,但对于中国用户常用的gb2312就不行了。

解决办法时把几个中文的搜索引擎(如baidu和google.cn等)单独判断,识别出来后用iconv转换一道。OK,测试成功。

后来发现还是有中文乱码。再查看链接,发现有不少搜索引擎在url中直接定义了语言编码如gb2312或utf-8。这也好办,增加一层判断就行了。如果指明了编码,直接根据其定义分别处理,然后才是针对me定义的中文搜索引擎进行专项处理。于是天下太平,到目前为止所有的中文搜索关键词都正常显示了。

增加对本站直接订阅feed的统计功能

订阅数量统计中,me借用两个插件实现了网站订阅的总量统计。把玩statpress的时候me发现其实它对feed的订阅情况也有统计,既然这样,干嘛多装一个插件呢。说干就干,用sql语句把feed的总数读出并做一个专门的函数输出订阅信息方便外部直接调用。这个函数调用了Feed Count对feedburner订阅的统计信息,不过如果没有安装FC也无所谓,大不了不统计罢了,statpres还可以正常运行。增加了对时间区间的限制,只取近三个月的活跃订阅。

修正了热帖(TopPost)功能

原函数仅针对permalink是默认情况下有效,对于其他格式的permalink没法产生作用。me修改后支持了形如/month/day/postname.html格式的支持。

增加了文章热度的支持

用当前页面访问量和总访问量进行除操作后得出当前文章的热度或流行度。

注:使用dreamweaver做wordpress主题感觉还是很不错的。

——————————————————————————————————

下载wp-statpress(modified by heart5)

使用:解压后上传至wp-content下的plugins子目录下即可。

注意:请勿使用插件自动更新,否则升级功能全部自动消除。

——————————————————————————————————

twitter on 2008-04-27

Sunday, April 27th, 2008
  • 在blog的访问记录中发现含有QQDownload字样的agent,查阅了资料,是腾讯下载软件中内嵌的浏览器。内嵌浏览器来自 http://bsalsa.com/index.html #

Powered by Twitter Tools.

关于WordPress的插件开发

Thursday, April 24th, 2008

继续优化statpress过程中觉得有必要进一步了解wordpress的函数和相关开发知识,因为对很多语句有点读不懂啊。幸亏找到了一个好的针对wordpress源码的阐释网站(Xref可以译为交叉参考吗?),对所有函数都有交代,很不错,但是在自己本机实验的时候发现那个类似get_bloginfo之类的基础函数都无法起效。Google来Google去就找到了不少插件开发的相关文章。模拟wordpress默认提供的HellyDolly源码,自己试着写了几句代码进行测试,终于成功。几个关键点如下:

  1. 测试时通过http://localhost/wp-content/plugins/bai.php这样的方法是无法对wordpress支持函数测试的,因为直接调用完全没有进入wordpress的作用域和系统,当然无法识别get_bloginfo之类的函数了;
  2. 进入其作用域的方法要么是写一堆inclue,要么就是用wordpress方便第三方开发提供的接口:插件和模板;
  3. 插件开发中必须把action注册到特定的功能域才行。具体方法是写了一个function后使用add_action,后者的参数列表见Action List。还有一个方法是add_filter。
  4. $wpdb是一个global函数,可以在整个wordpress域中执行SQL语句进行查询。$wpdb->query('query');返回整数或false,说明此查询对多少条记录产生了作用。$name = $wpdb->get_var("SELECT cat_name FROM $wpdb->categories WHERE cat_ID=4");则返回一个变量,例句中反馈id为4的分类名称。

twitter on 2008-04-23

Wednesday, April 23rd, 2008
  • 晚了,收工睡觉。 #
  • wordpress插件开发构思一:自动为帖子添加形如scribe那样对technorati搜索链接的支持,自然只能针对那些有tag 的咯。 #
  • wordpress插件开发构思二:以statpress为原型,对访问统计插件进行优化升级:丰富统计分析和展示功能。 #

Powered by Twitter Tools.

PHP、MYSQL和WordPress编程散记

Monday, April 21st, 2008

为了解决StatPress存在的中文乱码问题并清除无效spider信息,me下功夫K了不少php、mysql以及WordPress的编程信息。怕下次再重新学习一道,记录一下知识点,聊以备忘。

一、PHP

  1. 连接字符串使用.,比如$nome."|".urldecode($tab[1])。
  2. 调用变量用$,函数则直接调用。
  3. 字符串处理的一些常用函数。strpos寻找字符串中某字符最先出现处,strrpos寻找字符串中某字符最后出现处,这两个函数都反馈整数值,如果没有找到则返回false;strrchar则返回字符最后出现处至结尾的子字符串,strstr则返回搜索字符串最后出现处至末尾的子字符串;substr取部分字符串,string substr(string string, int start, int [length]);start和length如果是负数则从末尾算起;ereg用正则表达式对字符串进行比较或返回拆分后的数组,eregi同ereg,只是大小写无关,ereg_replace和eregi_replace按照一定的规则进行替换;str_replace替换特定的子字符串,str_replace("%body%", "black", "<body text=%body%>");
  4. 处理url的函数有urlencode和urldecode,前者把"为什么"转为%CE%AA%CA%B2%C3%B4,后者再把它转回来。编码是为了适应浏览器对url的处理规则, 对字符串多解码一次也没什么影响,还是原样。还有个函数是parse_url,返回数组,可以通过component调用处理结果,支持的component有scheme、host、port、user、pass、query、fragment。
  5. iconv可以把字符串在不同的字符集间进行转换,比如iconv("gb2312","utf-8",$str)。
  6. gb2312的字符encode后占两位,也就是有两个%,而utf-8则是三位,每个字有三个%,示例:为什么如何使utf-8则encode后为%E4%B8%BA%E4%BB%80%E4%B9%88,共9位,如果是gb2312则为%CE%AA%CA%B2%C3%B4,只有6位。
  7. if中的条件判断语句不能用=而是==,否则就直接赋值了,比如$nome == "Baidu"。
  8. explode函数把由特定间隔符分割的字符串拆解成数组,比如$str = "wd=home",$array = explode("=",$str)后得到array,其中array[0]=wd,array[1]=home。
  9. count则统计数组中元素的个数,count($array)的话就是2。
  10. 调试函数在,怎么忽然就该页为空了(在浏览器中啥都不显示),试了几次都不行。想想刚才都做了什么,也就是更改了页面的charset,从gb2312到utf-8,另外就是增加了两行代码。把代码删除,问题依旧;把charset改回去,还是不行。于是就怀疑是不是服务器不稳定,坏了。重新启动,问题居然依旧。这时候才想到去查服务器的log。一看不打紧,全是500,呵呵,标准的服务器内部错误,并且提示PHP Parse error: syntax error, unexpected T_STRING 在某个文件中云云。Google了下,还是没啥概念。在搜索结果中转来转去,忽然有点感觉了,还是代码出了问题,php无法解析导致的。再次检查,晕,还真是,后面加的两行代码导致的。调用函数居然没有用括号括住参数,具体如此println iconv("gb2312","utf-8",$stem);呵呵晕死。加上应该的括号后变成了这样println(iconv("gb2312","utf-8",$stem));搞定!
  11. date是用来输出时间日期为特定形式的函数,具体的时间日期值通过mktime获得。date_default_timezone_set('Asia/Shanghai');居然只支持Shanghai、Chongqing等,但没有北京。$startday = mktime(0,0,0,2,30,2008);居然也有效,不过生成的日期是2008年3月1日,自动处理了。(strtotime("now")-$startday)/86400;获得从某特定日期到现在的所过天数。


二、MYSQL
(一)不知道PHP的函数是否可以直接用在SQL语句中,只好把要处理的记录全查出来后根据id一条条进行处理,示例代码如下:
$qry = $wpdb->get_results("SELECT id, urlrequested FROM $table_name WHERE (urlrequested is not null) and (urlrequested != '')");
print "...".count($qry)." select-ed; ";
foreach ($qry as $rk) {
$tmpstr = urldecode($rk->urlrequested);
$q="UPDATE $table_name SET urlrequested = '$tmpstr' WHERE id=".$rk->id;
$wpdb->query($q);
}
print "".__('done','statpress')."
>";
me非常担心这样的语句如果不能按照本意进行,会毁掉所有记录的那一栏数据:
update $table_name set urlrequested = urldecode(urlrequested);
(二)在本地安装的php、mysql和wordpress组合中导入网站导出的数据(为后缀名为sql的文本文件),命令语句:

mysql -uroot dataname < dataname_wp_20080427_287.sql

(三)创建数据库并授权以及添加用户。

用root登陆后 create database db_name;

grant all on db_name.* to db_user@host identified by 'password';

(四)update语句影响的set数目。为了使statpress在update时能精确显示信息,me增加了setcount参数进行统计,点击statpressUpdate时结果如下:

Updating OSes: 2006 sets are set to blank. 2006 sets are updated. done
Updating Browsers: 2009 sets are set to blank. 2009 sets are updated. done
Updating Spiders: 0 sets are set to blank. 0 sets are updated. done
Updating Feeds: 0 sets is set to blank. All is done.
Updating Search engines: 458 sets is set to blank!
2284 are select-ed, 458 are updated!

可以看出,在每个项目中被置空的数据记录居然数量不一样(OS中是2006个,Browser中则是2009个)。按道理像这样的语句 UPDATE $table_name SET spider = ''; 应该是更新数据库中的所有记录数才对啊。Google了半天,总算搞清楚了原因。那就是MYSQL在更新数据时如果该数据和将被更新的数据一致的话则不会发生作用,这样的话上面语句仅仅更新了那些不是''的记录。仔细想想,这种处理确实有理,可以提高sql语句运行效率,在数据库很大的时候当然会显得非常有必要。

(五)清除某些插件的残留物。插件启用后有些时候感觉不好用,总是要放弃的,但有些不友好的会留下一些东西,像创建的数据库啊以及在options中的记录等。用下面语句清除:feed_statistics、wp-poll、tantan的ga。

$str = '';
foreach($wpdb->get_col("show tables like '%wp_feed_%'") as $db_name){
$str .= $db_name."|";
$wpdb->query("drop table $db_name");
}
$str .= $wpdb->query("delete from wp_options where option_name like '%poll_%'")."|";
$str .= $wpdb->query("delete from wp_options where option_name like '%feed_statistics_%'")."|";
$str .= $wpdb->query("delete from wp_options where option_name like '%tantan_ga%'")."|";

三、WordPress
(一)、查看StatPress统计的记录,居然有这样访问的:
/2006/05/23/javascript:void($('akst_form').style.display='none');
是不是有人想黑me啊。

又发现了怪怪的urlrequest,这次是¤§??? and 1=1,me把它敲入地址栏后就转换成了 http://52good.skylast.com/%A1%E8%A1%EC???%20and%201=1,页面结果是Error 404,Not Found。

(二)、rss类的url跟随wordpress的permalink设置情况变化:如果是默认的?p=123则get_bloginfo('rss2_url')得到形如http://host/?feed=rss2;如果permalink设置为/%year%/%month%/,则get_bloginfo('rss2_url')得到形如http://host/feed/rss2。statpress对这种情况没有做特殊处理。此种关联也提醒我们不要随便改变wordpress的permalink,因为会影响很多事情。

(三)、在wordpress中所有插件中的函数可以互相调用,并且还可以用在模板中。强,不过,避免函数名称冲突就显得非常非常重要了。

StatPress深度使用

Saturday, April 19th, 2008

WordPress博客系统的强项在于扩展应用多多,当然是通过插件实现的。想给“天高云淡”添加一个访问统计方面的插件,发现最流行的是WordPress.com Stats,可惜它好像只对一级域名有效,只好放弃。仔细查阅了WordPress的插件列表,统计类好像分为另类:引用第三方统计服务的,比如把把Google Analytics和Feedburner统计结果拿过来在管理后台显示的Google Analytics and Feedburner Reports plugin for WordPress;还有直接在服务器上统计数据并分析的,比如刚提到的WordPress.com Stats和本文重点研究的StatPress

安装了StatPress后觉得还不错,功能简单实用,统计结果显示也很直观。这几天每天上去看看统计结果,总算对访问情况有了基本的了解(原来一直用Google Analytics,说实话,很复杂;并且不是给blog系统定制的,不直观),但有两个小问题一直让me觉得美中不足:

  1. 在Last Referrers页面中有不少百度的链接,而Google的是直接出现在Last Search Terms页面中,看来是StatPress不能正确识别我们中文用户常用的搜索引擎——百度;
  2. 安装默认是Do not collect spiders visits,但用了两天me觉得那个那个spider对统计分析没啥意义,就在Options中把它取消了。这下好,它是老老实实的不统计spider信息了,但Overview中那个柱形比例图就很难看了:刚安装那两天因为统计了spider,柱子高高的,后来取消后的日期柱子就很矮(唉,主要还是怪浏览量有限,spider的访问居然超过了用户),中间各分类(Visitors、PageViews、Spiders、Feeds)的情况根本看不清楚。

问题虽然不大,但天天面对也挺烦的,更何况me对细节有那么在意,还是想想办法搞定它吧。

把StatPress的插件压缩包打开,里面有两个目录:def和locale。在def下共有四个数据文件,分别是banips.dat、browser.dat、os.dat、searchengines.dat。用EmEditor打开这些dat文件,发现都是基本的文本,中间定义了各种规则。其中searchengines.dat的文本片断如下:

Alice|search.alice.it|qs|
Google|www.google.|q|
Google Groups|groups.google.|q|
Google Images|images.google.|q|
Yahoo|search.yahoo.com|p|
Virgilio|search.virgilio.it|qs|
Arianna|arianna.libero.it|query|
Altavista|.altavista.com|q|

规则很简单,每行定义一个规则,分为三个部分:搜索引擎名称、域名、搜索词标识。me把所有的访问记录通过Export功能导出为csv格式,用Excel打开,通过Excel的分列功能做成数据表,筛选出referrers,发现有百度、yahoo和Google的blogsearch不能被识别。在searchengines.dat添加如下规则:

Google Blog|blogsearch.google.|q|
Yahoo|search.yahoo.com|p|
Yahoo cn|www.yahoo.cn|p|
Baidu|www.baidu.com|bs|
Baidu|www.baidu.com|word|
Baidu|www.baidu.com|wd|

上传至服务器。进入StatPress界面点StatPressUpgrade按钮,OK。再返回统计页面,呵呵,很好,StatPress已经能正确识别百度等中文用户常用的搜索引擎了,第一个问题算是基本解决。但可惜搜索的关键词中的中文好像不能被正确识别,都显示为问号(?),留待下步探究。

第二个问题的解决思路其实很简单,就是把已经统计的spider信息删除就行了,但因为原来从来没有在服务器上操作过php和mysql,虽然心里有底,还是要充分准备的,搞不好把博客系统破坏了就麻烦大了。

打开statpress.php文件,有九百多行代码。大约浏览了下,它创建了一个statpress数据表来记录访问信息,然后就是各种功能板块的实现代码。仔细查阅后,me决定在iriStatPressExport函数中加入代码删除包含有spider的数据记录。代码如下:

 
        print "Detele the Spider, start:";
	$qry = $wpdb->query("DELETE FROM $table_name WHERE spider != ''");
	if($qry == 0){
		print "Detele the Spider, DONE.";
	}
	else if($qry === FALSE){
		print "Error occurred when deleting the record with spider content.";
	}else{
		print "".$qry." records with spider content is deleted.";
	}
 

上传至服务器,执行了一次导出数据(Export),打开生成的csv文件,末尾处显示Detele the Spider, start;752 records with spider content is deleted.呵呵,总共删除了752条记录,成功。再次登陆统计界面,柱子已经很均匀了,也很直观。这第二个问题也基本搞定

美中不足的是me发现feeds数据好像少了些。打开第一次到处的csv数据,发现居然还有部分记录是在spider和rss中都有数据,统计了下共有五十条记录,晕,看来me误杀了这部分记录,想恢复是不可能的了,只好作为经验教训了:下次对数据库操作时一定要彻底弄清楚数据库的结构

天空中的Vista

Monday, April 14th, 2008

即使关上这道门,也不见得打得开那扇窗,何况门还暂时关不上呢!——题记

微软为Vista发布的户外广告,杭州,2007年4月7日。

刚看苹果的GET A MAC系列广告,损Windows抬MAC很直接,创意很不错,不过制作成本应该很低,因为没有背景没有道具,就是两个男人(偶或加几个美女几个丑男来衬托)在对话,哦,准确讲,应该是在对比。广告应该是经过了精心策划的,攻击Windows的缺点很到位,比如不稳定老是重启啊、不安全招病毒啊、华而不实啊什么的,这还不说,选的人也很有意思,代表Windows的那位仁兄胖胖的,呆呆的,一副倒霉像,代表MAC的那位帅哥就清新自然潇洒多了,是很多人(包括me)希望的样子或状态,呵呵,广告效果不言自明。

随后又看APPLE IPHONE的系列广告,突然想起来前几天看到的一篇报道,乔布斯深谙掌控之道,如果不是设计、硬件和软件的完美结合,是拿不出像IPOD和IPHONE这样的精品的。不由的开始替微软叹息,巴尔默他们还在操作系统这一条道上准备走到黑呢,并且好像也只能走到黑!

基于个人电脑还是基于互联网,这是个战略命题。Google天生就是后者,没有互联网哪里会需要搜索呢,哪里会有这么多信息给Google整理呢!可微软即使已经认识到了,但基因原因还是难得转过来。当年拿免费的IE打倒网景固然豪迈强大,其实它在意的还是自己的操作系统。这不,无数次跳票后发布的天价Vista慢慢腾腾的来了,恶评如潮,用户观望了再观望,好像没什么升级的欲望。即使微软的营销组合拳打的再好,也抗衡不了大家已经转移的视线和阵地。Yahoo能和Vista兼容吗?盖茨先生!


关闭
E-mail It