解决思路如下:
利用sybase ASE的特性提供的存储过程 sp_modifylogin,对登录的合法性进行验证。
-- 先新创建一个权限足够高的用户,将来当服务器有问题时,好用来恢复sa
-- 接下来将sa的login script绑定
usemaster go dropproceduresp_bindlogin go |
-- 存储过程名字弄个像系统的一样
createproceduresp_bindlogin as begin declare@hostnamevarchar(100) declare@program_namevarchar(100) declare@ipaddrvarchar(100) declare@newdatetime select@hostname=hostname, @program_name=program_name, @ipaddr=ipaddr frommaster..sysprocesses wherespid=@@spid |
-- 登录机器限定
if@hostname!='机器名' begin shutdownwithnowait end |
-- 登录机器IP限定
if@ipaddr!='机器IP' begin shutdownwithnowait end |
-- 登录应用程序限定
if@program_namein('SQL_Advantage','isql') begin shutdownwithnowait end select@new=getdate() |
-- 登录时间限定
if@new>='20080808' begin shutdownwithnowait end end go sp_hidetextsp_bindlogin go sp_modifyloginsa,'loginscript',sp_bindlogin go |
经过以上处理,sa只能在本机,并且不能使用 isql 、sqladv ,在 20080808 之前 登录数据库。
这里的逻辑是可以自由编写的。
这里的合法性验证不通过的处理方法是 shutdown 。
可以把 shutdown 换成以下存储过程。 这样就杀掉了自己。不会影响服务,只是需要做一些额外的配置。
dropproceduresp_killme go createproceduresp_killme as begin declare@cmdvarchar(100) select@cmd='kill'+convert(varchar(20),@@spid) execsp_remotesql'local',@cmd end go sp_hidetextsp_killme go |
最新评论