随笔-12  评论-41  文章-0  trackbacks-0
  置顶随笔
公司还不错,做的项目也很有意思,要是您有兴趣欢迎投简历。

工资(税后):6k ~ 7k (根据个人能力可能更高)
招聘人数:2人
待遇:国家法定节假日、年底双薪、保险
公司地址:北京海淀区上地 (距离西二旗城铁10分钟)
简历请发送到:flower.b◎tofo.net (请注明薪水或其他要求)

岗 位 职 责
1、负责tiao.net网站程序、数据库的开发工作;
2、负责对tiao.net及相关项目进行代码优化、功能维护、性能维护;

任 职 条 件

1、两年以上ASP.NET网站项目开发经验 (不包括 OA、办公自动化等内部系统);
2、精通ASP.NET(C#)编程开发;
3、熟悉掌握JavaScript、HTML、CSS 等相关技术;
4、精通MS SQL SERVER,熟悉掌握存储过程、触发器;
5、良好的团队开发意识、思维活跃,能快速接受新事物,能积极主动学习Web软件开发
相关新技术;
6、热爱软件开发工作,熟悉软件开发流程,有良好的技术文档习惯,具有规范化,标
准化的代码编写习惯;
7、良好的团队开发意识,较强的学习能力,认真负责的工作态度;
8、有手机网站开发经验者优先考虑;

http://search.51job.com/jobsearch/show_job_detail.php?id=(36468933)

(代友招聘)
posted @ 2007-12-06 22:02 flower.b 阅读(627) | 评论 (5)编辑
  2007年12月25日

—— 仅以此文记录我记忆中的2007


一、学习
    a.看过或正在看的书:《Javascript高级程序设计》、《Don't Make Me Think》、《Effective C#中文版》、《数据结构》、《数据挖掘-实用机器学习技术》、《SUSE Linux 10宝典》、《音频信息处理技术》、《你在为谁工作》、《哈利·波特与死亡圣器》 
    b.尝试在Linux MONO环境下开发了.Net程序(IDE频繁挂掉,不得不放弃)

二、工作
    从程序员到项目经理。(多谢老板的器重)
    第一次接触到手机网站(比想象的简单很多)
    在公司一年年半了,熟悉了公司的环境,正在向“老油条”过度。

三、生活
    a.从坐车上班到骑车上班
    b.从3个人的房间,办到了一个人的房间(回到了2006年上半年的状态)。
    c.又老了一岁,仍然没有GF(可悲~

四 、理财
    a.2007年我的工资共上涨了 60%。
    b.拥有了第一张金卡、第二张信用卡。
    c.将储蓄变成了基金(10月后资产缩水)

五、遗憾
    a.仍然没有学好英语。
    b.格言“努力·赞美·忍耐”很多时候没有遵守(独创格言,如有雷同纯属巧合)。

    回首一年,值得欣慰的是自己还有一定的学习动力,其次是工资提高生活质量有所提高(其实是花钱更大手大脚了)。工作中有开心也有郁闷,感谢老板的器重,做一些管理工作对自己是很大提高,当然也更累了,时间总过得很快。基金从30%的收益到-10%让我知道了“投资有风险”的不变格言。我尝试把自己做程序员时的一些想法变成项目管理的方法,一些被证明是错误的,自己管理知识的匮乏,也只能做个50分的项目经理。每每工作不开心的时候,翻开《你在为谁工作》看两章能够舒缓心情。

    展望2008,英语、数据挖掘、项目管理 是学习的方向与重点。“努力·赞美·忍耐”是人生态度。不在看重薪水,业余时间放在自己的项目上。试水股市。

posted @ 2007-12-25 22:01 flower.b 阅读(83) | 评论 (6)编辑
  2007年12月6日
公司还不错,做的项目也很有意思,要是您有兴趣欢迎投简历。

工资(税后):6k ~ 7k (根据个人能力可能更高)
招聘人数:2人
待遇:国家法定节假日、年底双薪、保险
公司地址:北京海淀区上地 (距离西二旗城铁10分钟)
简历请发送到:flower.b◎tofo.net (请注明薪水或其他要求)

岗 位 职 责
1、负责tiao.net网站程序、数据库的开发工作;
2、负责对tiao.net及相关项目进行代码优化、功能维护、性能维护;

任 职 条 件

1、两年以上ASP.NET网站项目开发经验 (不包括 OA、办公自动化等内部系统);
2、精通ASP.NET(C#)编程开发;
3、熟悉掌握JavaScript、HTML、CSS 等相关技术;
4、精通MS SQL SERVER,熟悉掌握存储过程、触发器;
5、良好的团队开发意识、思维活跃,能快速接受新事物,能积极主动学习Web软件开发
相关新技术;
6、热爱软件开发工作,熟悉软件开发流程,有良好的技术文档习惯,具有规范化,标
准化的代码编写习惯;
7、良好的团队开发意识,较强的学习能力,认真负责的工作态度;
8、有手机网站开发经验者优先考虑;

http://search.51job.com/jobsearch/show_job_detail.php?id=(36468933)

(代友招聘)
posted @ 2007-12-06 22:02 flower.b 阅读(627) | 评论 (5)编辑
  2007年4月10日

作为一个G迷,看到发生Google输入法门事件,非常痛心。
在自己的环境中无处不在的盗版让我早已习惯,大到操作系统、数据库,小到用户控件、编辑器(EditPlus)。
对于谷歌两名中国程序员来说用盗版词库或者说破解词库应该是件很COOL的事情。高学历弥补了自身的版权意识淡薄蒙蔽了李博士的“慧眼”。
作为.NET开发者你用了多少盗版?
以下是我用的:
Windows2003、Sql Server2000/2005、Visual Studio 2003/2005、ComponentArt WebUI、CodeSmith、VisualSVN、Flex、Office、Dreamweaver、PhotoShop、VMware、HttpWatch、EditPlus、FlashFXP、金山词霸、WinRar

posted @ 2007-04-10 22:21 flower.b 阅读(289) | 评论 (6)编辑
  2007年4月6日
     摘要: 网站经常被这样的错误日志困扰。部分使用(我使用的TT版本没有发现问题)腾讯的用户,更是无法正常使用网站功能。
System.Web.HttpException: The state information is invalid for this page and might be corrupted. ---> System.Web.UI.ViewStateException: Invalid viewstate.
  阅读全文
posted @ 2007-04-06 14:51 flower.b 阅读(371) | 评论 (0)编辑
  2007年3月15日

危害:可构造特殊SQL语句注入动网论坛
测试环境:Dvbbs 7.1.0 Sql版 Sp1 20051114 (到目前2007年3月15日为止最新版本)
实施条件:有论坛后台管理论坛基本信息的权限。(怎么获得?自己想吧)
write by :flower.b
漏洞原因:动网论坛中有很多自动发送PM的地方,很多地方都没有做参数的过滤就直接构造了SQL语句,如:

'文件 reg.asp
   If Dvbbs.Forum_Setting(46)="1" Then
    
'发送注册短信
    Dim sender,title,body,UserMsg,MsgID
    sender
=Dvbbs.Forum_Info(0)
    title
=Dvbbs.lanstr(2)&Dvbbs.Forum_Info(0)
    body 
= template.html(18)
    body 
= Replace(body,"{$Forumname}",Dvbbs.Forum_Info(0))
    sql
="insert into dv_message(incept,sender,title,content,sendtime,flag,issend) values('"&username&"','"&sender&"','"&title&"','"&body&"',"&SqlNowString&",0,1)"
    Dvbbs.Execute(sql)
    
Set rs=Dvbbs.execute("select top 1 ID from [Dv_message] order by ID desc")
    MsgID
=rs(0)
    Rs.close:
Set Rs=Nothing
    UserMsg
="1||"& MsgID &"||"& sender
    Dvbbs.execute(
"UPDATE [Dv_User] Set UserMsg='"&Dvbbs.CheckStr(UserMsg)&"' WHERE UserID="&Dvbbs.userid)
End If

上面代码中的 sender,title,body 虽然不是用户输入的内容,但配置文件中的字符串就一定没有问题不用过滤?
此时只要有后台的管理权限,修改下论坛的标题或注册注册消息的模板....嘿嘿。

同样的问题,还出现在 savepost.asp 中的用户订阅短消息更新提示部分:
Dvbbs.Execute("insert into dv_message(incept,sender,title,content,sendtime,flag,issend) values('"&Rs(3)&"','"&Dvbbs.Forum_info(0)&"','"&template.Strings(26)&"','"&mailbody&"',"&SqlNowString&",0,1)")

解决办法:对这些变量增加 Dvbbs.CheckStr() 过滤后再构造SQL。

后记:动网论坛的注入漏洞层出不穷,与日月同辉。自从SQL注入这门编程“新科学”,被小猪之流在中国发扬光大,动网论坛是所有系统中被爆SQL注入最多、最严重、波及范围最广的ASP网站程序。动网论坛最烂?不是,动网论坛做为结构话编程来说论坛已经太大了!向上面两个地方在使用ADO.NET中的参数方法完全可以避免,但是动网论坛的这种方式,仅依靠程序员个人能力,小心、小心+小心,根本注意不过来这么大的系统,也就不可避免的出现各种各样的注入漏洞。动网论坛做为国内ASP编程的领军人,应该把ASP向面向对象方向发展了!而不是去做什么并不占优势的PHP版!(沙滩的市场是怎么考虑的?)

posted @ 2007-03-15 13:18 flower.b 阅读(324) | 评论 (0)编辑
  2006年12月5日

听书网 差异化、人性化取胜

中国首个,出现在线完全免费收听有声图书。

中国首个,为有声图书提供同步字幕功能。

中国首个,实际应用在线语音评论功能。

待续...

posted @ 2006-12-05 14:16 flower.b 阅读(211) | 评论 (1)编辑
  2006年7月2日
     摘要: 正值公司新项目开始之际,初学CodeSmith创建一个数据库文档模板。
其实CodeSmith的例子中已经带了一个数据库模板DBDocumenter(Jason Alexander),但是它是多个html文件、图片、样式,文件过多比较乱,跟其他同事分享也不方便。(MyGeneration 中数据库文档是单HTML文件,但是颜色难看,多表时也不方便)。
这个模板生成只有一个HTML文件,使用 “display” 代替 DBDocumenter 中“iframe”效果。  阅读全文
posted @ 2006-07-02 00:00 flower.b 阅读(311) | 评论 (0)编辑
  2006年3月25日
     2003年10月20日入职,到今天2006年3月25日887天。

     宽联是我的第一份正式工作,有着很多感慨与情感。两年多来送走了n位好友+同事,现在技术部门在职时间排名NO.2的我也即将离开(NO.1是经理Sam)。越是即将离开越是发现对这里感情逾深,刚到公司那天的情形依稀可见......

    刚到公司那天是星期五(17日)下午,晓帆打电话确认之后我们就到了312,那时的前台是晓华,晓帆本是想找johney,可是他没有在(估计是回深圳了)是pow接待的我跟晓帆。pow给我的印象很和蔼甚至是可爱,给你很大的信任感。随后认识的是金枝,呵呵就是“金枝玉叶”的“金枝”,金枝应该打我几岁,做事很认真严肃。我跟晓帆刚到广州公司又没有提供住宿,是金枝提前帮我们找了便宜的房子。这套房子可真的不错,就在百佳的后面,距离公司5分钟的路,两室一厅,1300/month,要知道这可是在天河北啊~谢谢金枝。第二天在阿森的帮助下我们将前天(16日)带来的行李和一些家私入住新居。

    20日星期一。我被分配到了Tommy的技术部,晓帆在Johney的商务部。Tommy非常年轻,看上去只长我一两岁,现在对他真的很佩服,他很聪明、反应快、思维敏捷,普通技术人员出身到公司高层只几年时间,一句话偶像。当时对Johney的印象不深,后面会讲到。小陶做为我名义上的项目经理,带我与312这边的同事一一做了介绍(而现在已经没有那个新来的同事做这么多一一介绍了,怀念那个时候,真的很有意思),财务部的MM都很漂亮...Ken的普通话还很别扭(Ken可能马上回HK了,还不知道以后能不能再见面)。其他同事当时印象不是很深。前两天过的很无聊,因为我还没有电脑,只能靠一本SQL SERVER2000的图书打发上班时间。

    公司为我和晓帆配好了电脑,我的位子换到了小柯的后面。晓帆去了301商务部。小柯当时刚毕业,在公司做美工。小柯做事还很年轻有时做事不考虑自己的实际情况-也可以说是为朋友两肋插刀。刚到小柯给我了很多帮助,包括中午订饭、公司的一些事情等。我的左边是Polly的助理阎欢,她很成熟跟小柯就是两个极端呵呵。可能因为位子很近,关系都非常不错,她对我也提了很多意见和帮助(像姐姐一样)。
    
    随后又认识了Little、Sam、Jun、重文、李健文、张兴、王海、张建、丁磊(非网易 ^_^) .....

    Little 、Ken及后来的张建都属于系统服务组,负责公司内网外网服务器。因为我负责网盟的技术与他们的接触很多,包括对公、对私都给我了很大帮助。特别是Little 和 Ken !Little 有非常丰富的工作经验,精通Freebsd(Little后来去了GOQO,之后的一件事情可能另他很生气。离开广州时一定会好好请你吃一顿,谢谢你的照顾。)。Ken是香港人又曾在国外留学,英语非常棒,很多英文资料、文档都是Ken帮忙查找和翻译(还有一位翻译就是前面提到的阎欢,他们走了以后,我就再也没有“全职”翻译了),还有很多私人帮助,若我到北京时你还未离开一定好好聚聚。

    小陶、重文、李健文、张兴 都是PHP高手。负责宽联的主营业务天下加油站。小陶个子很高白白胖胖的(晓帆第一次看到他时以为是韩国人),他很细心加油站上很多细节改进都是他的杰作。重文是个多面手喜好研究,对多方面的支持掌握的都很深,没少向他请教Javascript问题。李健文应该是宽联写程序最快的人,很短的时间就能完成任务-快的惊人,同时也和小柯、小熊并称宽联3大“饭桶” -最能吃的人,每次去外面吃饭都吃白饭最多碗的人。兴兴是现在加油站组的经理,不错!~

   王海是个特别爱说、敢说的家伙。工作经验丰富,有自己的设计风格。现在宽联使用的“天下”图标就是他的作品。他夜视独自一人经常加班,晚上时经常与他聊天哈哈。他还是四国军旗高手。很快就能又见到你啦。

    丁磊可不是网易的那个“丁磊”,记得前年回家一个老同学看到我的MSN上有丁磊,惊讶的说到“你还认识他呀”。他长我好多岁,很沧桑,带着厚厚的玻璃眼睛,一直使用从认识他时就使用的N记手机。跟他认识是因为晓帆与他的关系非常好,加上那时公司晚上经常CS。说到CS已经很久没有在公司玩儿过了,那时晓帆、丁磊、Tommy、Johney、Sam、兴兴 ....几乎每天下班都要打几个小时的CS。现在........变化很大。丁磊在CS中的代号是“9527”,擅长狙击+蹲坑,没少被他爆头啊。腾讯的工作很安逸应该能让他年轻些 ^_^。

    在网上认识晓帆是一个重要的转折点。那时在学校里每每不去上课,宿舍中“接单”,超低的价格让我结识了晓帆这样的很多“顾客”。几个项目下来我们是混的很熟悉了,“网吧自助建站”是当时中国唯一一个针对网吧的自助建站平台,现在她的功能也是中国最好的针对网吧的自助建站平台!-很有自信的说。网盟被收购的机会,晓帆介绍我进入了宽联,也就是有了第一份正式工作。3年后再看这一切,我是非常幸运的!若没有晓帆我今天也许都不知道博客园是何物~

    Johney,Thanks。不知如何形容这位处处为我着想,为网盟着想的BOSS。Thanks!
.
posted @ 2006-03-25 04:07 flower.b 阅读(272) | 评论 (7)编辑
  2006年3月23日

    前言:今天公司的老调查系统需要增加一个导出参与用户资料到.txt的功能。最多1个小时的工作,却进行了3个多小时,归其原因:一、公司网速太慢。更新外网数据、测试、等待超过半个小时。二、程序代码未优化。程序执行时间超过90s直至超时(当时只导出了多一半用户,估计完整执行时间会超过180s),被判不合格。最终找到原因在于字符串连接(好古老的问题)并通过优化执行时间降低到0.7s,速度提高100倍。

    项目环境:ASP(VBScript)+MS SQLSERVER 2000+用户数据2600条

   相信很多人都回使用下面的&字符串连接方式。仅列出开始时的主要代码:

'[读取SQL结果到二维数组 UserInfo 中略]
'
UserInfo = 0 ID,1 SV_ID,2 RECORD,3 Province,4 City,5 Name,6 Sex,7 Address,8 PostCode,9 Phone,10 OtherInfo,11 UserName,12 IP,13 DateTime
Dim OutputText  '输出文本内容
Dim SurveyInfo '调查基本信息
'
.
For i=0 To UBound(UserInfo,2)
    OutputText 
= OutputText & VbCrLf & "姓名:" &  UserInfo(5,i) & VbCrLf & _
                        
"省份:" & UserInfo(3,i) & "     城市:" & UserInfo(4,i) & VbCrLf & _
                        
"联系地址:" & UserInfo(7,i) & "     邮编:" & UserInfo(8,i) & VbCrLf & _
                        
"电话:" & UserInfo(9,i) & VbCrLf
    
    
' [OtherInfo 用户其他资料特殊资料的处理,与上面相同需要 6次 OutputText连接      代码略]

    OutputText 
= OutputText & "IP:" & UserInfo(12,i) & "     Time:" &  UserInfo(13,i) & VbCrLf & _ 
                        
"------------------------------------------------------------" & VbCrLf
Next


程序写完后,本机测试通过(仅10个用户资料)。传到外网服务器上执行超时。开始以为什么地方处理的有问题,后来才发现连接字符串这里消耗太多的时间。于是开始寻求解决办法。
C#、VB6 中都有StringBuilder,ASP中应该如何处理呢?(后来找到MSDN,方知ASP中也可以调用StringBuilder)。通过GOOGLE找到了《改进 ASP 应用程序中的字符串处理性能》-MSDN。于是按照 MSDN中的技巧通过使用() 括号将代码更改成如下:

'下面仅列出主要代码。[读取SQL结果到二维数组 UserInfo 中略]
'
UserInfo = 0 ID,1 SV_ID,2 RECORD,3 Province,4 City,5 Name,6 Sex,7 Address,8 PostCode,9 Phone,10 OtherInfo,11 UserName,12 IP,13 DateTime
Dim OutputText  '输出文本内容
Dim SurveyInfo '调查基本信息
'
.
For i=0 To UBound(UserInfo,2)
    OutputText 
= OutputText & (VbCrLf & "姓名:" &  UserInfo(5,i) & VbCrLf & _
                        
"省份:" & UserInfo(3,i) & "     城市:" & UserInfo(4,i) & VbCrLf & _
                        
"联系地址:" & UserInfo(7,i) & "     邮编:" & UserInfo(8,i) & VbCrLf & _
                        
"电话:" & UserInfo(9,i) & VbCrLf)
    
    
' [OtherInfo 用户其他资料特殊资料的处理,与上面相同需要 3次 OutputText连接      代码略]

    OutputText 
= OutputText & ("IP:" & UserInfo(12,i) & "     Time:" &  UserInfo(13,i) & VbCrLf & _ 
                        
"------------------------------------------------------------" & VbCrLf)
Next

运行,优化效果立刻显现出来执行时间 23s。
为什么增加“()”后就能这么明显的效率?MSDN中的解释是:“通过更改优先顺序,来减小大多数字符串连接操作中处理的字符串大小。”
“在最初的代码中,ASP 编译器将查看等号右边的表达式,并从左到右进行计算。结果,每次重复都要进行 29 个连接操作,这些操作针对不断增长的 OutputText 进行。在新版本中,我们提示编译器更改操作顺序。现在,它将按从左到右、从括号内到括号外的顺序计算表达式。此技术使得这些操作针对的是不会增长的较小字符串,只有3个是针对不断增长的大的 OutputText。” 。

图 1:标准连接与加括号连接在内存使用模式方面的比较(来自MSDN中例子)

微软还给出了使用 StringBuilder 的优化方法。考虑到ASP中需要创建外部对象,而且微软例子中StringBuilder优化法对比“括号”技巧,对性能提高不明显,因此没有尝试使用。(关于 StringBuilder 的性能可以参考 《改进ASP.....》一文)

23s的速度还是不能接受。根据上面的结果得知降低对大字符串的连接次数,能明显改善性能。因此继续在字符串连接上想办法:

'下面仅列出主要代码。[读取SQL结果到二维数组 UserInfo 中略]
'
UserInfo = 0 ID,1 SV_ID,2 RECORD,3 Province,4 City,5 Name,6 Sex,7 Address,8 PostCode,9 Phone,10 OtherInfo,11 UserName,12 IP,13 DateTime
Dim OutputText  '输出文本内容
Dim SurveyInfo '调查基本信息
Dim TempItemText  '临时中间字符串连接变量(*关键)
'
.
For i=0 To UBound(UserInfo,2)
    TempItemText 
= TempItemText & (VbCrLf & "姓名:" &  UserInfo(5,i) & VbCrLf & _
                        
"省份:" & UserInfo(3,i) & "     城市:" & UserInfo(4,i) & VbCrLf & _
                        
"联系地址:" & UserInfo(7,i) & "     邮编:" & UserInfo(8,i) & VbCrLf & _
                        
"电话:" & UserInfo(9,i) & VbCrLf)
    
    
' [OtherInfo 用户其他资料特殊资料的处理,与上面相同需要 0 次 OutputText连接      代码略]

    TempItemText 
= TempItemText & ("IP:" & UserInfo(12,i) & "     Time:" &  UserInfo(13,i) & VbCrLf & _ 
                        
"------------------------------------------------------------" & VbCrLf)
    
'减少10倍大字符串连接
    If ((i+1Mod 10=0 Then
        OutputText 
=  OutputText & TempItemText
        TempItemText 
= ""
    
End If
Next
If TempItemText<>"" Then
    OutputText 
=  OutputText & TempItemText
End If

可以看出代码增加了一个中间变量TempItemText用来连接每个用户资料,直接减少OutputText连接3倍。又通过 i 于 10取余数,大约每10个用户资料连接一次OutputText,再次减少10倍。Next后增加一个代码对最后可能的<10个用户的资料进行次OutputText连接。总共优化15次OutputText连接。

至此在没有使用StringBuilder的情况下,将程序优化到0.7s,已能满足项目要求。

总结:一、利用表达式优先级减少对大字符串连接次数。(仅增加一对括号,对原代码的影响很少*推荐)
            二、利用小字符串做中间变量减少对大字符串连接次数。
            三、这个优化方法适用范围不局限在ASP中(C#等)。

文献参考:《改进 ASP 应用程序中的字符串处理性能

posted @ 2006-03-23 15:27 flower.b 阅读(1616) | 评论 (3)编辑
  2005年7月7日

嘿嘿,我的blogs 第一篇。

目前网上流行的所谓“取真实IP地址”的方法,都有bug,没有考虑到多层透明代理的情况。

多数代码类似:

string IpAddress = (HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]!=null 
            
&& HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"!=String.Empty)
            
?HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]
            :HttpContext.Current.Request.ServerVariables[
"REMOTE_ADDR"];

 

事实上,上面的代码只试用与用户只使用了1层代理,如果用户有2层,3层HTTP_X_FORWARDED_FOR 的值是:“本机真实IP,1层代理IP,2层代理IP,.....” ,如果这个时候你的数据中保存IP字段的长度很小(15个字节),数据库就报错了。

实际应用中,因为使用多层透明代理的情况比较少,所以这种用户并不多。

其他应用情况,现在越来越多的网站使用了代理加速方式,比如 新浪、SOHU的新闻 都使用Squid做代理方式,利用多台服务器分流。Squid本身类似透明代理,会发送“HTTP_X_FORWARDED_FOR” ,HTTP_X_FORWARDED_FOR 中包括客户的IP地址,如果此时客户已经使用了一层透明代理,那么程序取的 “HTTP_X_FORWARDED_FOR” 就包括两个IP地址。(我遇到过3个IP地址的情况,4个的未遇到过)

所以取“真正”IP地址的方式,还应该判断  “HTTP_X_FORWARDED_FOR”  中是否有“,”逗号,或者长度是否超长(超过15字节 xxx.xxx.xxx.xxx)。

所以代码应该如下:

 

/// <summary>
/// 取得客户端真实IP。如果有代理则取第一个非内网地址
/// by flower.b
/// </summary>

public static string IPAddress
{
    
get
    
{
        
string result = String.Empty;

        result 
= HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
        
if(result!=null&&result!= String.Empty)
        
{
            
//可能有代理
            if(result.IndexOf(".")==-1)    //没有“.”肯定是非IPv4格式
                result = null;
            
else
            
{
                
if(result.IndexOf(",")!=-1)
                
{
                    
//有“,”,估计多个代理。取第一个不是内网的IP。
                    result = result.Replace(" ","").Replace("'","");
                    
string[] temparyip = result.Split(",;".ToCharArray());
                    
for(int i=0;i<temparyip.Length;i++)
                    
{
                        
if( Text.IsIPAddress(temparyip[i])
                            
&& temparyip[i].Substring(0,3)!="10."
                            
&& temparyip[i].Substring(0,7)!="192.168"
                            
&& temparyip[i].Substring(0,7)!="172.16.")
                        
{
                            
return temparyip[i];    //找到不是内网的地址
                        }

                    }

                }

                
else if(Text.IsIPAddress(result)) //代理即是IP格式
                    return result;
                
else
                    result 
= null;    //代理中的内容 非IP,取IP
            }


        }


        
string IpAddress = (HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]!=null && HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"!=String.Empty)?HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]:HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
        


        
if (null == result || result == String.Empty)
            result 
= HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
    
        
if (result == null || result == String.Empty)
            result 
= HttpContext.Current.Request.UserHostAddress;

        
return result;
    }

}

 

取“HTTP_X_FORWARDED_FOR” 的弊端。

HTTP_X_FORWARDED_FOR 是HTTP协议中头的一部分,不影响TCP的通讯。也就是说实际上客户端可以发送任意内容的 HTTP_X_FORWARDED_FOR,以就是伪造IP。最简单的是WEB程序的IP记录,本来是要记录真实IP的,反而被“黑客”欺骗。当你的应用程序记录客户的访问IP、拒绝或允许部分IP的访问、错误日志 都会出错,甚至误杀。

因此必要的安全日志应该记录 完整的 “HTTP_X_FORWARDED_FOR” (至少给数据库中的字段分配 3*15+2 个字节,以记录至少3个IP) 和 “REMOTE_ADDR”。对 HTTP_X_FORWARDED_FOR 的IP格式检查也是不可少的。

附:(Text是我自定义的一个类,IsIPAddress是其中的一个判断是否是IP地址格式的方法)

bool IsIPAddress(str1) 判断是否是IP格式
posted @ 2005-07-07 17:35 flower.b 阅读(1851) | 评论 (8)编辑