博文

[置顶] 中国程序员之现状(2006-7-24 17:43:00)

一个老程序员的心里话--中国程序员之现状
转自 先飞电脑技术资讯网 刘光勇

(本来不想写的,实在不想看到某些人误人子弟,混淆视听,耽误了中国IT的未来,所以一吐为快)

一些人总是发出一些错误的声音,形成了劣胜优汰可怕的现象。他们在误导着中国,把我们的后继军训练成软件蓝领――――胸无大志,目光短浅,稍有点成绩就自满就自高自大的人,浑不知天外有天,外国正在虎视眈眈盯着中国的庞大市场。

由于软件蓝领的呼声人们不再致力于培养大批的高精尖人才,掌握国际尖端技术的人。而是花费心思培训一群猪出来给外国人利用。把自己的命运交给了外国人手里。结果,在最容易的管理软件领域也输给外国人,外国人派几个人过来,利用中国的劳动力,开发出软件,再卖给中国。大量的利润到了外国人手里。而我们的中的一些人还在沾沾自喜:外国人给的工资高;外国的软件好。

奴才!

低品质产品是没人要的。软件蓝领也不例外。

他们不知道中国制造一个优秀程序员的难度,还在患红眼病。程序员制造,你可算过成为一个程序的高昂代价?没日没夜地工作,没有女朋友,感情是一片沙漠,没有钱打工者的命运是悲惨的。

真想知道究竟是哪个公司的程序员为了五十块钱跳槽,是哪个公司说需要软件蓝领。

在马年,过春节,万家欢乐的时候,程序员们还在工作,用他们瘦弱的身躯,支撑起中国的软件工业。

他们把不思进取比喻为工作稳定。

国外可以在一个单位效力几十年。在国内不行。为什么?没有培训,没有上升机会。你被压榨完后就被扔掉。哪个有志向的人甘于这样的命运?

中国的程序员是世界上最好的程序员。他们不计报酬,没日没夜地工作。没有女朋友,没有节假日,可能几年后他们一无所有。他们仍在加班。

一、程序员为什么要跳槽?有两个报道:

1、“程序员为了五十块钱就跳槽”“万元月薪请不动程序员”“20%的程序员跳槽后都去了外企”

2、印度的程序员比中国稳定。

另有两个报道:

1、本科生去美国工作两年后即可年薪10万美元。当然,他们是加薪很快。

2、国外的企业都有培训。很吸引人。许多人是冲着培训去的。

国外可以在一个单位效力几十年。在国内不行。为什么?没有培训,没有上升机会。你被压榨完后就被扔掉。哪个有志向的人甘于这样的命运?

中国的程序员是世界上最好的程序员。他们不计报酬,没日没夜地工作。没有女朋友,没有节假日,可能几年后他们一无所有。他们仍在加班。

有培训,就意味着你不会永远拿着现在的薪水。意味着你在不断进取,不断进步,能力越来越强,你就可以担当越来越重的工作,就可涨工资。给人看到未来。即使你对现在的薪水待遇不满意,你通过自身的辛勤不懈的努力和奋斗,就可达到你要的待遇。你不用嫉妒别人。只要你努力就可达到他甚至超过他。

没培训,意味着不思进取,思想僵化,要被淘汰。没有希望,看不到未来。你注定被淘汰。别人通过拼捕获得的成功你就要嫉妒。因为你永远达不到那个高度。只有暗算他,把他拉下来,你才能达到心理的平衡。

去外企,你可以看到一个光明的前途,你可以不断进步。路越走越宽。你在那个企业工作一段时间后,学到了很多东西。出来后你就是另外一个人。我曾经想去一个企业,不是因为他的工资高,而是他那里有培训,甚至送到国外培训,从他那里出来后可以当总经理。

在国内,你的路会越走越窄,最终无路可走。因为你没有学习,落后于时代,再找到新工作都很难。

国内公司只会大呼疾呼人才难留。他们没想过,他们是如何对待人才的,他们只会残酷剥削,搞政治斗争,整人。

国内公司不去学习别人的先进的管理方法,反倒怨来怨去,浑不去找自己自身的原因。

1、为什么要跳来跳去?

因为在本公司内没有上升机会。

中国程序员是艰苦的,也是聪明的。他们利用一切时间进行学习。就拿我来说,军训完毕后,离计算机机房下班只有十五分钟时间了。一口飞跑到机房,只有十分钟可以学习电脑。就这十分钟,也要利用上。

当他们发现本公司没有培训机会,没有学习机会,可这一切又怎能挡得住前进的脚步?国内公司管理一般是很差的,员工没有成长机会和发展空间。唯一的办法就是跳槽。某人戏称,每跳一次,工资就要加一倍。就拿我来说,每跳一次工资也确实是加一倍。拼命学习获得了知识的高增长,个人的高速进步,这没错。而雇主能看上我,也确实是自己能力已经达到这个水平。但越来最后每跳一次的时间越长。也许是因为进步速度慢了吧。后来又有些后悔,跳来跳去没有根,人到了一定程度就要扎下根来,把一项技术搞透,就需要长时间的积累,反而又踏实下来了。

所以说,那些不断跳来跳去的程序员,其实是仍在初级阶段,到了中级阶段基本就稳定下来了,在某一个细分方向上获得突破。但我建议是,如果不能达到工资翻一倍的水平,或者目标公司没有特别之处,最好不要跳。否则每跳一次,原来积累的人际关系就会丢掉,而技术又没有长足的进步,如此跳来跳去,只会毁了自己,更可能越跳工资越低。到了一定层次后就不能再满足于一些小钱,而是要做事业了。衡量的目标,不是当前多少钱,而是以后会有多少钱。

一般来说,国内公司也没培训,初级阶段获得迅速成长的惟一途径是自我学习跳槽。中级阶段要稳定下来。因为你这时已经到了“高原阶段”,工资也到了高原,精力也没以前充沛,不能再没日没夜加班加点了,也很难再获得突破,要想技术飞速进步只能去国外了。或者自己苦心钻研。现在许许多多的程序员通过自己的努力都到了此阶段。

2、为什么要跳到外企?

外企有信用。让人放心。有培训,有高薪,老板把你当人看,剥削较轻,不像国内企业那样敲骨吸髓。可以找到女朋友。一般可以找到大施身手的空间。但有随时被裁危险。但一般是做得非常开心、顺心。

老板说给你多少钱一般不用担心他会找理由克扣。这样你就可以尽可以放心地大施手脚。


下面列举几个事实,说明为什么要跳到外企:

1、广州惠创软件公http://www.hcweb.com.cn/ ;在广州体育西路。

其老板以前是搞外贸的,发了财。我拿自己的全部代码(我拥有版权的软件),他卖.他老板说,你只能给我打工.你自己去运作,赚了钱,你这个软件开发者和版权拥有者只能拿到40%以下.而且你来到公司三个月后,代码的版权要归公司。

我起身走了。如果我能出国的话,我一辈子都不愿意再回来。

2、广州市小聪软件公http://www.jxc.com.cn

我去之前谈好,我不要工资,我自己独立运作市场和软件开发,他公司只提供一个营业执照,赚钱分给他一半。辛苦了一个月,击败了众多对手后,一个十万元的项目总算有要签合同了。那个老板说,公司调整。你划到市场部。项目的10%拿到市场部,你再从市场部分得点数。(到我手里只有不到5%)。从下个月起,每个月1000块钱工资。你说话不算数,出尔反尔,没信用。我抗议。抗议无效。算工资的话,也行,那你把上个月的1000块钱工资算给我才行。不,上个月没工资。只能从下个月开始算工资。那我走,你把项目的15%提成算给我,这是你定的规定。没有15%,你只能拿5%。如果你现在走,那5%也拿不到。

跟这样的公司混,你有未来吗?我能拼命给他干吗?

我拿起背包头也不回地走了。一分钱也没拿到。找到的新工作是,一个月一万。打工。

我想把项目带走。但客户怕得不到保障。因为我没有公司。最后仍是把项目给了那个进销存公司。

3、晶苑集团。港资企http://www.crystalgroup.com

我对晶苑集团怀着深深的尊敬,并祝晶苑集团南中国电脑部叶富华先生马到成功,新春愉快。

我印象最深的就是外企的信用。

面试时,接待小姐端来一杯茶水。我很感激他们对我这样一个普通程序员的重视。(我去国内公司面试没有一家给我端水的。他们让你先做一份考题。做完了你回去等通知。后来我有经验了,去之前先问问怎样面试,只要是做题,见不着考官的,一概不去。再后来发展到只要是国内企业的,一概不去。)我的工资是上一份工作的将近二倍。

欣喜若狂。公司有买被子津贴(公司给你买被子)、吃饭补助、住宿补助、加班费(1.5元/小时)。有加班费好啊。拼命加班吧。

每天工作十八个小时到二十个小时。在四个月零十天的工作中,我只休息了一天。其他时间时间每天都像玩命似地。。。没有人逼我们,是我们自愿的。

公司从香港总部派人到大陆对我们进行培训。支出专门的图书经费让我们建立电脑图书馆。请来专门的电脑教师,列出培训大纲,每天对我们进行程序培训。

4、香港迎新丰软件公司。港http://www.welcomeERP.com ;位于广州天河软件园。

我做了四天,什么成绩都没做出来。但公司照给工资不误。午餐费、住宿费、交通费、保险费都给了我。很有信用。这样的公司,员工不会说它的坏话。只会尊敬、热爱和拥戴这个企业。

老板很好。我们只要使他的资本达到20%的利润率就行了。

5、矩元鞋业。台资。

月薪8000请了个程序员(这个程序员不是我,我没有那么菜)。不知什么原因,反正做了两个月什么也没做出来。公司虽然大呼上当:-),但仍然是客客气气地付了一万六给他。这份胸襟,试问哪个国内企业能做得到?

结论:

国外企业已经完成原始积累,所以剥削相对轻很多,给员工的空间也较大。国内的企业还正在进行原始积累,进行疯狂压榨。正如资本论所说,只给你基本的生活费,其他的全部被老板拿走。“每一个毛孔都滴着血和肮脏的东西”。那两个国内公司,也滴尽了无数程序员的血泪。

不说了。空喊口号没用。还是克隆微软,克隆人家的管理方式来得实在。把我们玩弄于股掌之上,说给我们加薪加薪再加薪全部算下来我拼命赚钱的95%都被你拿走多一分都不给我,说给我股票给我们期权可没一样能兑现,你说给我们多少工资我时刻都要提防你克扣工钱。你太贪婪,恨不得把全部拿过去,全部占为己有,不给我们留下一点活路。

你喊多少口号都没用。我幸而生在这个加入WTO的社会,要在以前,我早被你整死了。我入外企我光荣。我逃脱魔掌我光荣。“士为知己者死”,你不要怪我们去外企。不能因为你生在中国我们就活该被你整死。你是土老财,我们是被解放军解放的翻身作主的奴隶。

二、程序员工资太高?

你们在花前月下亲那柔嫩的红唇的时候,我们在做什么?你们在剥开女孩子衣服共度良宵的时候,我们在做什么?你们在唱歌跳舞纵情享乐的时候,我们在做什么?你们在争风吃醋大打出手的时候,我们在做什么?你们在给校长送礼的时候,我们在做什么?你们在喝酒猜拳的时候,我们在做什么?

我们在写程序。

如果你把我们的工资和那些好吃懒做在学校泡妞打架毕业后贪污受贿疯狂压榨人民血汗黑心黑手拿黑钱的人进行比较,我只能告诉你,你错了。

你付出了什么,我们付出了什么?

如果因为你的工资只有八百元,看见别人的工资超过你就生气,就要求别人的工资也要向八百元看齐,我只能说,你犯了红眼病了。中国人的劣根就是,不患穷患不均。外国人看到谁有钱就说,啊,我要超过他。中国人说,***,我恨不得把他杀掉!大家都穷,我没意见,如果有谁冒尖我就想把他给拔掉。只想问一句,别人辛苦工作的时候,你干什么去了?

我要说,当一个人,倾毕生精力和心血,把所有东西都倾注于一件事情时,他获得的只是普通人的十倍工资,这太低了。

只拿着几千块钱工资,太少了。拿这点工资想去买一个人的青春和爱恋,这个人太不值得了。

做生意的,当官的,欺压老百姓的,作威作福的,贪污受贿的。

他们不用担心失业,不用担心技术过时,不用担心众多的竞争者。他们不用担心房子,不用担心车子。谁都知道他们一个月不会只有几千块钱那么简单。打工,写程序,是不能同他们比的。一个拥用着程序员的聪明和智慧的人去做那些事情,收入肯定比当程序员强算了,不比了。比起来心痛。

这两个是纵向比较。同地区不同工种这间比较。按劳取酬,多劳多得,我们的所得与所付出的,仍然是不成比例。

再横向比较。同一个劳动力在不同劳动市场上价格的比较,同一工种在不同地区的工资进行比较。

程序员的工资,不是太高,而是太低了。

一个本科生,出国工作两年后就可年薪十万,美元。而我们在为我们伟大的社会主义国家作贡献,只拿着5%的工资。(国外100万,国内才5万)

一个同事到了国外,月薪5000美元,而他在国内才4000人民币。相差十倍。

一个人,排除掉感情因素,他的东西当然是卖给出价高的那个人。这还用问吗?

正如大批的留学生回来。不是我爱国,而是国内的空白多,机会多,发展空间大,所以我们大批地回来。

时代在呼唤,人才的价值在回归,知识的价值在回归。

3、中国需要大量软件蓝领?

我们已经输给了外国,还要在新一轮的竞争中自甘堕落?

1、谁要软件蓝领?

一记者去人才市场向各招聘单位问其需不需要软件蓝领.招聘单位都不明白软件蓝领是什么意思.待记者说明软件蓝领的意思后,各公司都说我们不要。基层人才从来都不缺乏。

一方面是报纸大声呼吁软件蓝领要尽快制造出来,”我们要有大量的低成本的代码工人”,另一方面,企业不要这方面的人才.怪事。是谁大声疾呼需要软件蓝领的?他不知道各大公司都在裁员吗?

面对生产力越来越高的生产工具(软件开发工具),软件蓝领淘汰势在必行。那些学习太慢的白领都会被淘汰掉,更遑论蓝领了。软件蓝领,还没培训出来就已面临灭顶之灾。

软件工厂是不错,但软件工厂的核心不是吞下大量的软件蓝领和人海战术,而是对现有资源的整合和利用,降低现有的生产成本和交易成本.一味嚷嚷要求软件蓝领的企业,只是那些由于管理不善快要被市场淘汰的企业,这样的险恶用心有两个:一是最好不要钱的软件奴隶供驱使,二是将那些正在会成长起来的优秀的人才扼杀在摇篮中,他们成长不起来,就减少了竞争对手。而且由于对他们进行的愚化教育,要他们立志成为软件蓝领。没有了胸怀大志,中国的软件产业才真正危险。

可喜的是,市场将用残酷的市场法则对那些人和那些所谓的软件蓝领进行残酷地淘汰。只有那些真正有领导眼光的魄力的“软件工厂”才会真正建立起来。微软才是软件工厂,他将几十几百人几千人几万人的力量集中在一起,生产出产品,在全世界销售。我们某些“软件工厂”不过是玩概念罢了。玩吧,玩吧,终有死的一天。你会死的很难看。

可喜的是,软件蓝领喊了很久也没见哪个企业招一个,更多的是裁员。

事实证明了蓝领的不适应性。机器排挤人,程序员中也在排挤之列。由于高生产力的开发工具的越来越多的使用,软件开发成本的大幅下降,软件开发越来越自动化,越来越多的人被机器排挤掉。许多由人去完成的事情,现在由机器做的很好,许多程序员被裁下来。(资深程序员应该有这种体会)。

现在所谓的“软件工厂”,最大的危害在于他由于在学生中传播,使许多学生胸无大志,挣两钱就满足,把许多优秀人才扼杀在摇蓝中。

我们需要的是,天才的政治家,整合起一盘散沙的中国,天才的军事家,抵抗外强的侵略。

附:有人由“深圳快找不到蓝领了”而觉得“软件业也快找不到蓝领了”。

深圳快找不到蓝领了。

不错。

他们要找的是什么样的蓝领?是以前概念中的只读完小学二年级,穿着蓝色工装,满身油污,手拿老虎钳的蓝领吗?

不。

他们要精通计算机技术,要精通图纸,要精通制造工艺,要精通机电技术,还要懂英文。这样才能读懂英文说明书,才能看懂图纸,才能编制数控机床所用的计算机程序,才能控制数控机床。而且这些最先进的数控机床使用了目前世界上最先进的技术,因此这个“蓝领”如果几年不跟踪技术趋势他就会发现他不再会使用这些代表着最先进生产力的机器,就会被淘汰掉。

这样的蓝领是一般的所谓的白领能比得上的吗?三个白领也比不上这样一个“蓝领”呀。随随便便大喊一声“我们找不到这样的蓝领”,实在是有失偏颇。有没有想过,在这样一个使用着高技术,掌握着自动化工具蓝领的背后,是多少低技术蓝领的失业?生产制造这样一个蓝领,需要多少金钱和时间?这样的蓝领实在是造价不菲。所以在国外,总工和总经理是一级的,总工的待遇有时比总经理还高。而在国内人多粥少人治环境中,技术人才实在得不到重视。

4、软件工厂

其实,我们真正想要的,不是软件蓝领,而是软件工厂。而且这样的工厂最多只要两个。

当软件生产的管理水平到了一定高度,自会以工厂的形式运作,以大幅降低生产成本。

软件工厂是用来做什么的?

1、生产什么?哪里这么多的订单来维持工厂的运转?

2、软件的零边际成本(即可复制多份而成本几乎为零)。一份软件只需要一份就够的情况下,多个工厂是不是重复开发,浪费资源?这样竞争的结果,顶好是全世界就一家工厂归好,交易成本减少到最小。

中国大规模的重复开发,低水平的重复开发。如果大家团结在一起,组成个工厂,严密组织,分工协作,既提高了生产率,也降低了浪费。

工厂的设立是为了降低交易成本。

软件工业也有生产成本逐渐下降的趋势。只有大规模地群体协作,用工厂这种组织方式能有效地提高生产力,降低交易成本。

工厂的核心不是软件蓝领,而是组织和协作。集中所有人的智慧去做一件事情。大规模地降低生产成本。

中国目前虽然需要软件,但还缺少强有力的组织。可以说,还没发展到工厂的程度。

所以我们曾经有个把中国所有程序员组织起来,像一个大型的软件公司那样运作,做成虚拟软件工厂的想法。但还没做完。

中国的IT确像有些人说的那样,中间人才大量,高精尖人才严重不足。在我看来,基层员工从来就不缺少,由于外国对我们进行技术封锁,所以我们在向前进军的路上很难突破。但我们中间人才正在夜以继日地,在管理和技术领域进行拼搏,向高精尖人才进军。但只要有一个能突围,一定会有大批人相继突围。我们在等待着群体突破的那一天。那一天,从中间领域“制造”出来的大批高精尖人才在国际软件工业叱咤风云,领袖群雄。

五、“淘尽黄沙始见金”,要是再有员工因为工资而“叛逃”的话,不如说一句:由他去吧!

很潇洒。很气派。道理也很对。只是口气有点自大,有点不自量力,而且也写错了。

我记得原文是""千淘万漉虽辛苦,吹尽狂沙始见金。”,出自于《菜根谭》。刘兴波这位仁兄居然用""淘""尽狂沙始见金”,可见是一位炒股高手。妙,妙!只可惜恐怕是人云亦云,如果所猜不错的话,这位仁兄在专家的指示下应该赔了不少。

只是,在人才界,这个恐怕还要改。去的是谁?留下的是什么?

很不幸,去的都是顶尖高手和优秀员工,留下来的只是找不到工作的人。在这个人满为患,就业困难的社会,只有那个顶尖高手和高素质的人,才能自由选择工作单位,才能来去自如,才能到外企工作。留下来的,不是不想走,而是怕找不到新工作。只有那些有本事的人才能“你不把老子当人,老子自会找到把我当人的地方”

借用微软的一句话,那些最优秀的人才永远不会恳求你。

说说两件事。

1、在某软件公司工作期间,深圳一个猎头公司天天打电话来。没错http://www.jpc.com猎头。

2、简历在网上发布几天后,突然接到神秘电话,邀去面试。咦,这个企业我没发过应聘信哪?去面试。几十人济济一堂,集中比赛。这个公司股东中,日本住友银行竟郝然在目。

3、某集团。好像是在某国际排名中占第十六位吧,说,你过来。你可以把你的朋友全都叫过来上班。把你父母也接来。

你以为被挖走的黄沙哪?

“沙中找金(人才争夺)好激烈,拿走黄金留下沙”。黄金以前被拿到美国,现在是拿到外企,留下的都是别人挑剩下来的。对不?

听刘兴波话的人要倒霉了。

今天是2002.2.14,情人节,一个令所有程序员泪如雨下的日子。“只羡鸳鸯不羡仙”,祝天下所有程序员早日结束不吃饭不睡觉的仙人的日子,早日过上鸳鸯的生活。

我拿着钱痛苦流涕:多少钱才能买走我的爱?"


__________________
一只自由自在的鱼


          
 
 
 


阅读全文(2481) | 评论:2 | 复制链接

最完的htaccess文件用法收集整理(2010-12-5 23:13:00)

1.时区设置
有些时候,当你在PHP里使用date或mktime函数时,由于时区的不同,它会显示出一些很奇怪的信息。下面是解决这个问题的方法之一。就是设置你的服务器的时区。你可以在这里找到所有支持的时区的清单。

1.SetEnv TZ Australia/Melbourne 

2. 搜索引擎友好的301永久转向方法
为什么这是搜索引擎友好的呢?因为现在很多现代的搜索引擎都有能根据检查301永久转向来更新它现有的记录的功能。

1.Redirect 301 http://www.aqee.net/home http://www.aqee.net/ 
3. 屏蔽下载对话框
通常,当你下载东西的时候,你会看到一个对话框询问你是保持这个文件还是直接打开它。如果你不想看到这个东西,你可以把下面的一段代码放到你的.htaccess文件里。

1.AddType application/octet-stream .pdf 
2.AddType application/octet-stream .zip 
3.AddType application/octet-stream .mov 
4. 省去www前缀
SEO的一个原则是,确保你的网站只有一个URL。因此,你需要把所有的通过www的访问转向的非www,或者反这来。

1.RewriteEngine On 
2.RewriteBase / 
3.RewriteCond %{HTTP_HOST} ^www.lvtao.net [NC] 
4.RewriteRule ^(.*)$ http://lvtao.net/$1 [L,R=301] 
5. 个性化Error页面
对每个错误代码定制自己个性化的错误页面。

1.ErrorDocument 401 /error/401.php 
2.ErrorDocument 403 /error/403.php 
3.ErrorDocument 404 /error/404.php 
4.ErrorDocument 500 /error/500.php 
6. 压缩文件
通过压缩你的文件体积来优化网站的访问速度。

1.# 压缩 text, html, javascript, css, xml: 
2.AddOutputFilterByType DEFLATE text/plain 
3.AddOutputFilterByType DEFLATE text/html 
4.AddOutputFilterByType DEFLATE text/xml 
5.AddOutputFilterByType DEFLATE text/css 
6.AddOutputFilterByType DEFLATE application/xml 
7.AddOutputFilterByType DEFLATE application/xhtml+xml 
8.AddOutputFilterByType DEFLATE application/rss+xml 
9.AddOutputFilterByType DEFLATE application/javascript 
10.AddOutputFilterByType DEFLATE application/x-javascript 
7. 缓存文件
缓存文件是另外一个提高你的网站访问速度的好方法。

1.<FilesMatch “.(flv|gif|jpg|jpeg|png|ico|swf|js|css|pdf)$”> 
2.Header set Cache-Control “max-age=2592000″ 
3.</FilesMatch> 
8. 对某些文件类型禁止使用缓存
而另一方面,你也可以定制对某些文件类型禁止使用缓存。

1.# 显式的规定对脚本和其它动态文件禁止使用缓存 
2.<FilesMatch “.(pl|php|cgi|spl|scgi|fcgi)$”> 
3.Header unset Cache-Control 
4.</FilesMatch> 
安全问题
下面的htaccess代码能够提高你的web服务器的安全水平。图片链接盗用保护非常有用,它能防止其他人偷盗使用你的服务器上的图片资源。

1. 通过.htaccess放盗链
痛恨那些偷盗链接你的web服务器上的图片资源而耗尽了你的带宽的行为吗?试试这个,你可以防止这种事情的发生。

1.RewriteBase / 
2.RewriteCond %{HTTP_REFERER} !^$ 
3.RewriteCond %{HTTP_REFERER} !^http://(www.)?aqee.net/.*$ [NC] 
4.RewriteRule .(gif|jpg|swf|flv|png)$ /feed/ [R=302,L] 
2. 防黑客
如果你想提高网站的安全等级,你可以去掉下面的几行代码,这样可以防止一些常见恶意URL匹配的黑客攻击技术。

1.RewriteEngine On 
2. 
3.# proc/self/environ? 没门! 
4.RewriteCond %{QUERY_STRING} proc/self/environ [OR] 
5. 
6.# 阻止脚本企图通过URL修改mosConfig值 
7.RewriteCond %{QUERY_STRING} mosConfig_[a-zA-Z_]{1,21}(=|\%3D) [OR] 
8. 
9.# 阻止脚本通过URL传递的base64_encode垃圾信息 
10.RewriteCond %{QUERY_STRING} base64_encode.*(.*) [OR] 
11. 
12.# 阻止在URL含有<script>标记的脚本 
13.RewriteCond %{QUERY_STRING} (<|%3C).*script.*(>|%3E) [NC,OR] 
14. 
15.# 阻止企图通过URL设置PHP的GLOBALS变量的脚本 
16.RewriteCond %{QUERY_STRING} GLOBALS(=|[|\%[0-9A-Z]{0,2}) [OR] 
17. 
18.# 阻止企图通过URL设置PHP的_REQUEST变量的脚本 
19.RewriteCond %{QUERY_STRING} _REQUEST(=|[|\%[0-9A-Z]{0,2}) 
20. 
21.# 把所有被阻止的请求转向到403禁止提示页面! 
22.RewriteRule ^(.*)$ index.php [F,L] 
3. 阻止访问你的 .htaccess 文件
下面的代码可以阻止别人访问你的.htaccess文件。同样,你也可以设定阻止多种文件类型。

1.# 保护你的 htaccess 文件 
2.<Files .htaccess> 
3.order allow,deny 
4.deny from all 
5.</Files> 
6. 
7.# 阻止查看指定的文件 
8.<Files secretfile.jpg> 
9. order allow,deny 
10. deny from all 
11.</Files> 
12. 
13.# 多种文件类型 
14.<FilesMatch “.(htaccess|htpasswd|ini|phps|fla|psd|log|sh)$”> 
15. Order Allow,Deny 
16. Deny from all 
17.</FilesMatch> 
4. 重命名 htaccess 文件
你可以通过重命名htaccess文件来对其进行保护。

1.AccessFileName htacc.ess 
5. 禁止目录浏览
禁止服务器对外显示目录结构,反之亦然。

1.# 禁止目录浏览 
2.Options All -Indexes 
3. 
4.# 开放目录浏览
5.Options All +Indexes 
6. 改变缺省的Index页面
你可以把缺省的 index.html, index.php 或 index.htm 改成其它页面。

1.DirectoryIndex business.html 
7. 通过引用信息来阻止某些不欢迎的浏览者

1.# 阻止来自某网站的用户 
2.<IfModule mod_rewrite.c> 
3. RewriteEngine on 
4. RewriteCond %{HTTP_REFERER} scumbag.com [NC,OR] 
5. RewriteCond %{HTTP_REFERER} wormhole.com [NC,OR] 
6. RewriteRule .* - [F] 
7.  
8.</ifModule> 
8. 通过判断浏览器头信息来阻止某些请求
这个方法可以通过阻止某些机器人或蜘蛛爬虫抓取你的网站来节省你的带宽流量。

1.# 阻止来自某些特定网站的用户 
2.<IfModule mod_rewrite.c> 
3.SetEnvIfNoCase ^User-Agent$ .*(craftbot|download|extract|stripper|sucker|ninja|clshttp|webspider
|leacher|collector|grabber|webpictures) HTTP_SAFE_BADBOT 
4.SetEnvIfNoCase ^User-Agent$ .*(libwww-perl|aesop_com_spiderman) HTTP_SAFE_BADBOT 
5.Deny from env=HTTP_SAFE_BADBOT 
6.</ifModule> 
9. 禁止脚本执行,加强你的目录安全

1.# 禁止某些目录里的脚本执行权限 
2.AddHandler cgi-script .php .pl .py .jsp .asp .htm .shtml .sh .cgi 
3.Options -ExecCGI 

 

转自:http://www.php100.com/html/webkaifa/2010/1205/view_6965.html


阅读全文(1636) | 评论:3 | 复制链接

使用JQuery和ASP打造AutoComplete功能(2009-3-23 12:51:00)

客户端代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>使用JQuery和ASP打造AutoComplete功能</title>
<script type="text/javascript" src="js/jquery-1.2.1.pack.js"></script>
<script type="text/javascript">
 function lookup(inputString) {
  if(inputString.length == 0) {
   // Hide the suggestion box.
   $('#suggestions').hide();
  } else {
   $.post("showmember.asp", {queryString: ""+escape(inputString)+""}, function(data){
    if(data.length >0) {
     $('#suggestions').show();
     $('#autoSuggestionsList').html(unescape(data));
    }
   });
  }
 } // lookup
 
 function fill(thisValue) {
  $('#inputString').val(thisValue);
  setTimeout("$('#suggestions').hide();", 200);
 }
</script>

<style type="text/css">
 body {
  font-family: Helvetica;
  font-size: 11px;
  color: #000;
 }
 
 h3 {
  margin: 0px;
  padding: 0px; 
 }

 .suggestionsBox {
  position: relative;
  left: 30px;
  margin: 10px 0px 0px 0px;
  width: 200px;
  background-color: #212427;
  -moz-border-radius: 7px;
  -webkit-border-radius: 7px;
  border: 2px solid #000; 
  color: #fff;
 }
 
 .suggestionList {
  margin: 0px;
  padding: 0px;
 }
 
 .suggestionList li {
  
  margin: 0px 0px 3px 0px;
  padding: 3px;
  cursor: pointer;
 }
 
 .suggestionList li:hover {
  background-color: #659CD8;
 }
</style>
</head>
<body>
    <div>
   <form>
   <div>
    请输入您的单位名称:
    <br />
    <input type="text" size="30" value="" id="inputString" onkeyup="lookup(this.value);" onblur="fill();" />
   </div>
   
   <div class="suggestionsBox" id="suggestions" style="display: none;">
    <img src="images/upArrow.png" style="position: relative; top: -12px; left: 30px;" alt="upArrow" />
    <div class="suggestionList" id="autoSuggestionsList">
     &nbsp;
    </div>
   </div>
  </form>
 </div>
</body>
</html>

 

服务器端代码:

<%

'unescape()函数

Function VBsUnEscape(str)  
  dim i,s,c
  s=""
  For i=1 to Len(str)
  c=Mid(str,i,1)
  If Mid(str,i,2)="%u" and i<=Len(str)-5 Then
  If IsNumeric("&H" & Mid(str,i+2,4)) Then
  s = s & CHRW(CInt("&H" & Mid(str,i+2,4)))
  i = i+5
  Else
  s = s & c
  End If
  ElseIf c="%" and i<=Len(str)-2 Then
  If IsNumeric("&H" & Mid(str,i+1,2)) Then
  s = s & CHRW(CInt("&H" & Mid(str,i+1,2)))
  i = i+2
  Else
  s = s & c
  End If
  Else
  s = s & c
  End If
  Next
  VBsUnEscape = s
End Function


 on error resume next
 response.Charset="GB2312"

  dim keyword
  keyword=Trim(request.Form("queryString"))
  set rs3=server.CreateObject("adodb.recordset")
  rs3.open "select UserName from [User] where Coname like '%"&VBsUnEscape(keyword)&"%'",conn,1,1
  if rs3.eof and rs3.bof then
  response.Write("没有该会员!")
 else 
 do while not rs3.eof
%>
<li onclick="fill('<%=rs3("UserName")%>');"><%=rs3("UserName")%></li>
<%
 rs3.movenext
 loop
end if
 rs3.close
 set rs3 = nothing
 %>

效果图:



阅读全文(1981) | 评论:0 | 复制链接

(翻译)泛型类型介绍(2008-9-14 16:56:00)

原文:http://en.csharp-online.net/Generic_types

内容:

1、为什么使用泛型?

2、泛型等价

3、专业述语

   3.1、类型参数

   3.2、类型引用

   3.3、开放类型

   3.4、构造类型

   3.5、开放构造类型

   3.6、关闭构造类型

4、基于类型参数的约束

5、泛型类

6、泛型接口

    6.1、定义一个泛型接口

7、泛型委托

完整的翻译请浏览:http://www.cnblogs.com/goalbell/articles/Csharp_Generic_Types_Introduction.html


阅读全文(1480) | 评论:0 | 复制链接

DOM操作示例学习PartI(2008-8-14 0:03:00)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  <title>Dom</title>
  <script language="JavaScript">
     function create(){  //创建一个li元素,并把添加到 元素id为domli1之前.
      var domdiv=document.getElementById('domul');
      var domli=document.createElement('li');
      var domlie=document.createTextNode('domli3');
      domli.appendChild(domlie);
      domdiv.appendChild(domli);
      domli.setAttribute('id','domli3');
      domdiv.insertBefore(document.getElementById('domli3'),document.getElementById('domli1'));
   }
   function copy(){ //复制ul元素下所有子元素
    var domul=document.getElementById('domul');
    var newdomul=domul.cloneNode(true);//判断是否有子元素
    newdomul.setAttribute('id','newdomul');
    for (var i = 0; i < document.getElementsByTagName('li').length; i++) {
     document.getElementsByTagName('li')[i].removeAttribute('id'); //去除属性id,不能含有相同标识
    }
    var domdiv=document.getElementById('domdiv');
    domdiv.appendChild(newdomul);
   }
  </script>
 </head>
 <body>
  <div id="domdiv">
   <ul id="domul">
    <li id="domli">
     domli
    </li>
    <li id="domli1">
     domli1
    </li>
    <li id="domli2">
     domli2
    </li>
   </ul>
   
  </div>
  <input type="button" onclick="create();" value="create" />
  <input type="button" onclick="copy();" value="copy" />
 </body>
</html>
下一节就讲下dom事件处理。


阅读全文(895) | 评论:0 | 复制链接

使用ASP创建数组(2008-8-9 11:28:00)

<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%>

<%
 '判断传递的值是否为数组,如果为空的话,就分配一个空数组
  function arrayize(value)
    if isarray(value) then
        arrayize=value
   elseif isEmpty(value) then
        arrayize=array()
   else
        arrayize=array(value)
   end if
  end function        
 
  function [](value)
    []=arrayize(value)
  end function 
%>

<%
  '打印数组
  sub println(line)
     for each l in [](line)
        response.write(l)
      next
  end sub     
%>
<%
'调用println过程
call println(array("BEJ"," OLYMPIC", " GAME"," I"," LOVE"," CHINA"))
%>

结果显示:

BEJ OLYMPIC GAME I LOVE CHINA


阅读全文(1864) | 评论:0 | 复制链接

体验JQuery的Selectors(Part I)(2008-6-19 0:47:00)

    接着上一篇文章,从这篇文章起,开始敲开了学习JQuery的大门了。最后我会分享下JQuery的Cheat Sheet。这里只会介绍些基础的JQuery以及Cure javascript的资料。在以后的学习日子里,我会介绍些面向对象编程知识和C#泛型、算法等基础知识。

   首先来看看$()的特性,这里的作用只不过是用来简便获取标签名的手法,其实可以在javascript的dom方法中可以用document.getElementsByTagName()来获取元素的Tag Name。好了阐述一下$()的使用方法:

     ID:#myid用来获取元素的ID属性。$('#myid'),不管它的Tag Name是什么,匹配唯一元素的ID为myid属性。这里的唯一,依我的理解是相对于ID而言的。例如(省略了相关标签):

   $('#myid').css("border","3px solid #FF0000");
   $("p#myid").css("border","3px solid #000000");

   <p id="myid">Hello World!</p>
   <div id="myid">Hello JQuery!</div>
  
 它执行的结果是作用于显示段落元素p的样式。这个因为在document中,每一个ID仅可以使用一次,并且是唯一的。所以它会首先匹配第一个元素p。

  Class:.myclass用来获取元素的css类名。$('.myid')用来匹配元素中含有myid的css类名。例如:

     $('p.myid').css("border","3px solid #FF0000");
     $('div.myid1').css("border","3px solid #000000");

       <p class="myid">Hello World!</p>
      <div class="myid">Hello JQuery!</div>

它执行结果是分别作用于段落元素p和区域div的css样式。注意这里的class的同类名是允许的。也可以同时获取document中元素的css类名,$('p.myid,div.myid').css("border","3px solid #FF0000");

最后分享一下JQuery的Cheat Sheet:

   

 


阅读全文(1104) | 评论:0 | 复制链接

体验JQuery的万能selectors(2008-6-15 18:26:00)

  用JQuery这个强大而优秀的javascript库做了一个简单的反馈表单,因为这几天都在看JQuery的有关资料,所以接下来的几日,我为陆续介绍下JQuery的有关特性。我都是刚刚开始学的,开始看<<JQuery Reference Guide>>和JQuery官方上的有关文档资料,都是配合起来看效果好很多。看了一下,体验一下JQuery的Selectors特性。

Cure  Code:

         <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=GB2312">
  <title>Simple form</title>
  <script language="JavaScript"  src="lib/jquery/jquery.js"></script>
     <script language="JavaScript">
         $(document).ready(function(){
    $('span#title').css("border","3px solid #FF0000");
    $('p>span').css("border-bottom","1px dotted #000000");
    $('dt>label').css("float","left");
    $('dd>input').css("margin-bottom","5px");
    $('input').css("border","1px solid #333333");
    $('textarea').css("border","1px solid #333333");
    $('fieldset legend').css("font-size","12px");
    $('fieldset legend').css("color","blue");
    $("dl dd:nth-child(even)").append("<span>*</span>").css("color","red");
    
   }); 
     </script>
  </head>
 <body>
  <div id="container"> 
        <span id="title">感谢你访问我们的网站!</span>
     <fieldset>
      <legend>请填写以下表单:</legend>
   <dl>
      <dt><label>你的姓名:</label></dt>
   <dd><input type="text" id="name" /></dd>
   <dt><label>Your company name:</label></dt>
   <dd><input type="text" id="coname" /></dd>
   <dt><label>Your email:</label></dt>
   <dd><input type="text" id="email" /></dd>
   <dt><label>Your address:</label></dt>
   <dd><input type="text" id="addr" /></dd>
   <dt><label>Your tel:</label></dt>
   <dd><input type="text" id="tel" /></dd>
   <dt><label>Your fax:</label></dt>
   <dd><input type="text" id="fax" /></dd>
   <dt><label>Inquiry content:</label></dt>
   <dd><textarea id="content" cols="30" rows="6"></textarea></dd>
    <dd><button id="submit" value="Send">Send</button></dd>
     </dl>

     </fieldset>
  
  </div> 
 </body>
</html>

Summary:在接下来的有关文章,我会逐一介绍有关selectors强大的功能。


阅读全文(969) | 评论:0 | 复制链接

使用ASP.NET2.0建立三层架构的web应用程序系列(2008-4-18 21:03:00)

使用ASP.NET2.0建立三层架构的web应用程序系列Part1

使用ASP.NET2.0建立三层架构的web应用程序系列Part2

使用ASP.NET2.0建立三层架构的web应用程序系列Part3


阅读全文(1767) | 评论:0 | 复制链接

(翻译)ASP.NET的基础知识(2008-3-27 22:41:00)

//------------------------------------------------------------------

翻译:ASP.NET Basics: Foundation of ASP.NET

译者:goalbell

E-mail:goalbell@gmail.com

//------------------------------------------------------------------

以下是来自一些一起合并的资源:

什么是ASP.NET?

Microsoft ASP.NET是一种服务器端的技术,能够使到编程人员建立动态网站、web应用程序,以及XML Web服务。它是.NET基于建立CLR环境上的一部分。因此编程人员可以使用任何.NET兼容的语言来编写ASP.NET代码。

ASP.NET 1.1与ASP.NET 2.0之间有什么区别?

一个包括ASP.NET 1.1与ASP.NET 2.0之间有什么区别的图表可以在这里(http://www.codeproject.com/aspnet/ComparisonASP1xASP20.asp)找到。

哪个是ASP.NET最新的版本?先前发布的版本是什么?

最新的ASP.NET版本是2.0。以下是有三个ASP.NET版本发布的日期:

ASP.NET 1.0 -在2002.1.16发布

ASP.NET1.1-在2003.4.24发布

ASP.NET2.0-在2005.11.7发布

另外,ASP.NET3.5在2007年底试验性地发布。

解释ASP.NET2.0的事件生命周期?(详细参考:http://www.cnblogs.com/me-sa/archive/2008/03/17/LifeCycle.html)

这些事件发生在以下的顺序。最好打开跟踪(tracing)(<% @Page Trace="true"%>)以及跟踪以下的事件:

PreInit - 这个事件代表页面生命周期的入口点。如果你需要以编程的方式(programmatically)改变模版页(Master page)或者主题,然后这会触发该事件。动态控件被创建在这个事件里面。

Init - 在控件集合的每一个控件被初始化。

Init Complete - 页面已初始化以及该处理被完成。

PreLoad - 该事件是在页面的加载完成之前被调用。

Load - 这事件上升到整个页面以及所有的子控件。这些控件属性以及视图(view state)可以在这一阶段被存取。该事件说明控件已被完全加载完毕。

LoadComplete - 该事件信号指示该页面在内存加载完成。它也标记着呈现(render)页面的开始。

PreRender - 如果你需要使到控件或者页面获得任何最后更新,那么使用该事件。它第一使

到页面和所有的控件生效(fires)。

PreRenderComplete - 这明确地声明PreRender状态被完成。

SaveStateComplete - 在这个事件里,该控件目前的状态被完全保存在视图。

Unload - 该事件典型地作为关闭文件以及数据库连接。有时,也会作为记录一些wrap-up任务。

这些事件在ASP.NET2.0已被介绍过了。

你创建一个ASP.NET应用程序。你将会怎样运行它?

随着ASP.NET2.0地到来,Visual Studio来自一个内建ASP.NET开发服务器,用来测试页面。它的功能作为一个本地的Web服务器。仅有的限制是远程机器不能存取运行在本地服务器的页面。第二点是部署一个Web应用程序到一台运行IIS 5或者IIS6或者IIS7的电脑。

解释ASP.NET的AutoPostBack的特性?

当事件被触发时,AutoPostBack允许控件自动地回送。例如:如果我们拥有一个Button控件以及想要该事件回发到服务器端,那么我们可以设置Button控件的AutoPostBack属性为True。

怎样使到AutoPostBack失效?

之所以能够使到AutoPostBack在ASP.NET页面失效,是通过使在页面所有控件的AutoPostBack失去功能。AutoPostBack是通过页面控件引起的。

在ASP.NET2.0中不同的可用代码模型是什么?

在ASP.NET2.0有两种可用的代码模型。一个是single-file页面,另外一个是code-behind页面。

web form继承自哪个基类?

页面类在System.Web.UI命名空间(namespace)当中。

有哪些新的特定文件夹在ASP.NET2.0被介绍呢?

有7个新的文件夹在ASP.NET2.0被介绍:

\App_Browsers 文件夹 - 保存识别浏览器及其性能的定义文件(.brower)。

\App_Code文件夹 - 包含设置在该文件夹自动编译的源代码(.cs,.vb)文件。另外设置web服务文件产生一个代理类(扩展名WSDL)以及一个强类型的dataset)(扩展名XSD)。

\App_Data文件夹-包含像.mdf(Sql Express文件),.mdb,XML等数据存储文件。该文件夹存储本地数据库来维持membership和role的信息。

\App_GlodbalResources文件夹 - 包含设置在该文件夹自动编译的资源文件集合(.resx)。在早期的版本,我们必需手动使用resgen.exe工具来编译资源文件。这些文件可以在应用程序当中被全局存取。

\App_LocalResources文件夹- 包含被指定页面或者控件使用的资源文件集合。

\App_Themes文件夹 -这个文件夹包含.css和.skin文件来定义web页面和控件的外观。

\App_WebReferences文件夹 - 取代预先使用的Web References文件夹。这个文件夹包含.disco,.wsdl,.xsd文件,当存取远程的web服务时,被产生。

待续...

 

 


阅读全文(1857) | 评论:0 | 复制链接