Submitted by gouki on 2010, December 15, 10:34 PM
以下遇到的问题我没有遇到过,不过我经常用IE6打开网站后,突然间就显示该页无法显示,不知道是否类似原因 。。。
症状【并非我自己的问题】:最近发现自有产品的试用系统有些页面在提交时无反应,等了很久之后显示“Internet Explorer 无法显示该网页”错误;类似的还有一些链接点击之后无反应,等了很久之后显示“Internet Explorer 无法显示该网页”错误。更为离奇的是:
- 这个错误无法在开发电脑上重现,试用完全相同的程序和数据,在开发电脑上就完全不会出现错误。
- 使用IE8访问出错,使用IE6或IE7访问时偶尔出现错误,而使用Firefox和Chrome则完全不出错。
牛刀小试
尝试一:是不是IE浏览器脚本兼容性问题?
错误只发生在使用IE浏览器的情况下,是不是IE浏览器和页面上的脚本不兼容造成的?在开发电脑上无法重现错误,可能是因为局域网内使用IE8访 问,实际是运行在IE7模式下,在IE7只偶尔出现错误,因此无法重现。基于这个假设,开始尝试找出是什么脚本导致错误,首先怀疑IE8的XSS过滤机 制,手工关掉IE8的XSS过滤,错误依旧。仍然不死心,也许XSS很顽固,没有真正关掉。所以又将QueryString传递的参数进行编码解码,避免 被浏览器误认为存在XSS攻击,还是没解决。
尝试二:是不是IE浏览器无法处理长路径?
老是怀疑IE浏览器也是有原因的,因为使用Firefox和Chrome时完全不出错,各种证据下IE的嫌疑最大。出错的页面和链接都有一个共同的 特点就是页面的路径比较长,大都在500字符以上,因此怀疑IE8浏览器处理长路径是不是有问题。通过调整程序缩短了页面路径后,错误暂时解决,但仍然有 几个疑点尚未弄明白:
- 为什么IE8必然出错,而IE6和IE7只是偶尔出现错误?
- 为什么在开发电脑上无法重现错误?同样是使用IE8浏览器访问,页面路径长度相同。为了尽可能模拟访问外部服务器的情况,特地修改了本机hosts文件,采用与外部服务器完全一致的域名来访问,仍然不会出现错误,为什么会这样?
重新分析问题的真正原因
上面虽然没有找出问题的真正原因,但也还是有两个收获:通过尝试一可以排除XSS方面原因,而通过尝试二发现了这个错误与页面路径长度有一定的联系。
这个错误仅出现在IE浏览器上,是否是IE浏览器发生错误,导致请求没有发出?通过Fiddler侦听发现,请求其实是发送出去了,但一直没有收到服务器的响应,因此将怀疑的目标转移到服务器上。
在服务器上通过分析IIS日志,发现IIS并没有收到请求,反复测试确认,在服务器上确实没有收到请求。
浏览器发出了请求但服务器端没有收到请求,那么问题一定就出在传输环节,这时突然想起机房前段时间搞了一个白名单过滤系统,问题是不是就出在这个白 名单系统上。如果真的是机房的白名单系统出了问题,那么之前的很多疑团就可以解释清楚了。比如:本地无法重现,是因为本地并没有白名单系统;浏览器发出了 请求,而服务器端没有收到,是因为白名单过滤系统将请求过滤掉了;白名单过滤系统有BUG,导致IE浏览器的长路径请求无法正确处理,而被错误过滤等等。
分析了这么多,疑点都集中到机房白名单过滤系统(以下简称白系统)上,但终归只是猜测而已,还需要更确切的证据来证实。机房不会配合我来调查,更不会透露关于白系统的任何细节(这种系统见不得光),唯一的办法就是找到白系统出错的规律,通过反证的方式来找出证据。
黑盒分析白名单过滤系统
设想一下,如果让我来写一个白系统的话,应该这样来实现:过滤所有的HTTP请求头,分析请求头中的Host属性值(主机头+端口),如果该主机头 在白名单里,则允许通过,否则不允许通过。HTTP请求头可能很长,白系统不需要全部读完请求,只要读取到Host属性值即可。为了提高过滤效率,当 HTTP请求头很长时,白系统可能只读取分析开始的N个字节长度内容,剩下的内容就被丢弃,不进行分析。在这种情况下,如果开始的N个字节长度内没有找到 Host属性值,则该请求就会被白系统过滤掉。
所以白系统是根据HTTP请求头中的Host属性值来进行过滤的,IE浏览器的HTTP请求头格式与Chrome的Http请求头格式不同,特别是 Host属性的位置不同。IE浏览器中Host属性的位置靠后,大约在第七位;而Firefox和Chrome中Host属性的位置靠前,大约在第二位。 当页面路径很长时,Http请求头就会变得很大,这时候如果Host属性在Http请求头中的位置比较靠后,就可能超出了白系统的固定读取的N个字节的范 围,导致该请求被忽略。下面列出几个浏览器的Http请求头内容,供参考:
Chrome的Http请求(Host在第2行)
GET /jxc/Libra.Web.Answer.Frames.FilterWindow.Do.aspx HTTP/1.1
Host: a.unigc.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.55 Safari/533.4
Referer: http://a.unigc.com/jxc/Libra.Web.Answer.Frames.SingleWindow.Do.aspx
Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8
Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3
Cookie: __utmz=50212982.1286891934.38.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)
Firefox的Http请求(Host在第2行)
GET /jxc/Libra.Web.Answer.Frames.FilterWindow.Do.aspx HTTP/1.1
Host: a.unigc.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-CN; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7
Referer: http://a.unigc.com/jxc/Libra.Web.Answer.Frames.SingleWindow.Do.aspx
Keep-Alive: 115
Connection: keep-alive
Cookie: __utma=91684958.649235843.1287212349.1287212349.1287212349.1; __utmz=91684958.1287212349.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)
IE的Http请求(Host在第7行)
GET /jxc/Libra.Web.Answer.Frames.FilterWindow.Do.aspx HTTP/1.1
Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*
Referer: http://a.unigc.com/jxc/Libra.Web.Answer.Frames.SingleWindow.Do.aspx
Accept-Language: zh-cn
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; GTB6.5; EmbeddedWB 14.52 from: http://www.bsalsa.com/ EmbeddedWB 14.52; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.1)
Accept-Encoding: gzip, deflate
Host: a.unigc.com
Connection: Keep-Alive
Cookie: __utmz=50212982.1286891934.38.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)
用Fiddler生成Http请求头来测试,并不断调整Host的位置,最终测试出漕宝机房白系统的读取长度为1470字节。如果Http请求头开 始的1470字节内没有包含Host属性的话,白系统会丢弃掉该请求,造成服务器端收不到该请求,客户端也因为收不到服务器端的响应而显示 “Internet Explorer 无法显示该网页”的错误。
一般来说,网页的Http请求头都不会太大,有些也只是最后的Cookie内容多一点,不会影响白系统的运行。但我们开发的这套企业管理软件的某些 页面使用QueryString方式在页面间传递参数,这样可能导致页面的url地址很长,虽然我们控制了url地址的最大长度(小于1024),但没有 想到这个长度已经超过了机房白系统的处理范围。
特别是页面回发的情况下,请求头中会包含两次Url地址(请求地址和Referer分别一次)。假设url地址有1000字节,Firefox和 Chrome的Host属性在第二位,从开始读取1470字节的话,一定可以读取到Host属性值。而IE则不行,Host属性前面还有Referer属 性(长度1000字节),加上页面路径本身有1000字节长度,Host属性前至少有2000多字节,所以白系统只读取开始的1470字节,是不可能读取 到Host属性,因此请求被白系统过滤,造成客户端点击按钮提交后长时间收不到响应,最后显示“Internet Explorer 无法显示该网页”的错误。
题外话-关于白名单过滤系统
为了提高过滤效率,机房的白名单过滤系统大都采用监听加干扰的方式,一旦发现某客户端有非法请求,就先于服务器给该客户端一个错误的响应,这种情况 下,客户端会很快显示错误信息。但这次的白系统似乎是采用水闸大坝的方式实现(这种方式很低效,以后要考虑换机房),发现非法请求后就丢弃该请求,导致客 户端长期等待响应,最后等待超时,才显示错误。正是这种长时间的等待,才误导我一开始就怀疑是浏览器的问题。
--EOF--
这个问题我没有遇到过,不过我想或许可以参照一样。。。原文来自:http://www.cnblogs.com/rrooyy/archive/2010/12/09/1901304.html,我从没注意过原来host的顺序还会影响网站的访问(白名单这个问题确实很让人痛苦。以前我的SERVER还被edong装过一个组件,用来处理白名单)
PHP | 评论:0
| 阅读:16878
Submitted by gouki on 2010, December 14, 6:28 AM
最近也正在做shopnc的重构,当然也就有自己的想法喽。偶尔看到这篇文章,乐死,估计所有重构过代码的人都会有类似想法吧。
原文来自:http://www.cnblogs.com/XmNotes/archive/2010/12/13/1904377.html
我在这里,就列举一下Refactorman的种种死法,以警后人:
一、一边重构,一边要完成日常任务……
1. 疲于奔命,过劳而死。
2. 吃领导给的鸭梨太大被噎死。
3. 满脑子都是代码,在上班路上不留神撞上了宝马。
4. 冷落了女友,受失恋打击跳楼而死。
5. 无暇社交,不懂人情世故,失意而死。
6. 为了说服领导和同事,心力交瘁而死。
二、重构过程中……
7. 被以前的混账代码气死。
8. 被混账代码搞得大脑程序溢出,彻底崩溃,神智错乱而死。
9. 终于醒悟,问题只是冰山一角,力有未逮,忧愤而死。
10. 泥足深陷,举步维艰,进退维谷被活活困死。
11. 自己昏天黑地,看其他同事却吊儿朗当,逍遥快活,心理不平衡致忧郁而死。
12. 重构过程中,踩中前任留下的地雷,被炸得体无完肤而死。
13. 一日偶遇以前代码的作者,怒不可遏,将其一通乱砍,再鞭尸三百,然后切腹而死。
三、经九九八十一难,大功告成……
14. 系统重构后性能提高了?漏洞消除了?对不起,领导们没兴趣,失落而死。
15. 系统重构后出现了新Bug,多半会小题大作,遭游街批斗而死。
16. 马上接到通知系统功能要大升级,吐血而死。
17. 同事依旧我行我素,继续在系统中倒垃圾代码,痛心疾首而死。
18. 重构将系统中的阴暗面曝光,被同事记恨,领导排挤,学屈原投江而死。
19. 过了不多久,发现系统又乱成了一团,比以前好不到哪儿去,悲愤下一头撞死。
20. 离职后偶遇前公司的新任维护者,被其乱刀砍死再鞭尸。
各种死法中,最后一种,我们比窦娥还冤枉。所以强烈推荐大家还要练一门武功以防身。什么武功,就是:“心惊肉跳、杞人忧天、无中生有、力不从 心、行尸走肉、庸人自扰、倒行逆施、废寝忘食、孤形只影、想入非非、呆若木鸡……”。这门传说中的黯然销魂掌,其中一招一式,正是我们最好的写照。
Tags: 重构
Misc | 评论:1
| 阅读:15748
Submitted by gouki on 2010, December 13, 8:28 PM
鉴于明天考试,今天就随便转转了。。。
原文来源:http://os.51cto.com/art/201011/235252.htm
英文原文:http://blog.urfix.com/25-ssh-commands-tricks/
任何一个系统管理员或站长对SSH都不会陌生,这个伟大的技术免去了我们跑去机房管理服务器,或者在远程连接服务器时时刻担心内容被窃取的心惊胆战。本文将为大家介绍25个最佳的SSH命令,如果您还没用过,那么有必要将它们记录一下。
OpenSSH是SSH连接工具的免费版本。telnet,rlogin和ftp用户可能还没意识到他们在互联网上传输的密码是未加密的,但SSH 是加密的,OpenSSH加密所有通信(包括密码),有效消除了窃听,连接劫持和其它攻击。此外,OpenSSH提供了安全隧道功能和多种身份验证方法, 支持SSH协议的所有版本。
SSH是一个非常伟大的工具,如果你要在互联网上远程连接到服务器,那么SSH无疑是最佳的候选。下面是通过网络投票选出的25个最佳SSH命令,你必须牢记于心。
1、复制SSH密钥到目标主机,开启无密码SSH登录
ssh-copy-id user@host
如果还没有密钥,请使用ssh-keygen命令生成。
2、从某主机的80端口开启到本地主机2001端口的隧道
ssh -N -L2001:localhost:80 somemachine
现在你可以直接在浏览器中输入http://localhost:2001访问这个网站。
3、将你的麦克风输出到远程计算机的扬声器
dd if=/dev/dsp | ssh -c arcfour -C username@host dd of=/dev/dsp
这样来自你麦克风端口的声音将在SSH目标计算机的扬声器端口输出,但遗憾的是,声音质量很差,你会听到很多嘶嘶声。
4、比较远程和本地文件
ssh user@host cat /path/to/remotefile | diff /path/to/localfile –
在比较本地文件和远程文件是否有差异时这个命令很管用。
5、通过SSH挂载目录/文件系统
sshfs name@server:/path/to/folder /path/to/mount/point
从http://fuse.sourceforge.net/sshfs.html下载sshfs,它允许你跨网络安全挂载一个目录。
6、通过中间主机建立SSH连接
ssh -t reachable_host ssh unreachable_host
Unreachable_host表示从本地网络无法直接访问的主机,但可以从reachable_host所在网络访问,这个命令通过到reachable_host的“隐藏”连接,创建起到unreachable_host的连接。
7、将你的SSH公钥复制到远程主机,开启无密码登录 – 简单的方法
ssh-copy-id username@hostname
8、直接连接到只能通过主机B连接的主机A
ssh -t hostA ssh hostB
当然,你要能访问主机A才行。
9、创建到目标主机的持久化连接
ssh -MNf <user>@<host>
在后台创建到目标主机的持久化连接,将这个命令和你~/.ssh/config中的配置结合使用:
Host host
ControlPath ~/.ssh/master-%r@%h:%p
ControlMaster no
所有到目标主机的SSH连接都将使用持久化SSH套接字,如果你使用SSH定期同步文件(使用rsync/sftp/cvs/svn),这个命令将非常有用,因为每次打开一个SSH连接时不会创建新的套接字。
10、通过SSH连接屏幕
ssh -t remote_host screen –r
直接连接到远程屏幕会话(节省了无用的父bash进程)。
11、端口检测(敲门)
knock <host> 3000 4000 5000 && ssh -p <port> user@host && knock <host> 5000 4000 3000
在一个端口上敲一下打开某个服务的端口(如SSH),再敲一下关闭该端口,需要先安装knockd,下面是一个配置文件示例。
[options]
logfile = /var/log/knockd.log
[openSSH]
sequence = 3000,4000,5000
seq_timeout = 5
command = /sbin/iptables -A INPUT -i eth0 -s %IP% -p tcp –dport 22 -j ACCEPT
tcpflags = syn
[closeSSH]
sequence = 5000,4000,3000
seq_timeout = 5
command = /sbin/iptables -D INPUT -i eth0 -s %IP% -p tcp –dport 22 -j ACCEPT
tcpflags = syn
12、删除文本文件中的一行内容,有用的修复
ssh-keygen -R <the_offending_host>
在这种情况下,最好使用专业的工具。
13、通过SSH运行复杂的远程shell命令
ssh host -l user $(<cmd.txt)
更具移植性的版本:
ssh host -l user “`cat cmd.txt`”
14、通过SSH将MySQL数据库复制到新服务器
mysqldump –add-drop-table –extended-insert –force –log-error=error.log -uUSER -pPASS OLD_DB_NAME | ssh -C user@newhost “mysql -uUSER -pPASS NEW_DB_NAME”
通过压缩的SSH隧道Dump一个MySQL数据库,将其作为输入传递给mysql命令,我认为这是迁移数据库到新服务器最快最好的方法。
15、删除文本文件中的一行,修复“SSH主机密钥更改”的警告
sed -i 8d ~/.ssh/known_hosts
16、从一台没有SSH-COPY-ID命令的主机将你的SSH公钥复制到服务器
cat ~/.ssh/id_rsa.pub | ssh user@machine “mkdir ~/.ssh; cat >> ~/.ssh/authorized_keys”
如果你使用Mac OS X或其它没有ssh-copy-id命令的*nix变种,这个命令可以将你的公钥复制到远程主机,因此你照样可以实现无密码SSH登录。
17、实时SSH网络吞吐量测试
yes | pv | ssh $host “cat > /dev/null”
通过SSH连接到主机,显示实时的传输速度,将所有传输数据指向/dev/null,需要先安装pv。
如果是Debian:
apt-get install pv
如果是Fedora:
yum install pv
(可能需要启用额外的软件仓库)。
18、如果建立一个可以重新连接的远程GNU screen
ssh -t user@some.domain.com /usr/bin/screen –xRR
人们总是喜欢在一个文本终端中打开许多shell,如果会话突然中断,或你按下了“Ctrl-a d”,远程主机上的shell不会受到丝毫影响,你可以重新连接,其它有用的screen命令有“Ctrl-a c”(打开新的shell)和“Ctrl-a a”(在shell之间来回切换),请访问http://aperiodic.net/screen/quick_reference阅读更多关于 screen命令的快速参考。
19、继续SCP大文件
rsync –partial –progress –rsh=ssh $file_source $user@$host:$destination_file
它可以恢复失败的rsync命令,当你通过VPN传输大文件,如备份的数据库时这个命令非常有用,需要在两边的主机上安装rsync。
rsync –partial –progress –rsh=ssh $file_source $user@$host:$destination_file local -> remote
或
rsync –partial –progress –rsh=ssh $user@$host:$remote_file $destination_file remote -> local
20、通过SSH W/ WIRESHARK分析流量
ssh root@server.com ‘tshark -f “port !22″ -w -' | wireshark -k -i –
使用tshark捕捉远程主机上的网络通信,通过SSH连接发送原始pcap数据,并在wireshark中显示,按下Ctrl+C将停止捕捉,但 也会关闭wireshark窗口,可以传递一个“-c #”参数给tshark,让它只捕捉“#”指定的数据包类型,或通过命名管道重定向数据,而不是直接通过SSH传输给wireshark,我建议你过滤数 据包,以节约带宽,tshark可以使用tcpdump替代:
ssh root@example.com tcpdump -w – ‘port !22′ | wireshark -k -i –
21、保持SSH会话永久打开
autossh -M50000 -t server.example.com ‘screen -raAd mysession’
打开一个SSH会话后,让其保持永久打开,对于使用笔记本电脑的用户,如果需要在Wi-Fi热点之间切换,可以保证切换后不会丢失连接。
22、更稳定,更快,更强的SSH客户端
ssh -4 -C -c blowfish-cbc
强制使用IPv4,压缩数据流,使用Blowfish加密。
23、使用cstream控制带宽
tar -cj /backup | cstream -t 777k | ssh host ‘tar -xj -C /backup’
使用bzip压缩文件夹,然后以777k bit/s速率向远程主机传输。Cstream还有更多的功能,请访问http://www.cons.org/cracauer/cstream.html#usage了解详情,例如:
echo w00t, i’m 733+ | cstream -b1 -t2
24、一步将SSH公钥传输到另一台机器
ssh-keygen; ssh-copy-id user@host; ssh user@host
这个命令组合允许你无密码SSH登录,注意,如果在本地机器的~/.ssh目录下已经有一个SSH密钥对,ssh-keygen命令生成的新密钥可 能会覆盖它们,ssh-copy-id将密钥复制到远程主机,并追加到远程账号的~/.ssh/authorized_keys文件中,使用SSH连接 时,如果你没有使用密钥口令,调用ssh user@host后不久就会显示远程shell。
25、将标准输入(stdin)复制到你的X11缓冲区
ssh user@host cat /path/to/some/file | xclip
你是否使用scp将文件复制到工作用电脑上,以便复制其内容到电子邮件中?xclip可以帮到你,它可以将标准输入复制到X11缓冲区,你需要做的就是点击鼠标中键粘贴缓冲区中的内容。
--EOF--
对于我们这些使用PHP的人来说,SSH命令还是会经常容易用到的,所以,也算做记录喽。
Tags: ssh
Linux | 评论:0
| 阅读:16760
Submitted by gouki on 2010, December 26, 9:19 PM
PHP代码
- header('Cache-control: private, must-revalidate');
- session_cache_limiter("private");
随便记录。。。
PHP | 评论:0
| 阅读:15620
Submitted by gouki on 2010, December 12, 6:14 AM
好象,用过mac的人都感觉那个timemachine是个非常不错的东东,但是在UBUNTU里面可没有内置的工具,搜索了一下google,好象这篇文章介绍了一下,还有两个图片,一下子激动了。突然感觉我那个30G的移动硬盘不够用了(不过看图片上,好象占用的空间不大,准备周一过去尝试)
好吧,传统的来了,摘录,上原文,好象很多人说过我了,说我就是一个摘抄王,哎,每天都没做什么 ,哪有什么经验可以记录呢?所以,只有多看其他的东西,然后如果觉得有用的就记录一下喽。当然如果自己有心得了,也还是会记录的。
又多说了很多废话,顺便上个广告,http://www.thinkinlamp.com上面的每月通讯里面有好多好多不错的文章 。然后,还可以在上面下载一些thinkinlamp聚会时,一些大牛出的PPT以及视频哦。有时候好想下载回来呀。。。(等啥时候有时间了,问问三马看看)。好吧,上原文了。
原文来自:http://maketecheasier.com/time-machine-for-ubuntu-try-timevault-and-flyback/2008/03/07
While most people may feel that backing up the files and system is a troublesome and difficult task, Mac OSX Leopard’s Time machine has made it really simple for its users to use. You just need to plug in your external drive and an initial configuration, the Time machine will then be automated in the background.
In Ubuntu (and other Linux distro), you can also get a Time machine equivalent via Timevault and Flyback.
Both Timevault and Flyback make snapshot of your hard drive at regular interval and allow you to restore the backup in the event that your hard drive crashes, or loss of particular files. Both have a simple graphical interface so its users won’t have to use the command line to backup their system (though you still can’t find the 3D interface in Time machine).
The advantage of Timevault is that it is able to integrate into the nautilus and users can easily access the snapshot and history with a click in their nautilus icon bar. Timevault is not included in the Ubuntu repository, but its installation is made easy with a GDebi installer software package. Installation is a breeze and configuration is quite intuitive, though you have to relogin to your Ubuntu to access to the nautilus integration.
Installation guide [http://howtoforge.com/snapshot-backups-with-timevault-ubuntu-7.10]
Flyback is the lightweight version of Timevault. It does not integrate with nautilus, but it provides a live view of your current snapshot and a previous snapshot. There is no installation required, except for updating some Python libraries.
Installation guide [http://www.howtoforge.com/creating-snapshot-backups-with-flyback-ubuntu-7.10]
Both Timevault and Flyback are free to download and use.
--EOF--
看看,原来人家从UBUNTU 7就有了,而我这个新手却居然还什么 都不知道。哎。OUT了
Tags: timemachine, ubuntu, mac
Linux | 评论:0
| 阅读:20997