按 ‘ 软件 ’ 标签归档

和注册机器人的战斗

帮朋友代管一个问答站点。这个站点常常被发垃圾广告的盯上,而且使用注册发帖机器人,潮水般地往上冲。最近一次大规模攻击出现在10月15日晚上到16日早晨,总共产生了43000多条垃圾。

因为只是代管,所以我并不能接触到后台代码和数据库,只能使用网页管理界面来清理垃圾。而这些网页界面又有点残疾,例如,删除垃圾问题时,虽然提供了多选勾框,却只能删除顶头一个。

汇总一下,手边能用的抵抗工具有:

  • 关闭新用户注册。
  • 删除垃圾用户的网页界面(每次只给删20个)。
  • 删除垃圾问题的网页界面(每次只给删1个)。

好在我还是个程序员,虽然并不穿格子装。当天下午,我用JavaScript写了个网页,把垃圾用户/问题的编号范围输入之后,点一下“清理用户”,它就会循环往复地按照原站点期望的格式生成form,并提交删除。按照每秒清理10个用户的速度,很快就干干净净了。

这个清理工具有点小花样:提交删除表格时,会在新窗口打开(否则退不回来,就没法循环执行),打开的新窗又要在5秒钟后关闭(否则任务一多,浏览器的窗口就密密麻麻了)。这样,浏览器不停地弹出新窗又关掉,忙得不亦乐乎的样子,煞是好看。

写好这个清理工具之后,把它往自己的网站上一丢,就可以放心地出去玩了。即使问答站点再遭攻击,我也可以从手机上远程清理了。执行清理代码的权限依赖于事先在问答站点上成功登录,所以也不担心链接泄露被网络爬虫乱点按钮。

接下来我又想:事后发现并清理,终究显得有点被动。当我忙着做图写东西时,还得随时盯着站点,就太分心了。JavaScript在读取外域网页时功能有限,所以我用PHP写了个新版本,能代刷网页,发现出事时,能自己清理。不过,本质上,这个工具就和注册机器人一样了,这大概就是传说中的“终于活成了自己讨厌的人的样子”。

自动防御工事的逻辑是:

  • 每隔一段时间,读取主页上的注册用户数目。
  • 如果突然出现不合常理的激增,则判定为注册机器人攻击。
  • 判定攻击后,首先关闭新用户注册功能,掐断垃圾源头。
  • 接下来,向站点提交表格,删除在此期间出现的所有新用户。
  • 静候半小时后,重新开放注册功能,但半分钟后回来检视一下,看看攻击是不是还在继续。
  • 如果攻击还在继续,再次关闭新用户注册,清理这半分钟产生的小垃圾,如此循环往复。

刚刚写好新工具,一个小机器人就吹着喇叭发动了祭旗式的攻击(上图的UNDER ATTACK指的就是它),攻击从当天傍晚6点持续到次日凌晨零点。刚才说过,每次检测出批量攻击时,程序会先关闭用户注册半小时,然后打开,半分钟后再杀回来重新看一眼。对面这个小机器人在这每次间隔半小时的半分钟缝隙里,急急忙忙地创建垃圾用户,几个小时过去,它用掉了将近一百个帐户编号,也算是相当执着了。

今天早晨出了个巧之又巧的小意外。在网页刚刚启动,进行30秒热身刷新时,放在本站的服务器突然跳表,时间戳从23:01:32跳回23:00:20,呛死了我的防御工事。

它的判断逻辑是“假如新注册的用户数乘以某比率,大于刚才流逝的秒数,则判断是注册机器人攻击。”而这里,虽然新注册用户为零,但“刚才流逝的秒数”是个负值……万幸的是,我从做JavaScript版时,就设了个保险杠,此杠以内的老用户无论如何不能碰。所以虽然代码走进了“删除某些用户”的那一块,却立刻被驳回了。

感谢这个服务器提供的意外test case,这部分代码已加固,不会再被弄死了。

后记:晚上在本站服务器上把玩这个程序时,跳表现象又出现了。不禁大感兴趣,细细研究一下这个现象的来源。它发作得如此频繁,使我无法相信有个系统管理员坐在那里没事调时钟。更像是有多台负载均衡服务器,它们的时钟不一致。

写了个小网页,每5秒输出一次系统时间,在完美世界里,应该获得一条单调上升的直线。然而我实际得到的,是剧烈颠簸的数据。使用Excel画出来就更加一目了然,共有三条直线,说明至少有三台负载均衡,其中两台差异不那么大,而第三台慢了许多。如果拿中间一条线做参照的话,最上面的时钟快了23秒,最下面的则慢了108秒。

天文软件的最稳定参照系

如果要写一个天文软件,那么,两万年内最稳定的参照系是黄道面。黄道星座从古到今都是那些,而指极星却在不停地偷换。

指极星的改变是地轴进动的结果,并带来所有恒星赤经赤纬的变化。赤纬变化的原因很明显——指极星都变了。赤经变化是因为地轴进动带来的春分点(黄道和赤道的交点之一)的进动。

地球的公转轨道只有一个开普勒元素是在明显改变的,就是近日点幅角。而轨道倾角、升交点黄经、离心率和半长轴都基本不变。

Stellarium

推荐一款开源天文软件Stellarium

关于中文界面:按F2,而后选择Language为“中文”,此时菜单会变为中文, 但是天体和方位如太阳、行星、月球,及地平线上的东西南北四字或许会显示为方框框。 解决方法:从机器的控制面板中打开“字体”,选择Simsun或Simhei、 或任意已知的中文字体(例如我用的是微软雅黑),拖到 C:\Program Files\Stellarium\data文件夹下, 改名为ukai.ttf,重启Stellarium即可。

如果你对程序启动时的状态显示依然是方框框感到不满, 解决办法是使用文本编辑器如Notepad(写字板)打开上述文件夹下的fontmap.dat, 把default那一行的DejaVuSans.ttf和DejaVuSansMono.ttf都改为ukai.ttf,保存文件, 重启Stellarium。

介绍一个看星图的天文软件

Sky Calendar显示的星空图

Sky Calendar显示的星空图

介绍一个看星图的天文软件。有个叫Stig’s Sky Calendar的软件,发布在www.skycalendar.com上,现在这个站点的主页是在线Java版, 离线版本在www.skycalendar.com/download,不需要上网就能看星图。除了星图之外,它还可以显示日月行星的升降时间,各大行星的视直径、视星等、位相和自转位置, 报告即将发生的天象,如金星合月、火星等。

下载Stig’s Sky Calendar  文件共6,308,673字节,请耐心下载。

由于世界的不同地方看到的天空是不一样的,所以安装后需要设置自己所在的城市。这个软件里预设的城市很少,尤其没有中国大陆的地名。 这个问题的解决方法是(以北京为例):

在Windows里打开“安装目录\skycalendar\location.txt”,在里面加入一行:

39.92 -116.38 -8 China: Beijing

这里39.92代表北纬39.92°,-116.38代表东经116.38°,-8代表东八区。 我也不知道为什么这个软件用负数代表东(大多数软件提到东八区都会表示成GMT+8:00),反正知道就行了。

中国其它城市的经纬度数据:

上海 31.07 -121.43 -8 China: Shanghai 天津 39.14 -117.20 -8 China: Tianjin
重庆 29.55 -106.54 -8 China: Chongqing 哈尔滨 45.76 -126.65 -8 China: Haerbin
长春 43.89 -125.32 -8 China: Changchun 沈阳 41.80 -123.42 -8 China: Shenyang
大连 38.91 -121.63 -8 China: Dalian 呼和浩特 40.81 -111.68 -8 China: Huhehaote
满洲里 49.58 -117.45 -8 China: Manzhouli 锡林浩特 43.94 -116.09 -8 China: Xilinhaote
通辽 43.60 -122.26 -8 China: Tongliao 赤峰 42.27 -118.97 -8 China: Chifeng
包头 40.66 -109.84 -8 China: Baotou 石家庄 38.03 -114.51 -8 China: Shijiazhuang
承德 40.96 -117.94 -8 China: Chengde 邯郸 36.60 -114.51 -8 China: Handan
太原 37.89 -112.53 -8 China: Taiyuan 大同 40.08 -113.30 -8 China: Datong
济南 36.37 -117.00 -8 China: Jinan 青岛 36.20 -120.40 -8 China: Qingdao
烟台 37.55 -121.35 -8 China: Yantai 郑州 34.76 -113.68 -8 China: Zhengzhou
安阳 36.10 -114.34 -8 China: Anyang 洛阳 34.64 -112.50 -8 China: Luoyang
徐州 34.27 -117.18 -8 China: Xuzhou 连云港 34.60 -119.19 -8 China: Lianyungang
南京 32.07 -118.80 -8 China: Nanjing 苏州 31.30 -120.61 -8 China: Suzhou
合肥 31.86 -117.28 -8 China: Hefei 蚌埠 32.93 -117.36 -8 China: Bengbu
铜陵 30.92 -117.81 -8 China: Tongling 武汉 30.56 -114.29 -8 China: Wuhan
襄樊 30.56 -112.17 -8 China: Xiangfan 宜昌 30.73 -111.32 -8 China: Yichang
恩施 30.26 -109.49 -8 China: Enshi 南昌 28.64 -115.94 -8 China: Nanchang
赣州 25.85 -114.94 -8 China: Ganzhou 上饶 28.44 -117.96 -8 China: Shangrao
杭州 30.29 -120.18 -8 China: Hangzhou 宁波 29.86 -121.57 -8 China: Ningbo
温州 28.00 -120.68 -8 China: Wenzhou 长沙 28.19 -113.01 -8 China: Changsha
岳阳 29.37 -113.13 -8 China: Yueyang 衡阳 26.89 -112.60 -8 China: Hengyang
郴洲 25.79 -113.04 -8 China: Chenzhou 福州 26.07 -119.32 -8 China: Fuzhou
武夷山 27.75 -118.04 -8 China: Wuyishan 厦门 24.57 -118.04 -8 China: Xiamen
广州 23.12 -113.26 -8 China: Guangzhou 香港 22.37 -114.20 -8 China: Hongkong
汕头 23.38 -116.75 -8 China: Shantou 湛江 21.25 -110.37 -8 China: Zhanjiang
澳门 22.08 -113.54 -8 China: Macao 海口 20.03 -110.36 -8 China: Haikou
三亚 18.26 -109.51 -8 China: Sanya 南宁 22.80 -108.31 -8 China: Nanning
桂林 25.26 -110.31 -8 China: Guilin 北海 21.44 -109.14 -8 China: Beihai
贵阳 26.57 -106.72 -8 China: Guiyang 遵义 27.68 -106.94 -8 China: Zunyi
昆明 25.04 -102.71 -8 China: Kunming 大理 25.59 -100.23 -8 China: Dali
成都 30.66 -104.07 -8 China: Chengdu 攀枝花 26.56 -101.70 -8 China: Panzhihua
广元 26.56 -101.71 -8 China: Guangyuan 泸州 28.88 -105.45 -8 China: Luzhou
康定 30.05 -101.96 -8 China: Kangding 甘孜 31.63 -99.99 -8 China: Ganzi
西安 34.27 -108.95 -8 China: Xian 汉中 33.06 -107.04 -8 China: Hanzhong
宝鸡 34.36 -107.15 -8 China: Baoji 榆林 38.29 -109.76 -8 China: Yulin
银川 38.46 -106.29 -8 China: Yinchuan 兰州 36.05 -103.80 -8 China: Lanzhou
天水 34.57 -105.73 -8 China: Tianshui 酒泉 39.74 -98.51 -8 China: Jiuquan
西宁 36.62 -101.81 -8 China: Xining 格尔木 36.40 -94.87 -8 China: Geermu
乌鲁木齐 43.83 -87.55 -8 China: Urumqi 哈密 42.81 -93.52 -8 China: Hami
库尔勒 41.76 -86.15 -8 China: Kuerle 吐鲁番 42.94 -89.17 -8 China: Tulufan
克拉玛依 45.59 -84.87 -8 China: Kelamayi 伊宁 43.90 -81.33 -8 China: Yining
拉萨 29.66 -91.12 -8 China: Lhasa 日喀则 29.27 -88.87 -8 China: Rikaze
八一 29.67 -94.36 -8 China: Bayi 昌都 31.14 -97.18 -8 China: Changdu
台北 25.03 -121.52 -8 China: Taipei 高雄 22.63 -120.30 -8 China: Kaohsiung