python sys.setdefaultencoding的一点小魔法

python中调用sys.setdefaultencoding方法可以修改默认编码。

但是这个方法调用有一些特别。在python解释器中执行:

>>> import sys
>>> dir(sys)

输出为:

['__displayhook__', '__doc__', '__egginsert', '__excepthook__', '__name__', '__p
ackage__', '__plen', '__stderr__', '__stdin__', '__stdout__', '_clear_type_cache
', '_current_frames', '_getframe', '_mercurial', 'api_version', 'argv', 'builtin
_module_names', 'byteorder', 'call_tracing', 'callstats', 'copyright', 'displayh
ook', 'dllhandle', 'dont_write_bytecode', 'exc_clear', 'exc_info', 'exc_type', '
excepthook', 'exec_prefix', 'executable', 'exit', 'flags', 'float_info', 'float_
repr_style', 'getcheckinterval', 'getdefaultencoding', 'getfilesystemencoding',
'getprofile', 'getrecursionlimit', 'getrefcount', 'getsizeof', 'gettrace', 'getw
indowsversion', 'hexversion', 'long_info', 'maxint', 'maxsize', 'maxunicode', 'm
eta_path', 'modules', 'path', 'path_hooks', 'path_importer_cache', 'platform', '
prefix', 'ps1', 'ps2', 'py3kwarning', 'setcheckinterval', 'setprofile', 'setrecu
rsionlimit', 'settrace', 'stderr', 'stdin', 'stdout', 'subversion', 'version', '
version_info', 'warnoptions', 'winver']

会看到实际上sys模块中并没有这个所谓的setdefaultencoding方法。

文档中描述为:这个方法是为site模块的调用而准备的,而一旦被调用之后,它将会被从sys的名称空间中抹掉。

This function is only intended to be used by the site module 
implementation and, where needed, by sitecustomize. Once used 
by the site module, it is removed from the sys module’s namespace.

而如果确实有需要调用这个方法,可以使用reload再次导入这个模块:

import sys  

print 'old encoding value:', sys.getdefaultencoding()
reload(sys)
sys.setdefaultencoding('utf8')
print 'new encoding value:', sys.getdefaultencoding()

输出为:

old encoding value: ascii
new encoding value: utf8

VPS迁移后重建MySQL ISAM全文索引

前文我简单总计了web应用的迁移过程,这里补充说明一下数据库迁移后的全文索引重建问题。

数据库导入到MySQL之后,如果有ISAM fulltext表,需要重建索引。

cd /var/lib/mysql/music

找到对应数据表的索引文件,这里music是我的数据库名称(db_name)。

对于较小的表,直接执行:

myisamchk –recover –ft_min_word_len=2 –ft_max_word_len=20 bt.MYI

为了让用户能搜索到较短的人名,比如“许巍”,我把单词的最短长度设定为2。

对于超大的表,直接执行上述命令就不行了,会得到一个错误提示:

myisamchk error: myisam_sort_buffer_size is too small

这时需要为myisamchk命令添加–force和–safe-recover两个参数。 比如,这里我为一个百万记录的表重建索引,则执行:

myisamchk –recover –force –safe-recover –ft_min_word_len=2 –ft_max_word_len=20 albums_fulltext.MYI

把自己的两个网站迁移部署到Linode VPS

手上买了3个VPS ,一个用来放网站,另外两个用来跑自己的程序(不是用于扫肉鸡之类… )。

最近yardVPS和photonVPS的廉价VPS抽风得厉害。 晚上9点到11点这个高峰期,慢得离奇。

无奈,买了新的Linode VPS。 日本机房,延迟小,内存和硬盘更大,一个月大约是24美元。

迁移网站到一个新服务器上,需要完成的几个步骤是:

1. 基本的环境配置

首先需要进行最基本的安全配置,比如进行必要的更新,修改ssh端口号,禁止root远程登录ssh。

接着可以安装apache2、php5、MySQL,因为我的网站http://www.fachun.net 使用了django框架,还需要安装django、以及它所要用到python-mysqldb、localurl等。

2. 转移web目录下的文件

假设你的web文件位于/var/www下,可以整体打包它,切换到/var/,执行类似:

tar czvf www.tar.gz www/*

等打包结束,再将这个www.tar.gz移动到某个站点目录下,比如放到博客https://www.lijiejie.com/www.tar.gz,然后在新的vps上下载它:

wget https://www.lijiejie.com/www.tar.gz

下载后解压即可。

3. 打包apache2和MySQL配置文件

操作与上面类似,把/etc/apache2/和/etc/mysql下面的文件打包并下载到新的VPS上,完成解压和覆盖。

4. 导出MySQL数据库

直接把数据库导出到站点web目录下:

mysqldump -uroot -p db_name > /var/www/web_folder/db_name.sql

在新的VPS上下载并导入这些数据。

5. 修改本地hosts,测试站点是否正常工作

在新的VPS上逐个启用站点:

a2ensite your_site_name

service apache2 reload

这个时候,虚拟主机已经生效了,但我们不要忙修改DNS,先修改本地hosts文件,把域名解析到这个新的VPS,查看站点能否正常工作。如果有问题,可以调试解决。

确认没有问题,就可以去修改DNS,把域名解析到这个新VPS的IP。

因为DNS生效需要一定的时间,这时候先不要忙暂停旧VPS上的网站。

名为[WIFI共享精灵]或[WIFI宝]的程序恶意去UAC保护机制

这两天突然发现系统的UAC保护机制被去除了,所有程序默认以管理员身份运行。比如打开cmd,直接就是system权限,没有安全桌面提示。

cmd-privilege

打开控制面板中的用户账户控制,看到变成了”从不通知”:

UAC-notify

我怀疑系统中毒,开始排查。因为木马一般会以服务的形式启动,所以直接查看有没有可疑的系统服务。

win + r,输入services.msc,查看已启用的服务。 发现了一个比较可疑的服务,名为ConnectifyDHCPSER 继续阅读名为[WIFI共享精灵]或[WIFI宝]的程序恶意去UAC保护机制

通过邮件发送图片获取某人IP地址的简单方法

有一个十分常见的渗透测试场景:  那就是我们需要获取某人的IP地址。 比如系统管理员所在的白名单IP。

比较繁琐的实现方法,可以通过入侵对方常访问的网站,然后下载web server日志和数据库log表分析。
这里介绍一种非常简单的方法:通过Email发送图片获取对方IP。具体的做法是:

在Email正文中嵌入特定的网络图片(该图片放在自己的http服务器上)发送给特定用户,对方浏览该图片后,

apache记录日志,我们通过查看日志,就可以获取对方的IP地址,甚至包括Referer、User-Agent标识。

作为示例,我注册了一个新的sina邮箱:[email protected],发件人姓名填写为张蓉。
在网上随便搜了个[email protected]百度员工的邮箱,关键词 intext:”@baidu.com”
这里之所以用女性的名字,是为了降低对方的防范心理。
随后,在网上找了一张漂亮女生的合照,给对方发Email。这封测试邮件,我同时也发给了阿里巴巴的一个哥们儿。邮件内容是:

标题: 上次聚餐可慧的照片

正文: 这是上次聚餐时给可慧和阿姨拍的照片,今天才传给你。
原图我也没有了。 一切顺利哈  🙂
{{插入图片 http://23.228.xxx.xxx/c4ca4238a0b923820dcc509a6f75849b.jpg?cache=4}}

23.228.xxx.xxx是我自己的服务器IP。

图片命名我直接用md5(1),是为了让对方产生第一感,仿佛这是社交网站自动生成的文件名。当然,对方直接看到的是一张图,而不是地址。
参数cache=4,则完全是为了区分不同的收件人,也可以很方便地在日志搜索记录。当然,还可以改成其他参数伪装成时间戳。
邮件发出去大约二十分钟,百度和阿里巴巴的哥们儿就都中招了。

apache-log

cache=c,IP为222.129.43.x的是百度的这位哥们儿,而后一个IP 42.120.74.x则来自阿里巴巴。
可以看到百度的同学使用了iPhone手机客户端,对应的IP地址,可能会是百度VPN的出口IP。
而阿里的同学则是64位系统, Chrome浏览器。

这里主要利用了邮件客户端会自动请求Email正文中嵌入的网络图片,而不会提示用户。