存档

‘网站应用’ 分类的存档

简单防范SYN_RECV攻击

2009年7月26日
498 views 没有评论

SYN攻击是最常见又最容易被利用的一种攻击手法。相信很多人还记得2000年YAHOO网站遭受的攻击事例,当时黑客利用的就是简单而有效的SYN攻击,有些网络蠕虫病毒配合SYN攻击造成更大的破坏。本文介绍SYN攻击的基本原理、工具及检测方法,并全面探讨 SYN攻击防范技术。一、TCP握手协议 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED 状态,完成三次握手。 (TCP 连接示意图)(TCP 关闭示意图) 完成三次握手,客户端与服务器开始传送数据,在上述过程中,还有一些重要的概念:未连接队列:在三次握手协议中,服务器维护一个未连接队列,该队列为每个客户端的SYN包(syn=j)开设一个条目,该条目表明服务器已收到SYN包,并向客户发出确认,正在等待客户的确认包。这些条目所标识的连接在服务器处于Syn_RECV状态,当服务器收到客户的确认包时,删除该条目,服务器进入 ESTABLISHED状态。 Backlog参数:表示未连接队列的最大容纳数目。 SYN-ACK 重传次数 服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。注意,每次重传等待的时间不一定相同。半连接存活时间:是指半连接队列的条目存活的最长时间,也即服务从收到SYN包到确认这个报文无效的最长时间,该时间值是所有重传请求包的最长等待时间总和。有时我们也称半连接存活时间为Timeout 时间、SYN_RECV存活时间。

二、SYN攻击的基本原理 SYN攻击属于DOS攻击的一种,它利用TCP协议缺陷,通过发送大量的半连接请求,耗费CPU和内存资源。SYN攻击除了能影响主机外,还可以危害路由器、防火墙等网络系统,事实上SYN攻击并不管目标是什么系统,只要这些系统打开TCP服务就可以实施。从上图可看到,服务器接收到连接请求(syn= j),将此信息加入未连接队列,并发送请求包给客户(syn=k,ack=j+1),此时进入SYN_RECV状态。当服务器未收到客户端的确认包时,重发请求包,一直到超时,才将此条目从未连接队列删除。配合IP欺骗,SYN攻击能达到很好的效果,通常,客户端在短时间内伪造大量不存在的IP地址,向服务器不断地发送syn包,服务器回复确认包,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。

三、SYN攻击工具 SYN攻击实现起来非常的简单,互联网上有大量现成的SYN攻击工具。 windows系统下的SYN工具以synkill.exe为例,运行工具,选择随机的源地址和源端囗,并填写目标机器地址和TCP端囗,激活运行,很快就会发现目标系统运行缓慢。如果攻击效果不明显,可能是目标机器并未开启所填写的TCP端囗或者防火墙拒绝访问该端囗,此时可选择允许访问的TCP端囗,通常,windows系统开放 tcp139端囗,UNIX系统开放tcp7、21、23等端囗。四、检测SYN攻击检测SYN攻击非常的方便,当你在服务器上看到大量的半连接状态时,特别是源IP地址是随机的,基本上可以断定这是一次SYN攻击。我们使用系统自带的 netstat 工具来检测SYN攻击:   
# netstat -n -p TCP   
tcp 0  0 10.11.11.11:23  124.173.152.8:25882  SYN_RECV -   
tcp 0  0 10.11.11.11:23  236.15.133.204:2577  SYN_RECV -   
tcp 0  0 10.11.11.11:23  127.160.6.129:51748  SYN_RECV -   
tcp 0  0 10.11.11.11:23  222.220.13.25:47393  SYN_RECV -   
tcp 0  0 10.11.11.11:23  212.200.204.182:60427 SYN_RECV -   
tcp 0  0 10.11.11.11:23  232.115.18.38:278   SYN_RECV -   
tcp 0  0 10.11.11.11:23  239.116.95.96:5122  SYN_RECV -   
tcp 0  0 10.11.11.11:23  236.219.139.207:49162 SYN_RECV -

上面是在LINUX系统中看到的,很多连接处于SYN_RECV状态(在WINDOWS系统中是SYN_RECEIVED状态),源IP地址都是随机的(也可能是同一个IP的很多SYN_RECV连接状态),表明这是一种带有IP欺骗的SYN攻击。我们也可以通过下面的命令直接查看在LINUX环境下某个端囗的未连接队列的条目数:   #netstat –atun grep SYN_RECV grep :80 wc -l 显示TCP端囗80的未连接数请求及个数,虽然还远达不到系统极限,但应该引起管理员的注意。五、SYN攻击防范技术关于SYN攻击防范技术,人们研究得比较早。归纳起来,主要有两大类,一类是通过防火墙、路由器等过滤网关防护,另一类是通过加固TCP/IP协议栈防范.但必须清楚的是,SYN攻击不能完全被阻止,我们所做的是尽可能的减轻SYN攻击的危害,除非将TCP协议重新设计。

1、过滤网关防护

这里,过滤网关主要指明防火墙,当然路由器也能成为过滤网关。防火墙部署在不同网络之间,防范外来非法攻击和防止保密信息外泄,它处于客户端和服务器之间,利用它来防护SYN攻击能起到很好的效果。过滤网关防护主要包括超时设置,SYN网关和SYN代理三种。

■ 网关超时设置:防火墙设置SYN转发超时参数(状态检测的防火墙可在状态表里面设置),该参数远小于服务器的timeout时间。当客户端发送完SYN 包,服务端发送确认包后(SYN+ACK),防火墙如果在计数器到期时还未收到客户端的确认包(ACK),则往服务器发送RST包,以使服务器从队列中删去该半连接。值得注意的是,网关超时参数设置不宜过小也不宜过大,超时参数设置过小会影响正常的通讯,设置太大,又会影响防范SYN攻击的效果,必须根据所处的网络应用环境来设置此参数。

■SYN网关:SYN网关收到客户端的SYN包时,直接转发给服务器;SYN网关收到服务器的 SYN/ACK包后,将该包转发给客户端,同时以客户端的名义给服务器发ACK确认包。此时服务器由半连接状态进入连接状态。当客户端确认包到达时,如果有数据则转发,否则丢弃。事实上,服务器除了维持半连接队列外,还要有一个连接队列,如果发生SYN攻击时,将使连接队列数目增加,但一般服务器所能承受的连接数量比半连接数量大得多,所以这种方法能有效地减轻对服务器的攻击。

■SYN代理:当客户端SYN包到达过滤网关时,SYN代理并不转发SYN包,而是以服务器的名义主动回复SYN/ACK包给客户,如果收到客户的ACK包,表明这是正常的访问,此时防火墙向服务器发送ACK包并完成三次握手。SYN代理事实上代替了服务器去处理SYN攻击,此时要求过滤网关自身具有很强的防范SYN攻击能力。2、加固tcp/ip协议栈防范 SYN攻击的另一项主要技术是调整tcp/ip协议栈,修改tcp协议实现。主要方法有SynAttackProtect保护机制、SYN cookies技术、增加最大半连接和缩短超时时间等。tcp/ip协议栈的调整可能会引起某些功能的受限,管理员应该在进行充分了解和测试的前提下进行此项工作。

■ SynAttackProtect机制 (针对windows操作系统) 为防范SYN攻击,win2000系统的tcp/ip协议栈内嵌了SynAttackProtect机制,Win2003系统也采用此机制。 SynAttackProtect机制是通过关闭某些socket选项,增加额外的连接指示和减少超时时间,使系统能处理更多的SYN连接,以达到防范 SYN攻击的目的。默认情况下,Win2000操作系统并不支持SynAttackProtect保护机制,需要在注册表以下位置增加 SynAttackProtect键值:   HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters 当SynAttackProtect值(如无特别说明,本文提到的注册表键值都为十六进制)为0或不设置时,系统不受SynAttackProtect保护。 当SynAttackProtect值为1时,系统通过减少重传次数和延迟未连接时路由缓冲项(route cache entry)防范SYN攻击。当SynAttackProtect值为2时(Microsoft推荐使用此值),系统不仅使用backlog队列,还使用附加的半连接指示,以此来处理更多的SYN连接,使用此键值时,tcp/ip的TCPInitialRTT、window size和可滑动窗囗将被禁止。我们应该知道,平时,系统是不启用SynAttackProtect机制的,仅在检测到SYN攻击时,才启用,并调整 tcp/ip协议栈。那么系统是如何检测SYN攻击发生的呢?事实上,系统根据 TcpMaxHalfOpen,TcpMaxHalfOpenRetried 和TcpMaxPortsExhausted三个参数判断是否遭受SYN攻击。 TcpMaxHalfOpen 表示能同时处理的最大半连接数,如果超过此值,系统认为正处于SYN攻击中。Win2000 server默认值为100,Win2000  Advanced server为500。 TcpMaxHalfOpenRetried定义了保存在backlog队列且重传过的半连接数,如果超过此值,系统自动启动 SynAttackProtect机制。Win2000 server默认值为80,Win2000 Advanced server为400。 TcpMaxPortsExhausted 是指系统拒绝的SYN请求包的数量,默认是5。如果想调整以上参数的默认值,可以在注册表里修改(位置与 SynAttackProtect相同)

■ SYN cookies技术我们知道,TCP协议开辟了一个比较大的内存空间backlog队列来存储半连接条目,当SYN请求不断增加,并这个空间,致使系统丢弃SYN连接。为使半连接队列被塞满的情况下,服务器仍能处理新到的SYN请求,SYN cookies技术被设计出来。 SYN cookies应用于linux、FreeBSD等操作系统,当半连接队列满时,SYN cookies并不丢弃SYN请求,而是通过加密技术来标识半连接状态。在TCP实现中,当收到客户端的SYN请求时,服务器需要回复SYN+ACK包给客户端,客户端也要发送确认包给服务器。通常,服务器的初始序列号由服务器按照一定的规律计算得到或采用随机数,但在SYN cookies中,服务器的初始序列号是通过对客户端IP地址、客户端端囗、服务器IP地址和服务器端囗以及其他一些安全数值等要素进行hash运算,加密得到的,称之为cookie。当服务器遭受SYN攻击使得backlog队列满时,服务器并不拒绝新的SYN请求,而是回复cookie(回复包的 SYN序列号)给客户端,如果收到客户端的ACK包,服务器将客户端的ACK序列号减去1得到cookie比较值,并将上述要素进行一次hash运算,看看是否等于此 cookie。如果相等,直接完成三次握手(注意:此时并不用查看此连接是否属于backlog队列)。 在RedHat linux中,启用SYN cookies是通过在启动环境中设置以下命令来完成:   
# echo 1 > /proc/sys/net/ipv4/tcp_syncookies 注:也可以通过修改其它参数,或者使用/proc/sys/net/ipv4/netfilter/ip_contrack_*

■ 增加最大半连接数(加大未连接队列空间) 大量的SYN请求导致未连接队列被塞满,使正常的TCP连接无法顺利完成三次握手,通过增大未连接队列空间可以缓解这种压力。当然backlog队列需要占用大量的内存资源,不能被无限的扩大。 WIN2000:除了上面介绍的TcpMaxHalfOpen, TcpMaxHalfOpenRetried参数外,WIN2000操作系统可以通过设置动态backlog(dynamic backlog)来增大系统所能容纳的最大半连接数,配置动态backlog由AFD.SYS驱动完成,AFD.SYS是一种内核级的驱动,用于支持基于 window socket的应用程序,比如ftp、telnet等。AFD.SYS在注册表的位置: HKLM\System\CurrentControlSet\Services\AFD \ParametersEnableDynamicBacklog 值为1时,表示启用动态backlog,可以修改最大半连接数。  MinimumDynamicBacklog表示半连接队列为单个TCP端囗分配的最小空闲连接数,当该TCP端囗在backlog队列的空闲连接小于此临界值时,系统为此端囗自动启用扩展的空闲连接(DynamicBacklogGrowthDelta),Microsoft推荐该值为20。 MaximumDynamicBacklog是当前活动的半连接和空闲连接的和,当此和超过某个临界值时,系统拒绝SYN包,Microsoft推荐 MaximumDynamicBacklog值不得超过2000。 DynamicBacklogGrowthDelta值是指扩展的空闲连接数,此连接数并不计算在MaximumDynamicBacklog内,当半连接队列为某个TCP端囗分配的空闲连接小于MinimumDynamicBacklog时,系统自动分配 DynamicBacklogGrowthDelta所定义的空闲连接空间,以使该TCP端囗能处理更多的半连接。Microsoft推荐该值为10。 LINUX:Linux用变量tcp_max_syn_backlog定义backlog队列容纳的最大半连接数。在Redhat 7.3中,该变量的值默认为256,在AS中,是1024。这个值是远远不够的,一次强度不大的SYN攻击就能使半连接队列占满。我们可以通过以下命令修改此变量的值:   
# sysctl -w net.ipv4.tcp_max_syn_backlog=”2048″
Sun Solaris Sun Solaris用变量tcp_conn_req_max_q0来定义最大半连接数,在Sun Solaris 8中,该值默认为1024,可以通过add命令改变这个值:   
# ndd -set /dev/tcp tcp_conn_req_max_q0 2048
HP-UX:HP-UX用变量tcp_syn_rcvd_max来定义最大半连接数,在HP-UX 11.00中,该值默认为500,可以通过ndd命令改变默认值:   
#ndd -set /dev/tcp tcp_syn_rcvd_max 2048
■ 缩短超时时间上文提到,通过增大backlog队列能防范SYN攻击;另外减少超时时间也使系统能处理更多的SYN请求。我们知道,timeout超时时间,也即半连接存活时间,是系统所有重传次数等待的超时时间总和,这个值越大,半连接数占用backlog队列的时间就越长,系统能处理的SYN请求就越少。为缩短超时时间,可以通过缩短重传超时时间(一般是第一次重传超时时间)和减少重传次数来实现。 Win2000第一次重传之前等待时间默认为3秒,为改变此默认值,可以通过修改网络接口在注册表里的TcpInitialRtt注册值来完成。重传次数由TcpMaxConnectResponseRetransmissions 来定义,注册表的位置是:HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters registry key。当然我们也可以把重传次数设置为0次,这样服务器如果在3秒内还未收到ack确认包就自动从backlog队列中删除该连接条目。 LINUX:Redhat使用变量tcp_synack_retries定义重传次数,其默认值是5次,总超时时间需要3分钟。
 # sysctl -w net.ipv4.tcp_synack_retries=0  Sun Solaris Solaris 默认的重传次数是3次,总超时时间为3分钟,可以通过ndd命令修改这些默认值。综合上述的方法:在linux下可以通过修改/etc/ sysctl.conf,添加下列选项达到效果。
# add by geminis for syn crack
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog=2048
net.ipv4.tcp_synack_retries=1
转自:http://blog.csdn.net/dddfly/archive/2009/07/07/4328344.aspx

TCP/IP, 网站应用

中国(国内)机场缩写代码

2009年6月9日
1,264 views 没有评论

现在越来越多的公司在各个城市都有自己的分公司,我们公司也不例外.对于我们系统开发人员来说,每个城市都有一个缩写是最好记的.很多人或者会这样说,直接用系统生成的code不就行了吗?没错,这样虽然可以解决一个系统的问题,如果你有多个系统,或者需要连接外部的其他系统.这个时候我们系统自动生成的代码显然就不够好.
但使用什么样的简称才能保证唯一呢?如:深圳(SZ),苏州(SZ)极有可能会有重复.其实现在很多城市都有了自己的飞机场,用它来做你的城市缩写代码,不但不会重复,而且很标准.(唯一缺点是如果还没有开通飞机场的城市没有官方的缩写代码).

以下是标准的机场缩写代号:

城市名称 代码 城市名称 代码 城市名称 代码
阿勒泰 AAT 乌兰浩特 HLH 上海浦东 PVG
安康 AKA 哈尔滨 HRB 上海 SHA
阿克苏 AKU 和田 HTN 沈阳 SHE
安庆 AQG 汉中 HZG 沙市 SHS
包头 BAV 银川 INC 西安 SIA
北京 BJS 且末 IQM 汕头 SWA
北海 BHY 庆阳 IQN 深圳 SZX
保山 BSD 景德镇 JDZ 思茅 SYM
广州 CAN 嘉峪关 JGN 三亚 SYX
常德 CGD 九江 JIU 青岛 TAO
郑州 CGO 晋江 JJN 铜仁 TEN
长春 CGQ 佳木斯 JMU 通辽 TGO
朝阳 CHG 库车 KCA 济南 TNA
酒泉 CHW 喀什 KHG 天津 TSN
赤峰 CIF 南昌 KHN 黄山 TXN
长治 CIN 昆明 KMG 太原 TYN
重庆 CKG 吉安 KNC 乌鲁木齐 URC
长海 CNI 赣州 KOW 榆林 UYN
长沙 CSX 库尔勒 KRL 武汉 WUH
成都 CTU 克拉玛依 KRY 万县 WXN
常州 CZX 贵阳 KWE 兴城 XEN
大同 DAT 桂林 KWL 襄樊 XFN
达县 DAX 梁平 LIA 西昌 XIC
丹东 DDG 兰州 LHW 锡林浩特 XIL
大连 DLX 庐山 LUZ 咸阳 XIY
敦煌 DNH 拉萨 LXA 兴宁 XIN
大庸 DYG 林西 LXI 厦门 XMN
恩施 ENH 连云港 LYG 西宁 XNN
延安 ENY 洛阳 LYA 徐州 XUZ
福州 FOC 临沂 LYI 宜昌 YIH
阜阳 FUG 兰州东 LZD 伊宁 YIN
富蕴 FYN 柳州 LZH 烟台 YNT
格尔木 GOQ 牡丹江 MOG 依兰 YLN
广汉 GHN 梅县 MXZ 延吉 YNJ
海口 HAK 南充 NAO 昭通 ZAT
黑河 HEK 齐齐哈尔 NDG 兰州(中川) ZGC
呼和浩特 HET 宁波 NGB 湛江 ZHA
合肥 HFE 南京 NKG 珠海 ZUH
杭州 HGH 南宁 NNG 哈密 HMI
长沙(黄花) HHA 南阳 NNY 衡阳 HNY
海拉尔 HLD 北京 PEK 山海关 SHP

生活乐事, 网站应用

在线配色器

2009年5月27日
1,294 views 没有评论

一直都在从事内部系统的开发工作,一直以来只对性能比较重视.对软件的UI一直都是能看得过眼就可以了.直到最近一些软件公司来公司推销他们做的商业软件.凡事都要有对比,不比不知道,一比真的发现我们做的软件UI方面的确太差了.虽然我们公司也有四个美工,但他们都负责公司对外的网站设计,对自己的软件根本抽不出这么多时间来.最多也只是帮我设计好大的版面,小的细节方面还是需要我们自己调整的而网站的配色是给用户的第一印象.今天就这里开始了解起.

以下是收集的一些网站:
Scheme Generator, 它能够让你直接在网页上调配适合的颜色,并且为你寻找相关的色系。
Color Scheme Generator 工具其实是具有相关专业性,除了看得到的颜色外,它还能设定例如网页安全色(Safe Color)、深浅粉色系、对比色或是灰白色系,可以选择的设定相当的多。若你想将你选择到的颜色告诉朋友时,可以复制网页内的 address of this plot 连结,它就能够在网址内储存你选择的颜色。
http://colorschemedesigner.com/

216个网页安全色
http://www.visibone.com/colorlab/big.html

分析图片颜色的工具,只需要输入图片的网站,就可以帮你把图片中主要用到的颜色取出来.非常智能化的一个软件.
http://www.freegroup.org/category/free-webmaster-tools/color/

跟上面分析图片的类似,这一个是用来分析网站的,你只需要输入网页的地址,就可以帮你把css中使用到的颜色都分析出来.
http://redalt.com/Tools/I+Like+Your+Colors

Web UI, 网站应用

drupal 5.x 模块 – discuz编辑器(所见即所得)

2009年5月14日
1,125 views 7 条评论

drupal下的bbcode编辑器实在是太少了,之前一直在用BBCode Formatting Bar这一个插件.这一个插件的功能其实已经够我用了.但没有可视化的界面,编辑起来还是有点费劲.无意见发现了天枫提取出来的Discuz编辑器.
本来是想直接修改一下模板,把编辑器放进去就算了.但想到之间换模板带来的痛苦,决定尝试写一下drupal modules.
上网拼命找资料,收集了几个简单的例子过后,直接就开工了.三个小时过后,程序就已经完成了.虽然说是模块,但其实只能算是最简单的模块,里面只有两个函数,代码也没有超过100行.安装到本站后的示例效果:

发件人 ExtJs_Blog

模块写得实在是不怎么样,没有一点研究价值.而Discuz编辑器是有商业版权的.所以暂时不提供整个模块的下载地址.
真的有需要的朋友请留言.

PHP, 网站应用 , ,

给网站上加收藏到网摘的功能(drupal)

2009年3月26日
553 views 1 条评论

    最近主站(extjs.org.cn)的流量虽然一直在上升,但是上升的很慢.有个会员 kennie 写信给我,说能不能为网站加上一个收藏到网摘的功能.一个一个复制来复制去太麻烦了.

   其实很久之前一直都打算加上这一个功能,只是……,原因过多. 之前一个好朋友 Peter有跟我提到过他的网站刚刚加了一个网摘的功能.于是乎就用顺手牵羊的方法,把 Peter 网站(joomlar.cn) 的网摘功能偷过来了.

   没花10分钟,就把这一个功能加在我用drupal的主站上了.步骤也很简单,只需要在 /themes/yourthemes/node.tpl.php 中加入以下代码.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    <?php
	  if ($page != 0) {
    ?>
    <div id="digest">
    <b>收藏到网摘:</b> 
    <a href="javascript:d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(yesky=window.open('http://hot.yesky.com/dp.aspx?t='+escape(d.title)+'&amp;u='+escape(d.location.href)+'&amp;c='+escape(t)+'&amp;st=2','yesky','scrollbars=yes,width=700,height=600,left=75,top=20,status=yes,resizable=yes'));yesky.focus();"><img height="16" alt="天极网摘" src="http://www.extjs.org.cn/misc/digest/yesky.gif" width="16" border="0">天极</A>
     <a href="javascript:d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(wozhai=window.open('http://www.wozhai.com/wozhai/Cento.asp#t='+escape(d.title)+'&amp;u='+escape(d.location.href)+'&amp;c='+escape(t),'wozhai','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));wozhai.focus();"><img height="16" alt="我摘" src="http://www.extjs.org.cn/misc/digest/wozhai.gif" width="16" border="0">我摘</A> 
     <a href="javascript:d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&amp;u='+escape(d.location.href)+'&amp;c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();"><img height="16" alt="天天网摘" src="http://www.extjs.org.cn/misc/digest/365key.gif" width="16" border="0">天天</A> 
     <a href="javascript:t=document.title;u=location.href;e=document.selection?(document.selection.type!='None'?document.selection.createRange().text:''):(document.getSelection?document.getSelection():'');void(open('http://bookmark.hexun.com/post.aspx?title='+escape(t)+'&amp;url='+escape(u)+'&amp;excerpt='+escape(e),'HexunBookmark','scrollbars=yes,width=700,height=600,left=80,top=80,status=yes,resizable=yes'));"><img height="16" alt="和讯网摘" src="http://www.extjs.org.cn/misc/digest/hexun.gif" width="16" border="0">和讯</A> 
     <a href="javascript:u=location.href;t=document.title;c = '' + (window.getSelection?window.getSelection():document.getSelection?document.getSelection():document.selection.createRange().text);var url='http://cang.baidu.com/do/add?it='+encodeURIComponent(t)+'&amp;iu='+encodeURIComponent(u)+'&amp;dc='+encodeURIComponent(c)+'&amp;fr=ien#nw=1';window.open(url,'_blank','scrollbars=yes,width=700,height=600,left=75,top=20,status=yes,resizable=yes'); void 0"><img height="16" alt="百度搜藏" src="http://www.extjs.org.cn/misc/digest/baidu.gif" width="16" border="0">百度</A> 
     <a href="javascript:d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://my.poco.cn/fav/storeIt.php?t='+escape(d.title)+'&amp;u='+escape(d.location.href)+'&amp;c='+escape(t)+'&amp;img=http://www.h-strong.com/blog/logo.gif','keyit','scrollbars=yes,width=500,Height=700,status=yes,resizable=yes'));keyit.focus();"><img height="16" alt="POCO网摘" src="http://www.extjs.org.cn/misc/digest/poco.gif" width="16" border="0">POCO</A> 
     <a href="javascript:location.href='http://del.icio.us/post?&amp;url='+encodeURIComponent(location.href)+'&amp;title='+encodeURIComponent(document.title)"><img height="16" alt="Del.icio.us" src="http://www.extjs.org.cn/misc/digest/delicious.gif" width="16" border="0">Del.icio.us</A> 
     <a href="javascript:location.href='http://www.google.com/bookmarks/mark?op=add&amp;bkmk='+encodeURIComponent(location.href)+'&amp;title='+encodeURIComponent(document.title)"><img height="16" alt="Google书签" src="http://www.extjs.org.cn/misc/digest/google.gif" width="16" border="0">Google</A> 
     <a href="javascript:d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(live=window.open('https://favorites.live.com/quickadd.aspx?marklet=1&amp;mkt=en-us&amp;url='+escape(d.location.href)+'&amp;title='+escape(d.title)+'&amp;top=1','live','scrollbars=yes,status=yes,resizable=yes'));live.focus();"><img height="16" alt="Windows Live" src="http://www.extjs.org.cn/misc/digest/live.gif" width="16" border="0">Live</A> 
     <a href="javascript:d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(vivi=window.open('http://myweb.cn.yahoo.com/popadd.html?url='+encodeURIComponent(location.href)+'&amp;title='+encodeURIComponent(document.title),'yahoo','scrollbars=yes,width=700,height=600,left=75,top=20,status=yes,resizable=yes'));vivi.focus();"><img height="16" alt="Yahoo书签" src="http://www.extjs.org.cn/misc/digest/yahoo.jpg" width="16" border="0">Yahoo</A>
    </div>
    <?php
	}
    ?>
    </div>

加入到其他cms也是类似的原理.

PHP, 网站应用 ,

target=”_blank” for primary links(drupal 5.5)

2009年3月23日
574 views 没有评论

最近主站(extjs.org.cn)新开了一个论坛,在主页的 primary links 上新加了一个 links ,是链接到论坛的.但drupal默认是不能设置其中一个以 target=”_blank” 方式打开一个新窗口的,查看了一下模板primary links部分的代码.

1
2
3
<?php if (isset($primary_links)) { ?>
<?php print theme('links', $primary_links, array('class' =>'primary_links')) ?>
<?php } ?>

其实我们要做的也很简单,想法就是以http开头的都以新的窗口形式打开.也就是把生成后的源代码将 ‘href=”http://’ 替换成 ‘target=”_blank” href=”http://’就可以了. 以下是简单修改后的代码.

1
2
3
4
<?php if (isset($primary_links)) { ?>
<?php $primary_links_str = theme('links', $primary_links, array('class' =>'primary_links')) ?>
<?php print str_replace( 'href="http://', 'target="_blank" href="http://', $primary_links_str); ?>
<?php } ?>

其他模板的写法可能会有一些不一样,但思路是一样的.

网站应用 , ,

Discuz7.0 utf-8 标题80字符限制解决方案

2009年3月2日
1,251 views 没有评论

完美解决discuz7.0 utf-8版帖子标题只有26个字以上却报告超过80字符警告的问题!

以前曾有人发过类似帖子,但没有做到完美解决,现在发布出来,以解决大家疑难!
以下是修改步骤:
以下修改都是相对论坛根目录的路径,也就是你上传到服务器的路径
include文件夹里面的js文件夹里面的post.js
查找

} else if(mb_strlen(theform.subject.value) &gt; 80) {

将80改为255
下面一行的

s = '您的标题超过 80 个字符的限制。';

将80 改为85
修改后的样子

} else if(mb_strlen(theform.subject.value) &gt; 255) {
                s = '您的标题超过 85 个字符的限制。';

—————————————
include文件夹js文件夹里面的viewthread.js
查找

} else if(mb_strlen(theform.subject.value) &gt; 80) {
dalert('您的标题超过 80 个字符的限制。');

参照上一个文件,改为下面的样子即可

        } else if(mb_strlen(theform.subject.value) &gt; 255) {
                dalert('您的标题超过 85 个字符的限制。');

——————————-

include文件夹里面的post.func.php
查找

if(strlen($subject) &gt; 80) {

将80改为255
成为

if(strlen($subject) &gt; 255) {

modcp文件夹里面的editpost.inc.php
查找

if(strlen($subjectnew) &gt; 80) {

将80 改为255,也就是

if(strlen($subjectnew) &gt; 255) {

templates文件夹下的default文件夹里面的messages.lang.php
查找

'post_subject_toolong' =&gt; '对不起,您的标题超过 80 个字符,请返回修改标题长度。',

将80改为85,也就是

'post_subject_toolong' =&gt; '对不起,您的标题超过 85 个字符,请返回修改标题长度。',

templates文件夹下的default文件夹里面的wap.lang.php
查找

'post_subject_toolong' =&gt; '标题超过80字节',

将80改为85,也就是

'post_subject_toolong' =&gt; '标题超过85字节',

——————————
修改完后,以管理员身份进入论坛后台,找工具,数据库—-“升级”
输入:

ALTER TABLE `cdb_threads` CHANGE `subject` `subject` VARCHAR(255) NOT NULL;
ALTER TABLE `cdb_posts` CHANGE `subject` `subject` VARCHAR(255) NOT NULL;

成功后,再更新一下缓存,即可,然后自己发一个标题字数为85个字的帖子试验一下,就可以了!
注意:
255就已经是最大数字了,不要再大过255,
如果认为,标题不需要85个汉字,可以将其中的80改为你自己想要设定的数字,而以上修改中出现的255,就相应的改为你限定的数字再乘3即可,如
你想要40个汉字,那么,凡是在修改中出现85的地方,改成40,凡是在修改中出现255的地方,改成120,就可以了。

演示网站:http://www.gedua.com/bbs

演示帖子
本论坛标题最大八十五汉字演示帖本论坛标题最大八十五汉字演示帖本论坛标题最大八十五汉字演示帖本论坛标题最大八十五汉字演示帖本论坛标题最大八十五汉字演示帖一二三四五六七八九十

http://www.gedua.com/bbs/viewthread.php?tid=1243&extra=

文件下载:
80字符限制修改for7.0gedua.com.rar

原文:

http://www.discuz.net/viewthread.php?tid=1162568

网站应用 ,

迁移drupal用户到discuz7(ucenter)

2009年2月27日
1,234 views 3 条评论

extjs.org.cn是用drupal来做论坛的,真他妈的不好用了. 被逼无耐,只好安装了个现在国内最多人使用,功能强大的discuz7.现在问题来了,以前的注册用户你总不能让用户再注册一次吧?没有办法,只能把原来drupal上的所有注册用户都迁移到discuz7上.

由于我的论坛跟drupal在同一个服务器,只是在不同的数据库服务器上,操作办法非常简单.只需一条sql语言即可搞定.

在导入用户之前你必须了解discuz7(ucenter)用户的加密算法.

discuz7(ucenter)用户的加密算法: md5密码后,再加上一个随机6位数,再md5一次.如下sql

1
SELECT md5(concat(md5('mypassword'),'extjs.')) AS pass

‘mypassword’ 为用户密码,’extjs.’为随机的6位数(其实不一定要随机,只要6位就可以了).

完整的迁移用户名密码的sql如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
INSERT INTO discuz7.cdb_uc_members 
	( 
	username, 
	password, 
	email, 
	myid, 
	myidkey, 
	regip, 
	regdate, 
	lastloginip, 
	lastlogintime, 
	salt, 
	secques
	)
SELECT name,md5(concat(pass,'extjs.')) AS pass
	,mail,'','','hidden',created,0,0,'extjs.',''
FROM drupal.users WHERE name != 'fatjames' AND name!= 'extjs.org.cn'

DataBase, 网站应用 , , ,

安装设置Discuz7 源代码高亮

2009年2月24日
1,411 views 1 条评论

经过几个小时的苦战,终于搞定了Discuz7.0的源代码高亮了.还是要呼吁康盛创想能提供这个功能.当然还是要借助强大的SyntaxHighlighter来做了.请一定要下载(GBK版本,UTF8版)这个修改过的,否则会出现换行符.
效果图如下:

discuz7代码高亮

discuz7代码高亮

修改文件:
1./templates/default/discuzcode.htm(修改代码框展现样式)
2./templates/你的风格/header.htm (增加dp.SyntaxHighlighter脚本)
3./templates/你的风格/foot.htm (增加dp.SyntaxHighlighter脚本)
4./include/discuzcode.func.php(修改代码语法标签的解析)
5./include/js/post.js(修改代码语法标签的插入命令)
具体安装:
一./templates/default/discuzcode.htm(修改代码框展现样式)
查找:
function tpl_codedisp($discuzcodes, $code) {
}–>
<!–{block return}–><div class=”blockcode”><div id=”code$discuzcodes[codecount]“><ol><li>$code</ol></div><em onclick=”copycode($(‘code$discuzcodes[codecount]‘));”>{lang discuzcode_copyclipboard}</em></div><!–{/block}–>
<!–{eval return $return;}–>
<!–{eval
}
在这个函数的前面增加:
function tpl_codecsh($discuzcodes, $code, $lang) {
}–>
<!–{block return}–><code id=”code$discuzcodes[codecount]“><pre name=”code” class=”$lang”>$code</pre></code><!–{/block}–>
<!–{eval return $return;}–>
<!–{eval
}
二./templates/你的风格/header.htm (增加dp.SyntaxHighlighter脚本)
在</head>前添加:
<link href=”plugins/dp.SyntaxHighlighter/Styles/SyntaxHighlighter.css” type=”text/css” rel=”stylesheet” />
<script src=”plugins/dp.SyntaxHighlighter/Scripts/shCore.js” type=”text/javascript”></script>
<script class=”javascript”>
dp.SyntaxHighlighter.ClipboardSwf = ‘plugins/dp.SyntaxHighlighter/Scripts/clipboard.swf’;
</script>
三.打开/templates/你的风格/foot.htm (增加dp.SyntaxHighlighter脚本)
在</body>前添加:
<script class=”javascript” src=”plugins/dp.SyntaxHighlighter/Scripts/shCore.js”></script>
<script class=”javascript” src=”plugins/dp.SyntaxHighlighter/Scripts/shBrushCode.js”></script>
<script class=”javascript” src=”plugins/dp.SyntaxHighlighter/Scripts/shBrushCSharp.js”></script>
<script class=”javascript” src=”plugins/dp.SyntaxHighlighter/Scripts/shBrushPhp.js”></script>
<script class=”javascript” src=”plugins/dp.SyntaxHighlighter/Scripts/shBrushJScript.js”></script>
<script class=”javascript” src=”plugins/dp.SyntaxHighlighter/Scripts/shBrushJava.js”></script>
<script class=”javascript” src=”plugins/dp.SyntaxHighlighter/Scripts/shBrushVb.js”></script>
<script class=”javascript” src=”plugins/dp.SyntaxHighlighter/Scripts/shBrushSql.js”></script>
<script class=”javascript” src=”plugins/dp.SyntaxHighlighter/Scripts/shBrushXml.js”></script>
<script class=”javascript” src=”plugins/dp.SyntaxHighlighter/Scripts/shBrushDelphi.js”></script>
<script class=”javascript” src=”plugins/dp.SyntaxHighlighter/Scripts/shBrushPython.js”></script>
<script class=”javascript” src=”plugins/dp.SyntaxHighlighter/Scripts/shBrushRuby.js”></script>
<script class=”javascript” src=”plugins/dp.SyntaxHighlighter/Scripts/shBrushCss.js”></script>
<script class=”javascript” src=”plugins/dp.SyntaxHighlighter/Scripts/shBrushCpp.js”></script>
<script class=”javascript”>
dp.SyntaxHighlighter.ClipboardSwf = ‘plugins/dp.SyntaxHighlighter/Scripts/clipboard.swf’;
dp.SyntaxHighlighter.HighlightAll(‘code’);
</script>
四./include/discuzcode.func.php(修改代码语法标签的解析)
查找:
function codedisp($code)
在其下添加一个函数:
function codedpdisp($code, $lang) {
global $discuzcodes;
$discuzcodes['pcodecount']++;
$code = htmlspecialchars(str_replace(‘\\”‘, ‘”‘, preg_replace(“/^[\n\r]*(.+?)[\n\r]*$/is”, “\\1″, $code)));
$discuzcodes['codehtml'][$discuzcodes['pcodecount']] = tpl_codecsh($discuzcodes, $code, $lang);
$discuzcodes['codecount']++;
return “[\tDISCUZ_CODE_$discuzcodes[pcodecount]\t]”;
}
查找:
$message = preg_replace(“/\s*\[code\](.+?)\[\/code\]\s*/ies", "codedisp('\\1')", $message);
在其上增加:
$message = preg_replace("/\s*\[code=\"(php|xhtml|sql|js|css|xml|html|jscript|javascript|cpp|c|c++|c#|c-sharp|csharp|delphi|pascal|java|py|python|ruby|rails|ror|vb|vb.net|xslt){1}\"\](.+?)\[\/code\]\s*/ies", "codedpdisp('\\2', '\\1')", $message);
查找:
return $htmlon ? $message : nl2br(str_replace(array("\t", '   ', '  '), array('&nbsp; &nbsp; &nbsp; &nbsp; ', '&nbsp; &nbsp;', '&nbsp;&nbsp;'), $message));
替换为:
    $message = $htmlon ? $message : nl2br(str_replace(array("\t", '   ', '  '), array('&nbsp; &nbsp; &nbsp; &nbsp; ', '&nbsp; &nbsp;', '&nbsp;&nbsp;'), $message));
    for($i = 0; $i <= $discuzcodes['pcodecount']; $i++) {
        $message = str_replace("[\tDISCUZ_CODE_$i\t]", $discuzcodes['codehtml'][$i], $message);
}
    return $message;
(注意:上面的替换其他人的好像和我的不一样.这个替换只供参照)
五./include/javascript/post.js(修改代码语法标签的插入命令)
查找:
</textarea>';
在其下增加:
if (cmd == 'code') {
                str += '<br />Lang: <select id="' + ctrlid + '_param_2">'
     + '<option value="">Choose Language</option>'
                    + '<option value="php">php</option>'
                    + '<option value="xhtml">xhtml</option>'
                    + '<option value="sql">sql</option>'
                    + '<option value="js">js</option>'
                    + '<option value="css">css</option>'
                    + '<option value="xml">xml</option>'
                    + '<option value="html">html</option>'
                    + '<option value="jscript">jscript</option>'
                    + '<option value="javascript">javascript</option>'
                    + '<option value="cpp">cpp</option>'
                    + '<option value="c">c</option>'
                    + '<option value="c++">c++</option>'
                    + '<option value="c#">c#</option>'
                    + '<option value="c-sharp">c-sharp</option>'
                    + '<option value="csharp">csharp</option>'
                    + '<option value="delphi">delphi</option>'
                    + '<option value="pascal">pascal</option>'
                    + '<option value="java">java</option>'
                    + '<option value="py">py</option>'
                    + '<option value="python">python</option>'
                    + '<option value="ruby">ruby</option>'
                    + '<option value="rails">rails</option>'
                    + '<option value="ror">ror</option>'
                    + '<option value="vb">vb</option>'
                    + '<option value="vb.net">vb.net</option>'
                    + '<option value="xslt">xslt</option>'
                    + '</select>';
            }
查找:
if(wysiwyg) {
    if(cmd == 'code') {
     text = preg_replace(['<', '>'], ['&lt;', '&gt;'], text);
    }
    text = text.replace(/\r?\n/g, '<br />');
   }
下面添加:
if (cmd == 'code' && $(ctrlid + '_param_2').value != '') {
                opentag = '[code="' + $(ctrlid + '_param_2').value + '"]';
                text = "\n" + text + "\n";
            }

 

作者: 果子
原文地址: http://www.delphires.com/home/space.php?uid=1&do=blog&id=25

网站应用 ,

使用Windows Live Writer 在你的WordPress博客上发布日志

2009年1月9日
939 views 2 条评论

    博客现在已经成为我们这些网络一族不可缺少的一部分了.大家都会到各个网站上写博客.大都数朋友都是直接登录博客的网站上写博客的.虽然现在的在线编辑器已经发展得很完善了,定时保存,所见即所得,插入图片,表格等功能.但大家用起依然还不是十分流畅.

    现在已经有很多可以离线写博客的软件,Windows Live Writer就是其中的绞绞者之一.

    下面由肥占向大家介绍一下 Windows Live Writer 在 WordPress 博客上写日志的方法.

    1,首先当然就是要下载 Windows Live Writer 这一个软件啦.下载地址: http://download.live.com/writer

     2,要让你的WordPress 博客支持 XML-PRC ,设置方法: WordPress后台 设置->撰写 勾选XML-PRC即可.如下图所示:
WordPress_2009-01-09_124829

    3,安装你下载回来的 Windows Live Writer.安装方法跟MSN的安装方法一样,一直点下一步即可.

    4,安装完成后,会出来一个对话框,您选择哪种日志服务?由于这里我们用的是WordPress不在前三项列表中,我们选择最后一项.如下图:
WindowsLiveWriter_2009-01-09_123931

    5,添加你的日志帐户.如下图:
WindowsLiveWriter_2009-01-09_124137

6,这里会出现自动设置日志帐户,要稍等.见下图:
WindowsLiveWriter_2009-01-09_124310

7,这一步会同现询问是否创建临时日志,点击 "是".
WindowsLiveWriter_2009-01-09_124332

8,你的设置已经完成.这里你可以更改你博客的别名.
WindowsLiveWriter_2009-01-09_124414

9,激动人心的时候开始了,你现在就可以使用 Windows Live Writer 离线写你的博客了.
WindowsLiveWriter_2009-01-09_124703

网站应用

为wordpress的评论加上验证码

2009年1月7日
1,065 views 1 条评论

wordpress的匿名评论如果打开,那垃圾广告真是多不胜数.没办法,只好安装一个评论图形验证码插件来防止这一个问题.
插件下载地址: http://www.theblog.ca/anti-spam

效果图如下:

评论验证码

评论验证码

也可以试一下肥占博客的评论功能.

网站应用