[From QQ空间]对于开发信息学奥赛评测系统的一点想法

现在很多学校都有自己的信息学在线评测系统,如北京大学(http://acm.pku.edu.cn/JudgeOnline/)、浙江大学(http://acm.zju.edu.cn/onlinejudge/)、树德中学(http://125.71.210.6:8001/)、石室中学(http://www.ssxdzx.net/)等,这些都为参加NOIP竞赛的学生提供了很好的学习、测试、交流的平台。但是网站系统的安全性却不尽人意,如湖南师大附中的“Vijos(高效信息学在线评测系统)”(http://www.vijos.org/)最近因为被入侵和技术性问题而关闭了,原因显然是网页和评测系统的安全检查不够,因此,安全应是评测系统最重要的部分。

首先说一下服务器吧。首先要说的就是 Linux 操作系统了,它的安全性非常好,如果安全设置得当,即使入侵者获取了 Web 权限或者是 MySQL 权限,他也不能获取系统的权限,甚至连网页源代码都不能访问。然后是 Windows 操作系统,微软为服务器而开发的操作系统有 Windows NT(此操作系统早已过时)、Windows 2000 Server 和 Windows 2000 Advanced Server(看名字也该知道他们的区别,好像现在也不怎么用了)、Windows Server 2003(现在用得最多的操作系统)、Windows Server 2008。

我们学校用的操作系统就是 Windows Server 2003,因此我就以他为例作一点说明:Win2003 自带的 IIS 的版本为 6,IIS6 有文件名解析漏洞,如果文件夹名末尾包含“.asp”,那么文件夹里的所有文件都会被当作ASP文件来进行解析;如果文件名包含形如“1.asp;1.jpg”的文本,那么它也会被当作ASP文件来解析。所以在处理用户上传的文件时一定要进行严格的检查。

然后说一下网页系统。在ASP中,这个主要就是对参数进行严格的过滤,整形参数用 CLng 函数进行强制转换。如果遇到字符串参数,则根据字符串在什么地方使用来进行格式检查,如Sort参数用在SQL里进行排序,那么根据数据库里字段名命名的规则,来判断参数里是否只包含了数字和字母,如果不是,那么就提示非法操作。

在PHP中除了注意以上所说的之外,还要注意PHP是否打开了register_globals ,如果这样,就要进行参数的初始化。

PHP中最好把 magic_quotes_gpc 打开来防止SQL注入。

所有网页都要注意的问题就是要对搜索功能中的关键字进行过滤,很多开发者都会忽略这个问题。

        然后说一下数据库系统。如果使用Access作为数据库,那么就要注意防止数据库备下载,最好把数据库扩展名改为IIS里没有的MIME类型,如“.ini”,并且把它放在网站文件夹以外。

如果使用 SQL Server 作为数据库,那么就要设置 MSSQLSERVER 服务的启动帐户,不要使用本地系统帐户,他的权限太大了,最好设置一个Users组的用户。SQL 的登陆帐户最新建一个public权限的用户,并且把 xp_cmdshell 等扩展删除了。

MySQL 的设置类似于 SQL Server。

        再说一下评测服务。评测系统的核心就是编译用户提交的程序代码,运行并判断结果。由于代码是由用户提交的,所以他很有可能包含恶意代码,因此我们必须对代码进行过滤,但这是不够的,因为总有一些人会想出绕过过滤的方法,如在PASCAL(FPC)代码中,用户可以提交形如“function a(b:string):integer;stdcall;external 'ker'+'nel'#$33#$32'.dll' name 'Load'#$4C#$69#$62#$72#$61#$72#$79#$41;” 的方法来绕过评测系统对于 "LoadLibraryA" 的检查,或者用“while true do;” 等语句来使评测其无法响应,因此我们必须进行其他的检查。有一种方法是自己编写一个语法检查器,但这个要求的技术很高,检查时又比较耗时,因此不推荐。第二个是我的一个想法,就是对编译好的程序进行输入表(Import Table)进行检查,因为不管源代码怎么写,在编译好的程序里总有对于他们的引用,

因此我们可以从这里入手进行检查,如果有危险的函数,就停止运行,并返回错误。

在 GNU C++ 3.4.2 编译器中,编译好的程序从 KERNEL32.DLL 中只导入了 AddAtomA、CreateSemaphoreA、ExitProcess、FindAtomA、GetAtomNameA、GetLastError、InterlockedDecrement、InterlockedIncrement、ReleaseSemaphore、SetLastError、SetUnhandledExceptionFilter、Sleep、TlsAlloc、TlsFree、TlsGetValue、TlsSetValue、WaitForSingleObject 共17个函数,如果评测器检查到用户程序导入了除以上函数之外的函数,那么就可以停止评测并返获错误了。

后记:我们学校以前也用过 Vijos 的老版本系统,但发现它只是界面漂亮,网页的安全性很差,评测服务也不能说是高效,他稍不注意就崩溃了,需要重启服务,并且SQL密码文件(Config.xml)没有加密。因此后来我们学校彻底放弃了 Vijos 评测系统,自己开发了一款评测系统,第一目标就是安全性,现在已经在测试中了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注