去年年末最后几天,我曾经在CSDN上提出过这么个问题如何防止mdf文件被非法附加?虽然没有得到很好的解决方案,但是还要感谢诸位网友的热心建议。

再次阐述以下一下问题:
    我们做的系统面临这么个问题,数据库在发布的时候是在安装时指定的实例上加了特定的密码。用SQL Server2000客户端直接连这个实例是无法正常连接的,但是有些稍微懂点SQL Server技术的客户能建个实例并把mdf文件附加到新建实例就可以堂而皇之的修改了,绕过程序的控制了,请问有没有什么好的办法可以防止这种情况的发 生?

前些天在找资料的时候无意中发现Sql Server 2000提供了一个全局变量——@@DBTS,联想到前段时间一直困扰我的关于如何防止用户非法修改数据库的问题,觉得通过这个变量来控制比较方便。

当然也是一种消极的事后控制方法,但也最起码也是一种方法,于是随手做了个简单的demo,确实很简单,下面是主要步骤及伪代码实现:

0.认识 @@DBTS(来自msdn)

为当前数据库返回当前 timestamp 数据类型的值。这一 timestamp 值保证在数据库中是唯一的。
    语法
   
    @@DBTS
    返回类型
   
    varbinary
    注释
   
    @@DBTS 返回当前数据库最后所使用的时间戳值。当带有 timestamp 列的一行被插入或更新时,会产生    一个新的时间戳值。
    示例
   
    下面的示例从 pubs 数据库返回当前的 timestamp 值。
   
    USE pubs
    SELECT @@DBTS

1.建立两个实验表:

//加密存储系统当前的@@DBTS变量
   
    CREATE TABLE [dbo].[dbts_log] (
        [dbtslog] [char] (18) COLLATE Chinese_PRC_CI_AS NOT NULL
    ) ON [PRIMARY]
    GO
   
    //实验数据表,必须有timestamp字段
    CREATE TABLE [dbo].[dbts_test] (
        [TestID] [uniqueidentifier] NOT NULL ,
        [name] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
        [timestamp] [timestamp] NULL
    ) ON [PRIMARY]

2.建立两个全局函数:

//a.f_updatedbts 在更改业务数据时同时更新DBTS_Log记录
   
    String Ls_DBStamp
   
    String Ls_DBTSLog
   
    //取出数据库@@DBTS
    DECLARE my_cursor DYNAMIC CURSOR FOR SQLSA ;
   
    PREPARE SQLSA FROM "SELECT @@DBTS" ;
   
    OPEN DYNAMIC my_cursor ;
   
    FETCH my_cursor INTO :ls_DBStamp ;
   
    CLOSE my_cursor ;
   
    //更新前先验证DBTS_LOG表记录值是否与@@DBTS相符
    SELECT dbtslog
      INTO :ls_DBTSLog
      FROM dbts_log;
     
    //TODO 采取加密存储,这里进行解密
   
    IF ls_DBStamp = ls_DBTSLog Then
        //更新记录表,一定要考虑加密存储,而且是不可逆的加密算法
        UPDATE dbts_log
        SET dbtslog = :ls_DBStamp;
   
        IF Sqlca.SqlCode <> 0 Then
            Rollback Using Sqlca;
            Return False
        Else
            IF pb_iscommit Then
                Commit Using Sqlca;
            End IF
        End IF
   
    Else
   
        Return False
   
    End IF
   
    Return True
   
    //b.f_validdbts 验证DBTS_log记录是否非法
   
    String ls_DBStamp
    String ls_DBTSLog
   
    //取出数据库@@DBTS
    DECLARE my_cursor DYNAMIC CURSOR FOR SQLSA ;
   
    PREPARE SQLSA FROM "SELECT @@DBTS" ;
   
    OPEN DYNAMIC my_cursor ;
   
    FETCH my_cursor INTO :ls_DBStamp ;
   
    CLOSE my_cursor ;
   
    //取出表中记录的DBTS日志
    SELECT dbtslog
      INTO :ls_DBTSLog
      FROM dbts_log;
     
    //TODO 采取加密存储,这里进行解密
   
    //返回比较的结果
    Return (ls_DBStamp = ls_DBTSLog)

3.简单实验:

a )//通过程序修改带有timestamp字段的表
   
    INSERT INTO dbts_test 
             ( name )
      VALUES ( "new" )  ;
          
   
    //同时更新DBTS_LOG表   
      f_updatedbts(true)
   
    b)在打开系统时校验DBTS_LOG表记录值是否与@@DBTS相符
   
   
    IF Not f_validdbts() Then
   
        MessageBox("**系统",“程序检测到您当前数据库被非法修改,请与系统管理员联系!”)
   
        Halt
    End IF

ps:我伪代码是用比较古老的语言powerbuilder,比较浅显易懂,所以也没特意修改

转载于:https://www.cnblogs.com/Hedonister/archive/2007/03/09/669101.html

防止mdf文件被非法附加后修改的一个简单实现方案相关推荐

  1. SQL Server导入.mdf文件及显示附加数据库时出错问题处理

    SQL Server安装完成后,运行时出现如下窗口,点击"连接". 本文主要解决导入.mdf文件时报错的问题. (1)导入.mdf文件的方法 1.右击数据库–附加,弹出下面的对话框 ...

  2. network setup service启动后自动停止_一个简单的测试环境下的自动化部署方案

    笔者是公司是一个分前后端开发的公司.而笔者是一个普通的后端开发工程师.在和前端工程师协同开发时,为了给前端工程师提供接口,往往要将写好的代码交付并部署到测试环境.因而这导致笔者经常需要打包项目更新到测 ...

  3. php下载apk文件源码下载,PHP_php下载文件源代码(强制任意文件格式下载),一个简单的php文件下载源代码 - phpStudy...

    php下载文件源代码(强制任意文件格式下载) 一个简单的php文件下载源代码,虽不支持断点续传等,但是可以满足一些常用的需求了.php下载文件其实用一个a标签就能实现,比如 magento-1.8.1 ...

  4. linux怎么创建一个c文件,如何在Ubuntu Linux中创建一个简单的C项目

    描述 步骤1:将VirtualBox安装到您的计算机上 VirtualBox是Oracle的一个产品,允许您运行虚拟机您的计算机意味着您可以在Windows或Apple计算机上运行Linux. 转到h ...

  5. 电脑的计算机自动打开文件,为什么电脑开机后会有一个文件夹自动打开

    电脑中了这个奇怪的病毒trojan.psw.lmir.lxq,显示C:\windows\system32\svchost.exe文件中毒,在用瑞星2007清除后再次进行杀毒时就又出来了!虽然" ...

  6. codebilcks怎么新建c++文件_电脑开机后桌面空白一个图标都没有,怎么回事?

    当遇到电脑开机后桌面空白,一个图标都没有的情形时,可以尝试如下解决办法: 1.先打开任务管理器(同时按下键盘"Ctrl+Alt+Del"组合键即可打开),点击"文件&qu ...

  7. java写一个文件浏览器_【Java】 实现一个简单文件浏览器(2)

    标签: 接着上篇文章 接下来说下程序右侧的文件内容表格如何实现 FileTable类: FileTable基础于JTable类,构造函数里用setDefaultRenderer设置每行默认的渲染器为F ...

  8. play.html文件,playframework – 如何使用play框架渲染一个简单的html页面?

    这是我的解决方案: 在路由中:我做了如下配置. GET /hello.html controllers.Assets.at(path="/public/html", file=&q ...

  9. 为什么一般数据恢复软件恢复的MDF文件无法附加

    我在做MDFfind软件前,有10年时间再做医疗保险刷卡系统程序,这是个管理程序,终端刷卡数据存放在MSSQL数据库中,由于工作人员操作失误,从企业管理器里面删除了数据库,直接导致MDF和ldf文件被 ...

  10. sql 2012先分离迁移mdf mlf 文件到别的机器后附加 数据库成只读的修复方法

    SQL Server2008附加数据库之后显示为只读时解决方法 从本地分离的数据库文件放到远程服务器上,附加数据库出现数据库为(只读情况) 阅读了以下两篇文章: 第一篇:http://blog.csd ...

最新文章

  1. React文档 state and lifecycle
  2. 如何轻松愉快地理解条件随机场
  3. Mybatis动态的添加删除列
  4. python基础教程: __del__() 清空对象
  5. oracle group by用法_从OceanBase TPCC测试报告看ORACLE兼容性进展
  6. php kml文件解析,英语翻译中文:详细分析了KML、MapInfo文件及二者之间的联系,以KML点标记文件为例,基于PHP编程实现了KML到...
  7. 按钮 每一行_word跨页表格如何重复设置表头?单击“重复标题行”按钮来设置多页表格重复标题行显示。...
  8. js中document.documentElement 和document.body 以及其属性 clientWidth等
  9. javascript 原生事件综合查询
  10. 华为2288H V5服务器安装win_server_2016问题解决过程
  11. 今年纽微特公司股东会不开了?
  12. C++1.1 #include<iostream>
  13. 计算机round是什么函数,计算机roundup函数是什么意思
  14. 北京大学计算机学院课程表,北京大学课程表.PDF
  15. 大学英语四六级13年12月大改革应对办法全套复习规划
  16. leaflet保存pm绘图geojson数据
  17. 永久删除的文件如何恢复?
  18. 老男孩python全栈开发视频教程_老男孩Python全栈开发(92天全)视频教程 自学笔记18...
  19. 计算机水冷排原理,玩转水冷电脑 冷排是关键
  20. suse linux如何重置密码忘记,SUSE Linux忘记root密码的对策

热门文章

  1. 【文末送书】在科研路上,大家有什么经验教训?
  2. 【Transformer】Transformer中16个注意力头一定要比1个注意力头效果好吗?
  3. 【NLP论文推荐】 掌握实体关系抽取必读的文章
  4. Datawhale数据挖掘项目之task2
  5. LeetCode刷题——120. 三角形最小路径和
  6. 李宏毅机器学习——逻辑回归
  7. 从G1设计到堆空间调整
  8. 为什么要使用 JavaScript
  9. flash与CPU连接及flash属性描述文件
  10. java 全角半角符号转换_java 字符串全角半角转换