程序处理用户输入过滤不严导致BUG及安全问题

这算是个老生常谈的问题了,我前面的文章也提到了由此导致的SQL注入漏洞或者XSS跨站漏洞,总结了一下,对于Web有4大漏洞是需要严肃对待的,比如SQL注入、XSS跨站另外还有上传漏洞以及对URL地址处理不严导致的越权漏洞,这个改天单独开一篇文章介绍一下,下面继续谈用户输入过滤不严导致的问题,前天正好帮一个客户处理一个程序问题,一个10年前的计票程序,当然不是我开发的,所以处理起来非常棘手,主要是计票汇总时程序出现了崩溃,仔细研究了这个程序的开发语言,发现是用PowerBuilder构建的,而且留下了PBL文件,用PowerBuilder分析了这个文件,大概知道了BUG的位置。查看了之前录入的数据,发现有个别票选项是0,该软件使用说明上注明只能使用1~4选项,那么说0就是非法的数据选项,那么这个汇总导致程序崩溃的Bug很有可能是由于这个导致的,删除了所有的0选项票,然后再汇总,一切正常!为了切实说明导致Bug的原因,我尝试重现了这个问题,开启一张新选票,然后输入某被选举人票数,输入过程故意输错一项,然后再尝试清除,结果发现无法清除,将该选项设置为0则程序提示“必须为1~4数字”,但是不对0这个无效数据做出处理,也就是说0依旧存在,下一步汇总,结果崩溃如愿的发生了,总结一下,初步判断该程序为“赶工”产品,后期测试不足,所以导致该隐性Bug没有能及时发现。

同样的问题依旧出现在某些网站上,比如经典的SQL注射漏洞,以SQL Server的Transact-SQL语言为例,我们就需要过滤一些危险的字符,比如像单引号,在SQL Server中,如果字符串包含单引号,我们就必须将其转换为两个单引号,避免可能的错误和已知的攻击,参考微软官方的 《SQL 注入》(SQL Injection) 文章,提供下面一个转换单引号的VBScript函数:

Posted in:
  • 网络编程与数据库
  • Web开发及相关
Tagged
  • Web安全
  • SQL注入

简单即是美的,关于程序语言的想法

最近这段时间分别捣鼓了一下C#和PHP语言,然后还回顾了一下VBScript,颇有一些想法,所以记录下来,“简单即是美的(Simple is beauty)”这句话不愧是经典,想想我们现在庞大的互联网,还记得老师讲过互联网从设计之初就是从简原则,所以能够发展壮大到现在,而且还非常稳固。提到程序语言,大家可能会想到C语言,是的,C语言的设计也是以简洁为宗旨,从K&R的C语言的教材厚度也能看出这一点,简单意味着学习容易,上手快。现在的社会可以说是个快节奏的社会,大家都在想以最快的速度将知识变成生产力,所以基本没有人愿意在学习一门知识上耗费太多的时间,这也就是C语言如此流行的原因之一吧。

下面我想谈谈两种简单,1.语言结构简单(编程语法简单);2.功能简单(官方函数库少)。第1条除了C语言,估计Visual Basic以及其衍生品VBScript肯定是占优的,VB一度被认为是世界上最简单的编程语言之一。而且造就了大量的程序员,因为语言简单,只需要掌握那么点东西就可以写程序了。但是代码编写到最后,往往符合第1条的程序员容易抱怨到:“为什么没有这个功能”,然后就是拐弯抹角的去实现一个类似的功能,也许这个功能在别的什么程序语言中很容易实现。与第1条相反的估计就是像PHP或者JavaScript为代表了,话说PHP的内置函数,和一些特别的语法结构还真多,我一时还真不容易记住,所以写PHP代码经常要翻手册,还有就是JavaScript,这门语言我也在用,不过说实话,JavaScript的语法结构也很复杂,什么闭包、匿名函数概念的。复杂了也是有好处的,当然对于记忆力特别好的人而言,但是时间长了会形成一种定势,就是每写一段代码,脑海中总是想:“有没有内置的替代方法”、“语法结构应该能以另外一种方式写的更好”,当习惯一种复杂结构的编程语言后,再去研究一种简单的语言,恐怕就会抱怨语言结构简单,要这个没有,要那个功能不全等。第2条官方函数库少,VB及VBScript再次出线,是的,写了这么多年的VB或者VBScript程序,就那么一些内置函数,背都背下来了,所以写起程序基本上就不需要手册了,这点JavaScript也是类似的,相反的又是PHP,PHP有大量内置的官方函数,每次想一个功能,总有人说“嘿,有现成的内置函数”。久而久之我也不怎么想动脑筋了,遇到问题就是在翻手册,查找官方实现。这样的好处是省事,自己不要写某个功能了,而且官方的肯定稳定性不错,坏处是,觉得像PHP简直是大杂烩。

Posted in:
  • 我的生活点滴
  • 计算机学习与研究
Tagged
  • 学习笔记

电压不稳或者经常断电导致的系统文件损坏修复办法

以下描述适用于Windows XP Professional操作系统,所有操作仅供参考,建议操作前备份重要数据。

经常有人会遇到一些莫名其妙的电脑问题,而且这一类问题在网上可能找不到解决的办法,比如说进入系统后桌面总是一段时间没有反应,然后才能操作相应的程序或者文件。下面我就简单介绍一次故障处理流程。

故障描述:已经启动,××安全卫士或者助手会提示启动完成,以及启动耗时,但是发现此时桌面点击没有反应,也就是说有段时间没有响应,然后才恢复正常。

初步判断为某些服务加载问题导致的这种现象,如果系统没有明显错误提示的话,建议进入控制面板,管理工具,事件查看器,你可以遵循 《如何在 Windows XP 的事件查看器中查看和管理事件日志》 所描述的步骤打开。进入事件查看器后点击右边的事件查看器(本地)- 应用程序,找到出现问题的那个时间段,比如说我这里是开机的那段时间,你可能会看到有红叉或者黄色的感叹号,点进去,然后看下问题描述。

Posted in:
  • 计算机应用及维护
  • Windows系统
Tagged
  • 系统故障

ASP/VBScript 利用.NET Framework实现PHP sha1() md5()

其实.NET Framework的一些库,ASP是可以直接借来用的,这点我在 《ASP/VBScript访问并使用.NET Framework对象》 文中已经做了简单的说明,今天正好又遇到一个借用.NET Framework实现某个特殊功能的例子。

在PHP中要计算文本的SHA-1其实很容易,直接使用sha1()这个函数就能轻松搞定了,但是在ASP中就杯具了,没有现成的函数,只能靠手写代码,包括md5()这些常用的哈希函数都要自己编码,好在已经有大牛帮我们写好代码了,我们只需要直接捡现成的用就可以了,比如说MD5就已经有不错的ASP/VBScript版本,关于不同语言的MD5实现可以 参考在这里 。好了,下面谈下比较棘手的SHA-1算法吧,你肯定说这个也有现成的ASP代码,是的,而且国内著名的ASP博客程序PJ-Blog已经内置了这种SHA-1算法了,那有什么好纠结的呢?PJ的SHA-1代码 源于这里 ,这个实现代码其实是JavaScript版本的,因为IIS的ASP技术默认支持VBScript和JavaScript/JScript两种脚本语言,所以我们可以直接拿来和VBScript混合使用。似乎这样也没有什么问题,但是对于ASP这种古老的技术而言,性能一直是其最大的瓶颈,而ASP性能建议上提到,不要混用两种脚本语言,也就是说混用VBScript和JScript会导致服务器缓存两个脚本解释引擎,而且会导致上下文切换的开销,所以性能上就有所损耗了,由于初始配置的IIS是把VBScript作为默认脚本语言,再加上JScript的对象模型,所以和JScript比起来VBScript可能性能上要好一点。

好吧,下面我们要做的是搞个VBScript版本的SHA-1,在这里我偷懒了点,求助了万能的谷歌,然后找到了一篇文章 《Replicating PHP’s sha1() in VBScript》 ,其中就提到了,借用.NET Framework的技术实现了VBScript版本的sha1,由于是通过Server.CreateObject实现的,所以代码比较简洁,性能上也应该说得过去,在这里我改写成类似PHP的sha1()函数:

Posted in:
  • 网络编程与数据库
  • VBScript/JavaScript/Python
  • Web开发及相关
  • 系统应用程序开发
Tagged
  • 加密与编码
  • asp
  • .net

ASP中Server.Execute和Execute实现动态包含(include)脚本的区别

最近打算尝试一下在ASP中实现MVC架构,肯定有人问我:ASP都淘汰了,为什么还研究?这点我也知道,自从微软放弃ASP 3.0转向ASP.NET后,ASP已经远远落后于和它几乎同时开始的PHP和JSP,开源比闭源的好处就像PHP和ASP一样,ASP说淘汰就淘汰,谁也救不了,但是值得注意的是ASP在中国市场还是蛮广泛的,尤其是一些中小企业的一些应用,简单的CMS不在话下,而且部署简单,在一些老旧的Windows系统上,不需要安装.NET Framework基本上就可以直接运行了,所以准备一个框架,还是有必要的,不过我这个是实验性框架,只是验证ASP究竟能不能实现类似PHP的MVC架构。

好了,说了这么多,下面直接转入正题吧。这个问题的缘由是因为我需要动态包含ASP文件,大家知道在ASP中只有一种include方法,那就是SSI(Server Side Include),基本上分为以下两种:

<!-- #include file="sample.asp" -->
<!-- #include virtual="sample.asp" -->

这两种基本上大家第一种用得多一些,#include virtual包含的是虚拟路径,一般虚拟目录会用得到。但是这两种都属于静态的,如果我们希望是动态包含,但不可以写成:

<!-- #include file="<%=MyVar%>" -->
<!-- #include virtual="<%=MyVar%>" -->

上面的写法是 错误 的,可以理解为,#include指令是在ASP启动脚本引擎执行ASP<% %>标记之间脚本之前执行的,也就是说#include不是ASP的工作,而是服务端程序,如IIS的翻译工作,所以就不会理会你的ASP代码了。

Posted in:
  • 网络编程与数据库
  • Web开发及相关
Tagged
  • asp
  • ssi

ASP/WScript/VBScript实现ActiveX COM对象管理器(2)

上面一篇已经介绍了关于对象管理器类cObjectManager,这篇主要讲在ASP中实现持续性对象管理器,大家知道,在ASP技术中,Global.asa是一个特殊的文件,其随着用户访问网站而启用,并在整个会话期内有效,我们可以将cObjectManager字典对象Scripting.Dictionary单独分离到这个文件中,该怎么做才能让所有ASP文件都能共享这一个对象呢?其实我们只需要在Global.asa中应用<object runat="server"></object>这样的标签就可以创建一个静态的全局对象了。

语法:

<object runat="server" scope="scope" id="id"
{progid="progID"|classid="classID"}>
....
</object>

scope 设置对象的作用域(作用范围)(Session 或者 Application)。 id 为对象指定一个唯一的 id。 ProgID 与 ClassID 关联的 id。ProgID 的格式是:[Vendor.]Component[.Version]。ProgID 或 ClassID 必需被指定。 ClassID 为 COM 类对象指定唯一的 id。ProgID 或 ClassID 必需被指定。

global.asa

<object runat="server" scope="application" id="objMgrDict"
progid="Scripting.Dictionary"></object>

然后我们只需要简单修改一下cObjectManager类:

Posted in:
  • 网络编程与数据库
  • VBScript/JavaScript/Python
  • Web开发及相关
  • 系统应用程序开发
Tagged
  • asp
  • dictionary字典
  • vbscript

ASP/WScript/VBScript实现ActiveX COM对象管理器(1)

本文仅实现了一种理论上的管理已经创建ActiveX COM方法,部分代码可以直接使用,由于未进行性能及稳定性测试,所以不建议使用到实际生产环境。下面所述将以VBScript脚本语言为例,同样适用于ASP、VB及VBA(Visual Basic For Application)技术。

大家知道在VBScript中创建对象是通过CreateObject实现的,由于是对象类型,所以必须通过Set关键字进行对象引用,当对象使用完毕后要通过Set [对象名] = Nothing进行对象销毁,这样VBS内部对象引用计数才下降,直至完全销毁回收。

大部分情况下,我们所创建的对象是可以复用的,也就是说,我们在一次使用完毕后可以不用急于销毁对象,然后第二、三次继续使用这个已经存在的对象,这样就避免多次调用CreateObject带来性能上的损耗,以及可能创建失败的风险。

比如说有这样的WScript/VBScript代码:

Function IsFileExists(filename)
  Dim fso
  Set fso = CreateObject("Scripting.FileSystemObject")
    IsFileExists = fso.FileExists(filename)
  Set fso = Nothing
End Function

Function IsFolderExists(filename)
  Dim fso
  Set fso = CreateObject("Scripting.FileSystemObject")
    IsFolderExists = fso.FolderExists(filename)
  Set fso = Nothing
End Function

Sub WriteTextFile(filename, text)
  Dim fso, f
  Set fso = CreateObject("Scripting.FileSystemObject")
    Set f = fso.CreateTextFile(filename, true)
      f.WriteLine text
      f.Close
    Set f = Nothing
  Set fso = Nothing
End Sub

If Not IsFileExists("C:\test\data.txt") Then
  If IsFolderExists("C:\test") Then
     WriteTextFile "C:\test\data.txt", "Hello world!"
  End If
End If

这里实现了一个简单的功能,判断文件data.txt,如果不存在,然后判断C:\test文件夹是否存在,存在的话就写入data.txt文件,简单的功能包含了“语法糖”般的函数调用,虽然这样做封装特性比较好,而且提升了我们编码的效率,但是我们这里创建了3次Scripting.FileSystemObject对象,因此程序执行的性能可想而知了,其实较好的做法是创建1次Scripting.FileSystemObject对象,然后FileExists、FolderExists以及CreateTextFile都属于上下文无关的方法,因此可以复用,所以有了下面2种办法:

Posted in:
  • 网络编程与数据库
  • VBScript/JavaScript/Python
  • Web开发及相关
  • 系统应用程序开发
Tagged
  • asp
  • dictionary字典
  • vbscript

Windows环境下尝试安装并配置PHP PEAR备忘

什么是PEAR

来自 百度百科 :PEAR是PHP扩展与应用库(the PHP Extension and Application Repository)的缩写。它是一个PHP扩展及应用的一个代码仓库,简单地说,PEAR之于PHP就像是CPAN(Comprehensive Perl Archive Network)之于Perl。

由此可见PEAR是PHP代码的仓库,在这里可以找到很多有用的代码,避免我们重复写一些功能,但是PEAR代码包并不是直接通过HTTP网站下载的,我们需要安装PEAR。

如何获取并安装PEAR

建议:下面操作在Windows 7环境下完成,同样适用于Windows XP/2003/Vista/2008系统,部分操作带有尝试性,为了避免弯路,建议先看完本文,然后再进行相关操作。

如果PHP目录下没有自带PEAR,即找不到go-pear.php文件,那么就需要我们手动下载go-pear.php文件, 点击这里下载并另存为go-pear.php ,这个文件放到php.exe所在的PHP安装目录下,我这里安装目录是D:\php5(下文以此目录为准),那么go-pear.php的位置应该是D:\php5\go-pear.php。

开始 - 运行,输入cmd,启动命令提示符,输入以下命令,主要是切换到go-pear.php目录下,然后执行这个PHP脚本文件:

Posted in:
  • 计算机应用及维护
  • Windows系统
Tagged
  • php配置
  • pear

使用Visual Studio在Windows下编译OpenSSL备忘

最近想研究一下OpenSSL,网上多数是讲在Linux下OpenSSL的编译和使用了,不过也有介绍Windows下编译和使用的,现在记录在这里,便于以后备查。

编译步骤:

1. 下载并安装ActivePerl (下载地址) ,记得下载Windows版本(MSWin32)的,然后还要注意你的系统是32位(x86)还是64位(x64)。

2. 下载并解压OpenSSL的源代码 (下载地址) 到指定目录,比如D:\openssl_src\。

3. 使用管理员权限打开Visual Studio的命令提示窗口,我这里打开的是VS2010。

Posted in:
  • 计算机应用及维护
  • Windows系统
Tagged
  • vs2010
  • openssl

避免Windows 7系统关机时安装更新

经常忙到很晚,而偏偏这个时候关机提示正在安装更新,不要拔掉电源或关机,然后非常纠结的看着那一个一个更新包以蜗牛一般的速度装完,而自己却不能去休息。其实,睡觉遇到这种情况还好,我可以不用管它,然后睡觉,要是平常遇到什么紧急的事情,需要立即关机搬电脑,那就比较麻烦了。综合考虑,我需要关闭这项关机安装更新的功能,我记得以前Vista是可以选择不安装更新直接关闭的,而Windows 7死活找不到这样的选项,搜索万能的网络,终于找到了可行的方案。

首先,开始,运行,输入gpedit.msc并确定,打开组策略编辑器,依次展开“用户配置→管理模块→Windows组件 →WindowsUpdate”,双击右侧窗口中的“不要在‘关闭 Windows’对话框显示‘安装更新并关机’”。然后在弹出的窗口中,点选“已启用”,最后单 击“确定”按钮保存设置。

Posted in:
  • 计算机应用及维护
  • Windows系统
Tagged
  • windows
  • 系统设置

© Wang Ye / 王 晔. All rights reserved.