现在的位置: 首页 > 综合 > 正文

凭什么要这么大的权力?

2013年09月10日 ⁄ 综合 ⁄ 共 1741字 ⁄ 字号 评论关闭

自然而然的,当我们安装完Windows后,我们就拥有一个管理员帐号,并且毫不犹豫地使用它,在Windows2000里,这个帐号是 Administrator,在XP里,它也存在,但由于在安装过程中会要求我们指定一个新的帐号(张三、李四或王二麻,它具有与管理员同样大的权限),所以一不小心就忘记Administrator的存在,特别地,做为一种(传统)习惯,大多数Adminstrator会忘记设置密码了。:(

好象,我们天生就应该在管理员帐号下做事,从来没有仔细想想,为什么Windows会划分出不同权限的帐号,也没有想想,用Office录入一些文档、用记事本写几行留言,玩玩游戏,上网聊聊天、浏览几个网站……这些普普通通的日常操作,凭什么就必须要求管理员权限呢?

什么是管理员,顾名思义,这个帐号是用来管理和维护计算机的(如安装新程序、更动配置),这个帐号具有至高无上的权力,它可以访问计算机中的任何一个文件夹、注册表中的任何一个键!!假定你的浏览器缺少一个关键补丁,当它访问一个恶意网站里会受到攻击,这个时候,如果你是在管理员帐号下,则病毒可以轻松地修改你的注册表(主要是 HKEY_LOCAL_MACHINE和HKEY_CLASSES),而如果正好和我一样,仅用Users这个组的用户去浏览网站,那么病毒根本没有权力碰到我的注册表(中的上述两个根键),它也完全无法伤及Windows、Program Files这些关键文件夹……

当然,做为一个程序员,为了调试程序,我这个仅仅有Users权限的帐号,还必须同时是“Debugger Users”组里的成员,特别的,当我使用VS2003的时候,我还同时隶属于“VS Developers”组……为什么要这么麻烦呢?原因是:

  • 我一边敲代码一边浏览网页的时候,不用担心被恶意网站攻击(虽然我现在用FireFox,受到攻击的可能性要比用IE小一些),就算我的浏览器有安全缺陷,但这个有BUG的程序没有权力动我的注册表。
  • 如果我有什么不小心的操作,或者不小心写错的代码,它们都不会误伤注册表(因为我只能访问HKEY_CURRENT_USER这个根键),也不会误伤到Windows目录和Program Files这两个关键文件夹,以及“Documents and Settings”中不属于我这个帐号的别人的东西。
  • 在设计和调试时,因为我的帐号权限不足于让我为所欲为,我就不会写出一些胡作非为的代码(比方说以读写方式访问HKEY_LOCAL_MACHINE、往Program Files下面写文件等),这样设计出来的代码会更加符合Windows的规范。作为一个例证,Delphi里著名的Id套件中的TIdIcmpClient,它必须在管理员帐号下才能正常工作,否则就会有一个SOCKET的10013错误,如果它的开发工作是在非管理员帐号下进行了,这种错误就会在第一时间内被发现

以上三点,最后一条特别重要,试想,象MS Office、Delphi、Visual Studio、Flash、Dreamweaver等商业软件,哪一个是必须要求在管理员帐号下运行的?因为它们都无一例外地做到了它们应该遵守的守则:

  • 永远不往程序自身目录写,因为程序通常被安装到Program Files文件夹里,该文件夹对于普通用户来说,是只读的。与之相反,很多(特别是国产)程序很喜欢往程序自身目录里写配置数据,而不是象微软推荐的那样,在注册表的HKEY_CURRENT_USER/Software/xxx键里存放用户自己的私有数据,或者用SHGetFolderPath来取得用户的私有文件夹。
  • 永远不往HKEY_LOCAL_MACHINE键中写,如果要打开这个键,一定用只读方式(为RegOpenKeyEx指定KEY_READ参数)。
  • 永远不用只读权限以外的权限去访问Windows这样的特殊目录。
  • 在访问内核对象的时候,一定会记住在访问之前,获得必需的特权。
  • ……

如果我们设计一个基于MSSQL的数据库应用系统,我们可以告诉客户”该程序必须以SA权限登录到数据库“吗?如果不是,那么,为什么我们的程序,就非得在管理员帐号下,才能正常运转呢?


(2006.8.17日补充:参考文章:不被流氓软件骚扰其实不难

抱歉!评论已关闭.