How do I deploy my website on NDN?

As a website owner, I'm always thinking about making my website available on more channels, so I enabled IPv6 several years ago. NDN comes to my eye as a new "content distribute model" and "communicate protocol". It's natural for me to think about: how do I deploy my website on NDN?

Like most small websites, my website runs mainly on HTTP. Visitors issue GET requests to retrieve pages and resources, which is essentially static but may change at any time. They issue POST requests to interact with web applications, or play with JavaScript-based web applications. I used to provide file downloading through FTP or BitTorrent (but it's now on SkyDrive). I'm collecting statistics with Google Analysis, and an accurate report is important to me. To sum up, I have 5 scenarios:

  1. retrieve pages and resources;
  2. server-based web applications;
  3. JavaScript-based web application;
  4. file downloading;
  5. analysis.

File downloading is the easiest one on NDN. Once a file is published, I would not modify it without using a new name. So, publishing files under a NDN prefix is sufficient. By adding a segmentation component in data names, visitors can download a piece of a file, which is similar to BitTorrent.

Retrieving pages and resources is similar to file downloading, except that pages may change at any time. I don't know when a page will change, so I cannot specify an expiry time when the page was served. In HTTP, user agents can include a If-Modified-Since header, and server would respond with 304 status code if page is not modified without sending the content. In NDN, I can add a version component in data names, so user agents can INTEREST locally-cached version number with RightmostRightSibling annotation.

纯真IP数据库批量查询

纯真IP数据库(qqwry.dat)批量查询PHP脚本,qqwry.lib.php。此脚本适合一次性查询大量IP地址的归属地,比如在几万行的网站日志文件中添加IP归属地。

下载纯真IP数据库批量查询PHP脚本

使用前请获取纯真IP数据库存储qqwry.dat于同一目录。

接口使用示例

require 'qqwry.lib.php';
$qqwry=new QQWRY;
$ip_arr=array();
$ip_arr[]=ip2long('8.8.8.8');
$ip_arr[]=ip2long('10.0.0.1');
$results=$qqwry->query($ip_arr);
foreach ($results as $ip=>$record) {
    echo long2ip($ip).' '.$record->get_c().' '.$record->get_a()."\n";
}

10分钟为网站添加聊天室功能

2016-01-05更新:Windows Live Messenger Connect已于2013年关闭,本技巧已经失效。

如果你正在运营一家新闻/小说/视频类网站,每时每刻都有大量用户访问同一个页面,那么你可以在网页上添加一个“聊天室”,让同时访问同一网页的用户互相交流。

根据本文介绍的方法,你可以在10分钟为网站添加聊天室功能,而且不占用任何服务器资源。

第一步:应用注册(3分钟)

本文介绍的“聊天室”功能由Windows Live Messenger Connect提供,需要使用一个Windows Live ID来管理。如果你的网站不是个人网站,建议你新注册一个Windows Live ID作为开发者帐号,以便在必要时与其他网站管理者共同使用该帐号。注意密码必须足够复杂,否则是无法作为开发者帐号使用的。

在服务器上用Fiddler抓取HTTPS流量

开发互联网应用的过程中,常常会设立或利用网络接口。为了调试对网络接口的使用,往往需要查看流入和流出网络接口的网络流量或数据包。“抓包工具”就是一类用于记录通过网络接口的数据的工具。

我们知道,网络协议是分层设计的,OSI模型将网络协议分为了7个层次。不同的抓包工具,可以在网络协议的不同层次上工作。常用的Wireshark就是一种在网络层上工作的抓包工具,不仅自带大量的协议分析器,而且可以通过编写Wireshark插件来识别自定义的协议。虽然Wireshark功能强大,但是却并不能解决所有的抓包问题,其原因在于:

  • Wireshark工作在网络层;如果计算机配置了IPSec传输层加密,则在网络层的流量都已经被加密,什么也看不到。
  • 当今大量网络接口使用HTTPS加密,Wireshark不能抓取到HTTPS流量的明文内容。

那么,如何抓取到HTTPS请求的明文内容呢?使用Fiddler就可以办到。

Fiddler是Eric Lawrence编写的HTTP抓包软件。Fiddler工作在应用层上,作为其他程序的HTTP代理服务器。它可以直接抓取并分析HTTP流量,也可以作为“中间人”抓取并分析HTTPS流量。

如何使用FiddlerCap抓取网站访问记录

感谢你汇报了有关我的网站或作品的一个问题。为了定位你的问题原因、并尽快解决这个问题,我请求你根据下列步骤抓取一份网站访问记录。

  1. 下载FiddlerCap,并保存在桌面上
  2. 请关闭除了本页之外的所有浏览器窗口或标签页
  3. 双击桌面上的FiddlerCapSetup.exe文件,单击Install按钮
    安装界面
  4. 安装完毕后,单击Close按钮
    安装完毕界面
    此时如果弹出0xc0000135错误,请下载安装.NET Framework 2.0
  5. 如果我要求你“抓取HTTPS流量”,请勾选Decrypt HTTPS traffic(弹出A note about HTTPS Decryption对话框请单击OK);勾选此选项后,浏览器访问https网站时会弹出证书错误警告,请忽略那些警告
  6. 依次单击Clear Cookies、Clear Cache、1 Start Capture按钮
    主界面-未开始
  7. 如果你使用的浏览器不是IE,请手动将HTTP代理服务器设置成127.0.0.1、端口号8889
  8. 打开浏览器窗口,访问遇到问题的网页并进行必要的操作,使你汇报的问题再次出现
  9. 回到FiddlerCap窗口,依次单击2 Stop Capture、3 Save Capture按钮
    主界面-已抓取
  10. 在Save Session Capture to...对话框中,将网站访问记录.saz文件保存在桌面上
  11. 访问阳光男孩的网上名片查看我的Email地址,并把问题描述、截图、网站访问记录发送给我。
    阳光男孩尊重你的隐私,你提交的网站访问记录只会用于问题的定位和解决,不作其他用途。

说明:FiddlerCap是Eric Lawrence编写的HTTP访问记录抓取软件。 本文面向熟悉计算机基本操作的读者,介绍了该软件的基本使用方法,让你在汇报问题时提供更多信息,用于问题的定位和解决。

用XSLT欣赏所有世博印章

中国2010年上海世博会吸引了众人的关注,五彩缤纷的“世博印章”更是令人趋之若鹜。作为2010年世博会的两大创新项目之一的网上世博会的“我的护照”栏目,可以看到大部分场馆的世博印章图片。那么,能否一次性看到所有的世博印章呢?

Fiddler观察网络流量可以得知:每个片区有一个xml配置文件包含了片区内各场馆的名称和代码。例如,A片区的xml配置文件是:

<!-- http://www.expo.cn/configs/tencent/azone.xml -->
<root>
<err>0</err>
<p>
    <pid>11100001</pid>
    <dis>A片区</dis>
    <cnname>中国国家馆</cnname>
    <code>z0001</code>
    <type>体验馆</type>
    <name>China Pavilion</name>
</p>
<p>
    <pid>11200011</pid>
    <dis>A片区</dis>
    <cnname>哈萨克斯坦馆</cnname>
    <code>c1050</code>
    <type>浏览馆</type>
    <name>Kazakhstan Pavilion</name>
</p>
<p>
    <pid>11200013</pid>
    <dis>A片区</dis>
    <cnname>沙特馆</cnname>
    <code>c1086</code>
    <type>体验馆</type>
    <name>Saudi Arabia Pavilion</name>
</p>
<p>
    <pid>11200025</pid>
    <dis>A片区</dis>
    <cnname>印度馆</cnname>
    <code>c1018</code>
    <type>浏览馆</type>
    <name>India Pavilion</name>
</p>
<!-- 以下省略 -->
</root>

而世博印章的图片URI,可以根据pid字段构造。例如,中国国家馆的印章URI是:http://www.expo.cn/images/HZ/11100001.png

程序处理xml有很多种方法,其中一种好用的方法是XSLT。XSLT是一种声明性的、基于XML的语言,用于将一个或多个xml文档转换成另一些xml文档。XSLT经常被用于将xml数据转换成可以作为网页显示的html或xhtml文档。

双层动态图片保护Email地址

Email是最重要的通讯工具之一。滥发垃圾信息者会利用一切可能的通讯工具,把小广告送到你的手中。发送Email的成本极为低廉,使得Email倍受垃圾信息发送者的青睐。发送垃圾邮件的第一步,是收集足够多的有效电子邮件地址;而收集Email地址的方法,主要就是查询目录、使用网页爬虫两种。

通过查询目录收集Email地址,主要是查询各类电子黄页、网站备案资料、域名WHOIS信息等。例如WHOIS yoursunny.com,可以查询到域名注册者的Email地址(有些WHOIS结果页面会用各种方式保护Email地址,但大部分并不会进行保护)。根据规定,域名WHOIS信息必须包含有效的Email地址,因此规避这种收集的唯一方法是使用Private Domain Registration服务,令WHOIS信息中包含的Email地址不断变化。

使用网页爬虫收集Email地址,是指垃圾邮件发送者编写程序抓取互联网上的网页,在网页文本中提取形似Email地址的字符串。比如某网页包含了 someone@example.com 这个Email地址,爬虫程序抓取该网页时就可以用正则表达式找到这个地址。本文主要讨论针对这种收集方法的防范。

防范网页爬虫抓取Email地址的传统方法

使用变体Email地址

SNS社交平台的核心技术架构

SNS(Social Networking Sites),是一类用户可以自己发布信息、与别人互动并分享个人或职业兴趣的网站。知名的SNS网站有Facebook、MySpace、人人网(校内网)、开心网等。

运营一个SNS并不容易,需要用户体验研究、艺术设计、前端开发、后端架构、系统维护优化等技术人员,以及商务、公关、客服等非技术部门的通力配合。阳光男孩是技术人员,所以只谈技术。本文只想涉及SNS技术的一小部分:平台核心架构。所谓“平台核心架构”,我说的是SNS网站最基础、最核心的部分。与“操作系统”对比,SNS的平台核心架构,就相当于操作系统的内核。阳光男孩认为,SNS平台的核心架构包括两块:应用接入、消息分发。

应用接入,让用户有事可做

完善、稳定的应用接入平台,让用户在SNS平台上有事可做。这里所说的“应用”,既包括第三方应用(比如开心农场、荣光医院、跑火车等各类游戏),也包括SNS网站自己推出的应用(比如日志、照片、相册等各种内置工具)。自有应用+第三方应用,约等于SNS网站上除了首页、个人主页、设置页面以外的所有页面。

SNS平台为接入应用提供的功能

又一个加密PHP脚本的解码方法

三个星期以前我发布了一篇文章,介绍了base64加密的PHP脚本的解码方法。前几天,飞信好友行者又扔来了一段更加复杂、诡异的PHP脚本:

下载每一步的源代码

//0.php
<?php
$OOO0O0O00=__FILE__;$OOO000000=urldecode('%74%68%36%73%62%65%68%71%6c%61%34%63%6f%5f%73%61%64%66%70%6e%72');$OO00O0000=26408;$OOO0000O0=$OOO000000{4}.$OOO000000{9}.$OOO000000{3}.$OOO000000{5};$OOO0000O0.=$OOO000000{2}.$OOO000000{10}.$OOO000000{13}.$OOO000000{16};$OOO0000O0.=$OOO0000O0{3}.$OOO000000{11}.$OOO000000{12}.$OOO0000O0{7}.$OOO000000{5};$O0O0000O0='OOO0000O0';eval(($$O0O0000O0('JE9PME9PMDAwMD0kT09PMDAwMDAwezE3fS4kT09PMDAwMDAwezEyfS4kT09PMDAwMDAwezE4fS4kT09PMDAwMDAwezV9LiRPT08wMDAwMDB7MTl9O2lmKCEwKSRPMDAwTzBPMDA9JE9PME9PMDAwMCgkT09PME8wTzAwLCdyYicpOyRPTzBPTzAwME89JE9PTzAwMDAwMHsxN30uJE9PTzAwMDAwMHsyMH0uJE9PTzAwMDAwMHs1fS4kT09PMDAwMDAwezl9LiRPT08wMDAwMDB7MTZ9OyRPTzBPTzAwTzA9JE9PTzAwMDAwMHsxNH0uJE9PTzAwMDAwMHswfS4kT09PMDAwMDAwezIwfS4kT09PMDAwMDAwezB9LiRPT08wMDAwMDB7MjB9OyRPTzBPTzAwME8oJE8wMDBPME8wMCwxMTgyKTskT08wME8wME8wPSgkT09PMDAwME8wKCRPTzBPTzAwTzAoJE9PME9PMDAwTygkTzAwME8wTzAwLDkwOCksJ0kvTU5LQUNkVlJHUXlEV1VncTY4d3BrYXpMTzVsdG5tVEIrMGJ2OXVIcnhGN1hTWTFFM2ZaaGlqYzRlMm9Kc1A9JywnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLycpKSk7ZXZhbCgkT08wME8wME8wKTs=')));return;?>
tiBr5CwHGMBrljDvtMTb6AqwwAJ8qpRkqpRmpbA6wh7uwZp6pbp6aZ4/8wwua6brR+zHVkp3LktrGMlHGMcxaMcrUiqHzkvSzk4lQ9DY56voGMBlQ+rlaMcrUiBFyuDH5jplQ9DY56voGMBlQ+rlaMcrUiEYziA7OCJftMbuQMqVpAqgahDAwvLAwvJkgpR8k3t8qpRkqpRm8bADq6ttG6brmd1HGCvflipZGMqmwZp6pbp6k3tVpAqgaZBUwhgua6brR+zHVkp3LktrGMlHGMcxaMcrUiqHzkvSzk4lQ9DY56voGMBlQ+rlaMcrUiBFyuDH5jplQ9DY56voGMBlQ+rlaMcrUiEYziA7OCJftMbuQMqmwZp6pbp6k3tVpAqgaZBUwhgua6brG6vbOkwHRomF3Fu81JU31P7TLCBBOk4B5+405iZTOC73liBYt6405iij1o2GHe3EYFazEsYGStUNH2r75iDB5CBYlj6BH2UyZUG4S7Q3EsY/x7shwpC0S0gED8V1DMlrW3qU8fI18fI18fIJljq3ajRvlCEBziwHRhJmqbvyqpJmR31+R3VSRKJU8f/UyKo1yMc+R3V7GMqU8Zo1yNI18fIHRKJUyKJUyN/UyMTb8Zo18Zo1yN/UGMqUyNI18f/UyNI7RKJUyN/UyNI1yMb7RZbY8w4QgwDbpvRdwavKphpul8zctj/Fzary8fp7tC4XpKVFyCRiWapVluBCDhB8k8AAyiLOOCvxzfqvy9JGlhIJR31ugwRNqKpCqZBR6bXy8w4UwAA6whqppvtzkprBz9DbLkLuOCvxOiEX59J1laRftdpitjB4n0IEy0yZD8zjWNbFQ3lrG6brWiL05CJfL6Tb8fI1yKo18fI1G8Xvt9A7GMqU8fI18fI18fIrW1==Ngr3LaAhOaRvGMlSQ+J05CAfl3J05i4SLkDZQu/HlMlrW1ZGOk405dpbL6TuQ+cYziEBljyYLCRmljA7Qu/HlMlrW1ZGOk405dpbL6TuQ+cYziEBljyY(后面还有大量数据,省略)

其中,在?>后面的数据足有27KB(共27316字节)。显然,这些数据并不是直接输出给客户端的,而要在服务端经过一定的处理。这27KB的数据看起来很像base64编码,但是直接用base64_decode解码得不到任何有意义的结果。

仔细观察,在前面的PHP代码部分有一个eval。那就按照上一篇文章的办法,把它改成echo试试!

base64加密PHP脚本的解码方法

PHP是网站服务端最流行的编程语言之一。PHP运行环境本身是开源的,服务器不加载插件时PHP脚本也无法加密。但是,总有人因为商业上的考虑,而将PHP程序通过各种方法进行混淆,使读者很难看到清晰易懂的代码。

然而,PHP运行环境的本质决定了,被混淆、编码的PHP脚本总是有办法恢复成可读的代码的。本文介绍了一种对含有LAVEbase64_decode的、被加密的PHP的解码方法。

在使用这种方法之前,你应该准备好:

  • 能运行PHP的Web服务器,例如 Apache 或 IIS
  • wget.exe命令行客户端 或 浏览器
  • 具备PHP语法高亮功能的文本编辑器,例如 Notepad2

下载每一步的源代码