2009年6月20日星期六

谷歌中国被停止境外网页搜索和搜索建议功能

  据新华网报道,中央电视台在昨晚的《新闻联播》及《焦点访谈》节目中指责“谷歌中国”网站存在大量淫秽色情和低俗信息内容,同时互联网举报中心对谷歌中国网站进行强烈谴责,要求其彻底清理色情信息,并建议相关执法部门依法处罚。之后,国家有关部门召见“谷歌中国”网站负责人,对“谷歌中国”网站大量传播淫秽色情内容进行执法谈话,宣布对“谷歌中国”网站的处罚措施,暂停该网站境外网页搜索业务和联想词搜索业务,并责令其立即进行整改,彻底清理淫秽色情和低俗内容。

  现在登录Google.cn,其“搜索建议”功能果然已经无法使用了,对于境外网站的搜索是否关闭目前尚不得而知,据我所知,很多国内的网站主为了避免备案,都购买和使用了国外的虚拟主机,如果Google.cn关闭境外网页搜索功能,则大量国外中文网站将失去来自Google的流量,可谓损失重大。对于Google自身来说,这也将极大冲击Google的用户搜索体验,使得原本使用Google.cn的用户转而使用Google.com或其他搜索引擎,但愿现在Google.com不会自动转向Google.cn了。

谷歌中国

  昨天的“焦点访谈”栏目也“火”了另一个人,就是那个被采访的“大学生”高也,此人在节目中声色俱厉地对谷歌中国进行了谴责,还举个他同学的例子做为证据,可惜经过网友的人肉搜索,原来此人不仅不是大学生,而且还是焦点访谈栏目组的实习人员。小高同学目前正在承受网民暴风骤雨般的攻击,已经被迫关闭自己的新浪博客和校内等网络地址,打算隐居了,这对他的人生经历也算是一个教训,早知今日,何必当初呢。

  “谨言慎行”是一种做人的美德,就像那个曾经说过“很黄很暴力”的小女孩一样,睁着眼睛说瞎话并不是一件困难的事情,重要的是,说话要负责任,特别是一个人在国家电视台这样的垄断媒体上说话,说话者的权力会被无限放大,这时候,说话人不仅仅是表达自己的声音,而且是影响电视机前的大众,这就是权力。如果你不珍惜自己的话语权,用幼稚的谎话去愚弄和欺骗大众,那么最终会被这个社会无情地惩罚。

2009年6月19日星期五

央视抨击谷歌中国存在淫秽色情信息

  今天晚上,中央电视台《新闻联播》和后面的《焦点访谈》两个栏目都重点抨击谷歌中国,声称谷歌中国存在大量淫秽色情和低俗信息,违反国家有关法律规定,严重侵害青少年身心健康。同时互联网违法和不良信息举报中心也“强烈谴责”谷歌中国传播淫秽色情和低俗信息,要求其对淫秽色情和低俗内容进行彻底清理,并建议相关执法部门依法处罚。

  这次央视和举报中心的措辞非常严厉,令人感到比较意外,做为一个经常上Google的用户,我印象中很少看到色情信息,对于色情信息过滤技术,Google有SafeSearch功能,可以从搜索结果中过滤掉大部分色情内容,但如果要求过滤掉搜索引擎上所有的色情信息,在技术上目前国内所有的搜索引擎都做不到,包括百度也做不到。

谷歌中国

  说到保护青少年,现实中的危害恐怕比网络上的要更凶猛一些,前有“习水嫖宿幼女案”,后有“邓玉娇防卫过当案”,如果从制度上能够保证再没有幼女被“嫖宿”,再没有服务生被迫“防卫过当”,这比起谴责搜索引擎过滤技术有漏洞要更为重要和紧迫一些。

  另外,如何保护自己的小孩,本来是每个家长的责任,相信大多数家长都有能力和办法管理自己的小孩,不必“保姆”们如此费心了。

  去年11月,央视新闻30分也连续两天曝光百度竞价排名中的虚假医药广告,为此,百度曾经在2009年春晚“赞助”了央视4000万元,如果央视真的那么有“社会责任感”,为啥百度交了钱就能在春晚亮相呢。这次央视吃完原告吃被告,里外通吃,又瞄上了谷歌,看来谷歌也不得不交些保护费了,在中国做企业实在不易啊。

2009年6月18日星期四

安全迁移网站的技巧

  在不同的主机上迁移同一个网站,需要一定的技巧,今天我就介绍一些同一域名下将网站从一个主机迁移到另一个主机的技巧,以避免网站因为迁移而造成不必要的损失。

  1、迁移准备

  先将原始网站的评论等更新功能关闭,接着把原始网站的文件、数据库等信息进行备份,然后下载到本地,然后将网站内容完全上传部署到另一个主机上,通过修改hosts的方法,将网站的域名指向新的IP地址,手动验证网站可以正常访问。

  2、迁移操作

  接着,选择一个访问量少的时段,例如凌晨时刻,通过修改域名DNS(Domain Name Server)的A记录实现网站的迁移,注意不要通过删除A记录然后增加一个新的A记录来实现,那样会造成短时间的网站无法访问。

  3、迁移过程

  将原有网站内容保存至少半个月的时间(但不一定需要更新),保证搜索引擎使用原来的IP地址仍然可以访问到内容,如果无法做到这一点,那也要将原始网站的完全关闭,使原有IP无法访问,切不可保持原始网站开放,访问时候却得到404错误的情况发生。

  4、迁移结束

  半个月后,可以彻底关闭原有网站的WEB服务,此时,搜索引擎大多已经可以正常访问新的网站地址了,网站迁移结束。

2009年6月17日星期三

利用U盘进行软件加密的方法

  一般的U盘不具备加密的功能,虽然U盘和加密狗外形有一些相似,但是内部完全不一样的,U盘只是一个存储器芯片和简单的附属电路,而现在的智能卡加密狗都具有一个单独的CPU或者加密芯片,可以执行相当复杂的加密算法。

  有的软件开发商有这样一种需求,就是使用U盘发布软件的同时,想要节约成本,防止U盘中的软件被复制,但又不想再购买昂贵的加密狗,因此想要把软件绑定在U盘上执行,当U盘拔下来的时候,软件就不能正常运行,和我先前介绍的绑定硬件指纹相似,使用绑定U盘的方式加密软件。

  在对软件安全不是特别在意的情况下,可以在软件中采用绑定U盘内部ID的方式来实现这种加密,先使用程序将U盘的ID读出来,然后根据这个ID生成License文件,当解密者将U盘内的文件复制到其他电脑的时候,软件执行过程中读取U盘ID失败,因此就无法校验License。

  通常情况下两个U盘的ID是不相同的,因此即使将软件复制到另外一个U盘,软件执行的时候,根据U盘ID验证License,也会出现不匹配的现象,这样就实现了软件绑定U盘的加密方式。

  需要指出的是,这种U盘加密并不算安全,大多数U盘厂商有内部量产工具,可以修改U盘的内部ID号码,这就存在了复制U盘的可能性,但对于普通用户来说,通常没有修改U盘内部ID的能力,因此也具有一定的加密性。

  这个加密方法中,读取U盘ID号的函数的VB源代码如下所示:

    Set objWMIService = GetObject("winmgmts:\.
ootcimv2")
    Set colItems = objWMIService.ExecQuery("Select * From Win32_USBHub")
    For Each objItem In colItems
        a = objItem.DeviceID
        If InStr(a, "VID") Then b = Split(a, "")
        USB_ID = b(UBound(b))
    Next
 

2009年6月16日星期二

同时更新Twitter、饭否、嘀咕和做啥

  很多微博客(如嘀咕和做啥)和第三方工具(如Hellotxt、Ping.fm)都同时提供了同步到其他微博客的服务,可以同步信息到一些主要的微博客服务,如Twitter、饭否等,但是这些工具都有一个很重要的问题,就是存在密码被盗或泄漏的风险。

  目前大多数微博客是通过用户名和密码做为参数进行认证登录,Twitter可使用OAuth协议进行认证,而这些用户名和密码存放在这些同步工具网站上,万一保存不当,就有可能会被黑客获取,带来用户帐号被盗的风险,因此,比较保险的办法是通过自己写的程序来实现微博客的自动同步功能,这样被黑客破解的可能性就小了很多。

  我这里写了一个同时更新Twitter、饭否、嘀咕和做啥等微博客的小程序,可以在自己的服务器上实现微博客同时更新功能,为了代码简单,使用时需要这几个服务使用相同的用户名和相同的密码,选中需要同步的微博客,也可勾选掉不想发布的服务,然后输入用户名和密码,发布信息后就会自动同时更新这几个微博客。

  全部源程序代码如下:

<%@ CODEPAGE=65001 %>

<%
If Request("submit")<>"" Then

 Dim xmlhttp
 Set xmlhttp = Server.CreateObject("Microsoft.XMLHTTP")

 Response.Cookies("save_username")=Request("username")
 Response.Cookies("save_username").Expires=Date+365
 Response.Cookies("save_password")=Request("password")
 Response.Cookies("save_password").Expires=Date+365
 username = Request("username")
 password = Request("password")

 post_status = "status=" + server.URLencode(Request("updateStatus"))

 If Request("twitter") = 1 Then
  xmlhttp.Open "POST", "http://" & username & ":" & password & "@twitter.com/statuses/update.xml", False
  xmlhttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"
  xmlhttp.setRequestHeader "Content-Length", Len(post_status)
  xmlhttp.Send (post_status)
  Response.Write "twitter OK." 'xmlhttp.responseText
 End If
 
 If Request("fanfou") = 1 Then
  xmlhttp.Open "POST", "http://" & username & ":" & password & "@api.fanfou.com/statuses/update.xml", False
  xmlhttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"
  xmlhttp.setRequestHeader "Content-Length", Len(post_status)
  xmlhttp.Send (post_status)
  Response.Write "fanfou OK." 'xmlhttp.responseText
 End If

 If Request("digu") = 1 Then
  post_status = "content=" + server.URLencode(Request("updateStatus"))
  xmlhttp.Open "POST", "http://" & username & ":" & password & "@api.digu.com/statuses/update.xml", False
  xmlhttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"
  xmlhttp.setRequestHeader "Content-Length", Len(post_status)
  xmlhttp.Send (post_status)
  Response.Write "digu OK." 'xmlhttp.responseText
 End If

 If Request("zuosa") = 1 Then
  xmlhttp.Open "POST", "http://" & username & ":" & password & "@api.zuosa.com/statuses/update.xml", False
  xmlhttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"
  xmlhttp.setRequestHeader "Content-Length", Len(post_status)
  xmlhttp.Send (post_status)
  Response.Write "zuosa OK." 'xmlhttp.responseText
 End If

 Set xmlhttp = Nothing
 response.end
Else

%>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN">
<html>
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
 <meta http-equiv="Content-Language" content="zh-CN" />
 <title>更新状态</title>
<script language="javascript"> 
function countChar(textareaName,spanName)

 document.getElementById(spanName).innerHTML = 140 - document.getElementById(textareaName).value.length;

</script>
</head>
<body>
 <form method="post" action="<%= Request.ServerVariables("URL")%>">
  <p>
   <textarea tabindex="1" id="updateStatus"  name="updateStatus" rows="6" cols="40" onkeydown='countChar("updateStatus","counter");' onkeyup='countChar("updateStatus","counter");'></textarea>
  </p>
  <p>
   <label><input tabindex="2" type="submit" id="submit" name="submit" value="  发     布  " /></label>    可以输入 <span id="counter">140</span> 字
  </p>
  <p>
   <label>用户名:</label>
   <input tabindex="3" type="text" name="username" id="username" value="<%= Request.Cookies("save_username")%>" />
  </p>
  <p>
   <label>密 码:</label>
   <input tabindex="4" type="password" name="password" id="password" value="<%= Request.Cookies("save_password")%>" />
  </p>
  <p>
   <label><input type="checkbox" id="twitter" name="twitter" value="1" checked="checked"> Twitter </label><label><input type="checkbox" id="fanfou" name="fanfou" value="1" checked="checked"> 饭否 </label><label><input type="checkbox" id="digu" name="digu" value="1" checked="checked"> 嘀咕 </label><label><input type="checkbox" id="zuosa" name="zuosa" value="1" checked="checked"> 做啥</label>
  </p>
 </form>
</body>
</html>

<%
End if
%>
 

2009年6月15日星期一

在JavaScript中实现统计文本框Textarea字数

  现在流行的Twitter等微博客网站,有一个很好的用户体验,就是在文本框中输入文字的时候,会自动统计输入的字符,并显示用户还能输入的字符,在限制了140个字的微博客中,这样的小提示可以很好的增强用户体验。

  如果实现这种技术呢,我进行了一些研究,发现实现其实挺简单,几行代码就能完成输入字符统计功能,经过实际测试,其对文字的统计与Twitter等微博客的完全相同。

  使用方法是,先增加一个span,用于显示剩余的字数,然后在Textarea中,加入一个onkeydown和onkeyup的事件,调用另一段JavaScript函数,函数调用的参数为span的id和textarea的id,然后再JavaScript中使用innerHTML返回计算出来的剩余字数。

  以下是相关的JavaScript代码:

<script language="javascript"> 
function countChar(textareaName,spanName)

 document.getElementById(spanName).innerHTML = 140 - document.getElementById(textareaName).value.length;

</script> 
可以输入<span id="counter">140</span>字<br/>
<textarea id="status"  name="status" rows="6" cols="40" onkeydown='countChar("status","counter");' onkeyup='countChar("status","counter");'></textarea>

2009年6月14日星期日

从技术层面分析“绿坝-花季护航”存在的问题

  工信部日前下发《关于计算机预装绿色上网过滤软件的通知》,要求在7月1日之后在我国所有销售的个人电脑预装该软件,这个消息在网络上引起了轩然大波,网友纷纷质疑:软件是否会被强制使用?网友的隐私能否得到有效保护?软件一年的注册费用真的值4170万吗?我先前曾经对此做过一些简单的评论,今天我将从技术层面对“绿坝-花季护航”可能存在的问题再进行一些探讨。

  软件产品的质量是否合格

  从技术上将,“绿坝-花季护航”对于文字信息的审查是通过巨大的关键字库进行过滤分析的,将需要审查的文字进行分词处理,然后进行关键词对比过滤,有可能使用了TF-IDF对词频进行分析以确定文章的主要内容,进行语义分析,同时“绿坝”具有在线更新数据库功能,可以定时同步最新的关键词列表。根据已经公布的一些关键词以及网友实际测试效果来看,在很大程度上会存在“误判”的可能性,有可能会将用户浏览的正常网页或者文档误判为“有害信息”。

  对于色情图片的检测可能使用了一些开源产品,通过肤色分割模型对色情图片进行检测,设置不同的阈值会出现不同的误差率。在很多情况下会错误的将带有大量肤色的图片判断为色情图片,同时,对于黑人的色情图片却无法识别。

  总的来说,该软件在语义分析上的判断准确性,比起百度和Google的语义识别还有很大的差距。

  软件产品的价格

  工信部以每年4170万元的价格购买了“绿坝-花季护航”一年的使用许可,预计的安装量大概是一千万左右,在同类软件产品中,可谓“天价”。

  举个例子,在国家公布的中国软件行业百强之中第20位,开发企业管理软件的用友公司,一年的净利润也只有四亿多元,而且销售的大部分软件都是终身许可的。有使用期限的License通常价格极低甚至免费,做为软件行业的通用做法,一套商业软件通常会有三个月到半年左右的免费试用期,例如360安全卫士自带的NOD32杀毒软件就可以免费试用半年,在这个阶段,用户可以免费使用该软件的全部功能,超过期限后用户可自行决定是否购买该软件,这种方法可以有效避免用户退货的概率。对于装机量巨大的软件,例如腾讯QQ、迅雷等,全部都是免费使用的软件,开发商通过第三方增值服务(例如广告等)就可以获得巨大的收入。如果安装量在千万级别,相信有大量的软件厂商都会愿意免费提供政府使用。工信部在这个软件的招标过程的确令人感到疑惑。

  软件开发商的研发能力

  以中标的金惠和大正两家公司,其研发能力的确令人质疑,在国家公布的中国软件百强名单中根本找不到他们的名字,研发过程中也存在一些不规范的做法,例如未经授权使用国外开源技术等,在安全方面,很多安全公司(如奇虎江民)都发现“绿坝”存在高风险的安全漏洞,黑客可以利用这些漏洞传播病毒,中毒电脑存在严重泄密或被黑客远程控制的可能。

  我先前曾经提到过,这样一款小公司开发的软件很容易存在各种安全漏洞,在未经过广泛测试之前,冒然就安装到大量电脑客户端上,存在极大的安全隐患。一旦“绿坝-花季护航”的安全漏洞被黑客发现,那么所有安装这个软件的电脑都成为黑客的“肉鸡”(受别人远程控制的电脑),大量的“肉鸡”不但可能引发各种网络安全事故,还完全有可能重演先前“暴风影音断网”的灾难。没想到我的这些猜想这么快就被一一证实了。

  预装过滤软件的原因

  工信部原本是通过购买美国Cisco(思科公司)的入侵检测系统(IDS)和入侵防御系统(IPS)来监控和管理中国互联网,但这存在一些问题,Cisco的安全产品目前只能针对文字类型的数据包进行监控和分析,对于图像和视频显得无能为力,同时,Cisco做为一个美国公司,很难保证其产品中会不会留有后门,一旦出现战争等紧急情况,美国可以通过Cisco的产品完全控制中国的互联网通讯,这会使得中国在战争中处于极为不利的局面,而做为国产的华为中兴等公司,又不具备开发这种应对数亿网民的超大型产品的能力,因此,Cisco(思科公司)的产品不但不怕没有生意,还可以漫天要价。

  可能是出于这方面的考虑,工信部才决定通过在客户端电脑预装过滤软件的形式,来打破Cisco一统天下的局面,这种分布式技术,将大量的计算分配到了客户端的电脑上,实现了单个节点所无法实现的巨大计算能力,并在一定程度上解决了图像智能识别等问题。如果客户端的过滤软件运行良好的话,可以大为减轻电信部署的IDS和IPS的负荷,如果负荷降的足够低的话,就完全可以使用华为的同类产品进行替代,以防止未来战争期间可能出现的变数。

  可惜的是,中标的企业拿出来的软件产品实在不争气,产品质量不过关,存在着大量安全隐患,如果大规模安装的话,可能会带来更多的问题,我建议,如果政府真的要想购买软件的话,中国软件百强中任何一家民营软件企业的研发能力都比这两家强,从那些公司招标的话,不难获得真正物美价廉的软件。