sql server 2000撰写的日志

SQL Server数据库内容被挂马的处理方法

本方法通过Asp脚本遍历数据库中的所有类型为 char,varchar,nvchar,text 的字段,并通过replace函数替换字段中被插入的JS脚本。

第一步:备份需要处理的数据库;

第二步:找到数据库被挂的马的内容,一般为一小段JS代码如:<script src=http://domain/c.js></script>

第三步:将以下代码保存为clear.asp,并修改其中的参数,再放到IIS中运行即可,自动去掉数据中指定的JS代码。 

ASP/Visual Basic代码
  1. <%   
  2. ’sql数据库连接参数:数据库名(SqlDatabaseName)、用户密码(SqlPassword)、用户名(SqlUsername)、   
  3. ‘连接名(SqlLocalName)(本地用local,外地用IP)   
  4. Const SqlDatabaseName = "数据库名"  
  5. Const SqlUsername = "用户名"  
  6. Const SqlPassword = "密码"  
  7. Const SqlLocalName = "服务器地址"  
  8. Dim ConnStr   
  9. ConnStr = "Provider = Sqloledb; User ID = " & SqlUsername & "; Password = " & SqlPassword & "; Initial Catalog = " & SqlDatabaseName & "; Data Source = " & SqlLocalName & ";"  
  10.   
  11.     On Error Resume Next  
  12.     Set Plus_Conn = Server.CreateObject("ADODB.Connection")   
  13.     Plus_Conn.open ConnStr   
  14.     If Err Then  
  15.         err.Clear   
  16.         Set Plus_Conn = Nothing  
  17.         Response.Write "插件数据库连接出错,请检查连接字串。"‘注释,需要把这几个字翻译成英文。   
  18.         Response.End  
  19.     End If  
  20.   
  21.   
  22. Server.ScriptTimeOut=180   
  23. Set rstSchema = Plus_Conn.OpenSchema(20)   
  24. k=1   
  25. Do Until rstSchema.EOF ‘遍历数据库表   
  26.     If rstSchema("TABLE_TYPE")="TABLE" Then  
  27.         response.write K".<font color=red><b>"&rstSchema("TABLE_NAME") & "</b></font>:" ‘显示表名   
  28.         Set rs=Server.CreateObject("ADODB.Recordset")   
  29.         sql="select * from [" & rstSchema("TABLE_NAME")"]"  
  30.         rs.open sql,Plus_Conn,1,3   
  31.         For i=0 to rs.fields.count-1 ‘遍历表中字段   
  32.            If int(rs(i).Type)=129 or int(rs(i).Type)=130 or int(rs(i).Type)=200 or int(rs(i).Type)=201 or int(rs(i).Type)=202 or int(rs(i).Type)=203 Then‘只处理字段类型为字符型的字段   
  33.             Plus_Conn.execute("update ["&rstSchema("TABLE_NAME")"] set "&rs(i).name" =replace(cast("&rs(i).name" as varchar(8000)),’<script src=http://domain/c.js></script>’,”)")   
  34.             response.write rs(i).name " "&rs(i).Type " "‘显示执行过的字段名。   
  35.           End If  
  36.         Next  
  37.         response.write "<br>"  
  38.     End If  
  39.     rstSchema.MoveNext   
  40.     k=k+1   
  41. Loop  
  42. response.Write "执行成功"  
  43. %>  

文章参考:
数据库内容被挂马的处理办法(在此基础上本文实现了连接数据库的代码)

相关的防止数据库内容挂马的文章:
防范MSSQL数据库被挂马插入JS/sql注入的解决方法
http://www.piaoyi.org/database/MSSQL-guama-js.html

编写Asp.net防注入组件
http://haitao.name/index.php/aspnet/

 

SQL Server"错误 21002: [SQL-DMO]用户 * 已经存在"

在分配数据库登录用户的数据库访问权限的时候出现这种错误,如果选中某一个数据库的任何一个角色就会出现这个错误:

错误21002:[sql-dmo]用户***已经存在错误

此错误的原因多是因为将MSSQL备份移植到另一服务器还原时出现。

主要原因是原来的备份还原时保留了原用户的信息,导致产生孤立用户

解决方法:

1.打开mssql企业管理器→数据库→展开出问题的数据库如"mydb"→"用户"→在右侧窗口中选择出问题的用户名如:"***"→右击鼠标→删除

2.企业管理器→安全性→登录→在右侧窗口中选择出问题的用户名如:"***"→属性→数据库访问→点选"mydb"→勾选下方的"public"和"db-owner"→确定

如果在第一步中删除用户的时候出现“选定的用户拥有对象,所以无法除去该用户”的错误提示,那么请看此文:

SQL Server提示"选定的用户拥有对象,所以无法除去该用户”

SQL Server"选定的用户拥有对象,所以无法除去该用户"

今天在帮朋友弄一台服务器的时候当我需要删除一个数据库里的用户时,提示如下错误信息:

"选定的用户拥有对象,所以无法除去该用户"

如何解决呢?

我试了网上提供的一些方法都不行,最后还是自己用SQL解决了些问题。

1 在查询分析器里面选中出问题的数据库,然后输入:
Exec sp_configure 'allow updates',1  --允许更新系统表。
RECONFIGURE WITH OVERRIDE

2.运行如下SQL语句:
UPDATE sysobjects SET uid=1  --把数据库里所有的对象都归属到用户dbo

3.执行如下SQL语句:
Exec sp_configure 'allow updates',0  --关闭系统表更新
RECONFIGURE WITH OVERRIDE

4.删除数据库里的用户,再重新建立用户。

 

从Google中知道了产生此问题的原因如下:

MSSQL备份移植到另一服务器还原时容易遇到的问题……
MSSQL备份移植到另一服务器还原时容易遇到的问题,尤其是从虚拟主机备份回来的数据库在本机还原的问题…
会出现用SQL原来的用户名和密码无效的情况
无法删除某一个系统表
用sa连接做Select时提示表名无效
无法删除原备份数据库中的用户名,提示“因为选定的用户拥有对象,所以无法除去该用户。”
主要原因是原来的备份还原时保留了原用户的信息,导致产生孤立用户……

SQL Server如何执行带参数的存储过程?

执行带参数的存储过程的方法如下:

Exec sp_configure 'allow updates',1  --允许更新系统表。

exec dbo.User_ChangeObjectOwnerBatch 'OldOwner','dbo'

以上是两个例子。

SQL Server中执行带参数的存储过程的方法是:

EXEC 存储过程名字 ‘参数1′,’参数2′,数值参数

EXEC 是一个关键字。

字符串参数使用单引号括起来,数值参数不需要使用单引号

用ASP连接DBF、DBC、MDB、Excel、SQL Server型数据库的方法

用ASP连接DBF、DBC、MDB、Excel、SQL Server型数据库的方法:
一、ASP的对象存取数据库方法
  在ASP中,用来存取数据库的对象统称ADO(Active Data Objects),主要含有三种对象:Connection、Recordset 、Command
Connection:负责打开或连接数据
Recordset:负责存取数据表
Command:负责对数据库执行行动查询命令

二、连接各数据库的驱动程序
  连接各数据库可以使用驱动程序,也可以使用数据源,不过我建议大家使用驱动程序,因为使用驱动程序非常方便、简单,而使用数据源比较麻烦。

OLEDB链接

适合的数据库类型
链接方式
access "Provider=microsoft.jet.oledb.4.0;data source=your_database_path;user id=admin;password=pass;"
Oracle "Provider=OraOLEDB.Oracle;data source=dbname;user id=admin;password=pass;"
MS SQL Server "Provider=SQLOLEDB;data source=machinename;initial catalog=dbname;userid=sa;password=pass;"
MS text "Provider=microsof.jet.oledb.4.0;data source=your_path;Extended Properties’text;FMT=Delimited’"

 

ODBC链接

适合数据库类型
链接方式
access "Driver={microsoft access driver(*.mdb)}; dbq=*.mdb;uid=admin;pwd=pass;"
dBase "Driver={microsoft dbase driver(*.dbf)}; driverid=277;dbq=————;"
Oracle "Driver={microsoft odbc for oracle}; server=oraclesever.world;uid=admin;pwd=pass;"
MSSQL server "Driver={sql server};server=servername; database=dbname;uid=sa;pwd=pass;"
MS text "Driver={microsoft text driver(*.txt; *.csv)}; dbq=—–;extensions=asc,csv,tab,txt;Persist SecurityInfo=false;"
Visual Foxpro "Driver={microsoft Visual Foxpro driver}; sourcetype=DBC;sourceDB=*.dbc;Exclusive=No;"
MySQL "Driver={mysql}; database=yourdatabase;uid=username;pwd=yourpassword;option=16386;"

 

而我们在一般情况下使用Access的数据库比较多,在这里我建议大家连接Access数据库使用下面的方法:

dim conn
set conn = server.createobject("adodb.connection")
conn.open = "provider=microsoft.jet.oledb.4.0;" & "data source = " & server.mappath("../db/bbs.mdb")

其中../db/bbs.mdb是你的数据库存放的相对路径!如果你的数据库和ASP文件在同一目录下,你只要这样写就可以了:

dim conn
set conn = server.createobject("adodb.connection")
conn.open = "provider=microsoft.jet.oledb.4.0;" & "data source = " & server.mappath("bbs.mdb")

有许多初学者在遇到数据库连接时总是会出问题,然而使用上面的驱动程序只要你的数据库路径选对了就不会出问题了。

SQL Server备份的三个恢复模型

 

在SQL Server 2000中,有无数种备份数据库的方法。无论你的数据库有多大、改变是否频繁,都有满足你的要求的备份策略。让我们看看几种可以在不同环境下工作的基本备份策略。

本文假定你有备份数据库的权限。也就是说,你要么是系统管理员,要么是db_owner或者backupadministrator。还有,我们还假定你的操作系统提供了访问备份所需要的资源的权利,例如,访问磁盘或者磁带驱动器。

从哪儿开始

在你开始备份一个SQL Server数据库之前,你需要知道该数据库使用了哪个恢复模型。这里有三种不同的恢复模型:FULL、BULK_LOGGED和SIMPLE。

FULL恢复模型向你提供了最大的恢复灵活性。新数据库默认使用的就是这种恢复模型。利用这种模型,你可以恢复数据库的一部分或者完全恢复。假设交易记录(transactions log)还没有被破坏,你还可以在失败之前恢复出最后一次的已提交(committed)交易。在所有的恢复模型中,这种模型使用了最多的交易记录空间,并轻微影响了SQL Server的性能。

BULK_LOGGED恢复模型比FULL模型少了一些恢复选项,但是进行批操作(bulk operation)时它不会严重影响性能。在进行某些批操作时,由于它只需记录操作的结果,因此它使用了较少的记录空间。然而,用这种模型,你不能恢复数据库中的特定标记,也不能仅仅恢复数据库的一部分。

SIMPLE恢复模型是这三种模型中最容易实施的,它所占用的存储空间也最小。然而,你只能恢复出备份结束时刻的数据库。

为了找出你所用数据库的恢复模型,可以运行下面的命令,该命令应该返回FULL、BULK_LOGGED和SIMPLE这三个值中的某一个:

SELECT dbpropertyex("database", "recovery")

为了改变数据库的恢复选项,运行下面的命令:

ALTER DATABASE database name SET RECOVERY {FULL | SIMPLE | BULK_LOGGED}

除数据之外,SQL Server备份还包括数据库大纲(schema)和数据库元数据(即数据库文件、文件组和它们的位置)。SQL Server允许在备份时用户依然使用数据库,所以在备份期间发生的交易也记录到备份中去了。

备份数据库

为了备份数据库,你可以运行BACKUP命令。(你也可以使用SQL Enterprise Manager。)在执行命令之前知道它的语法永远是个好主意。BACKUP命令有许多选项,它的基本语法是:

BACKUP DATABASE { database_name }

TO < backup_device > |

backup_device可以是磁盘或者磁带——或者它也可以是一个用磁盘文件、磁带或者已命名管道表示的逻辑上的备份设备。

如果你想做一个快速、一次性的备份,那么向下面那样使用磁盘文件:

BACKUP DATABASE Northwind TO DISK = "c:\backup\Northwind.bak"

如果你想把数据库备份到另外一台服务器上,可以使用UNC名字:

BACKUP DATABASE Northwind TO DISK = "\\FILESERVER\Shared\Backup\Northwind.bak"

如果想进行有规律、有计划的备份,就需要使用逻辑备份设备。一个逻辑备份设备可以保存若干个数据库备份并驻留在磁盘、磁带或者已命名管道上。如果你使用磁带设备,磁带驱动器必须在同一台物理服务器上。已命名管道可以利用第三方备份软件。

为了创建逻辑备份设备,使用sp_addumpdevice系统保存过程。SQL Enterprise Manager也可以用来创建备份设备。命令行语法如清单A所示。

清单B给出了一个在磁盘上创建逻辑备份设备的例子。

当备份设备创建完毕,Northwind数据库可以用下面的命令进行备份:

BACKUP DATABASE Northwind TO DiskBackup

频繁变动的大数据库的备份

现在,我已经演示了如何备份整个数据库。然而,它只允许你恢复备份结束时刻的数据库所保存的数据。如果数据库很大并且频繁变动,由于时间和空间的限制,频繁进行全数据库备份是不现实的。当数据库失败时,可能会造成大量数据丢失。

在这种情况下,有两种提高可恢复性的途径,这两个途径都要求全数据库备份。而且这两种方法都要求数据库恢复模型为FULL或者BULK_LOGGED。

第一种方法采用差异数据库备份,它只捕获并保存全数据库备份后改变的数据。由于它的文件较小而且信息简明,用它进行数据恢复的速度非常快。

下面的例子在一个名为DiffBackupDevice的逻辑备份设备上创建了一个差异备份:

BACKUP DATABASE Northwind TO DiffBackupDevice WITH DIFFERENTIAL

第二个提高可恢复性的方法利用交易记录备份,恢复可以在一个特定的时间点上完成。

你可能会问这怎么可能。记住,交易记录的目的就是记录发生在数据库中所有交易。交易记录允许COMMIT和ROLLBACK正确工作。为了达到这个功能,该数据的变化前后的数值必须随同操作类型、交易开始(时间)等一齐被记录下来。

备份技巧

利用下面的列出的技巧来确保你不会在每周一次的数据库备份过程中忘记关键步骤。

  • 每周一次备份主数据库。如果你创建、修改或者停止一个数据库,添加新的SQL Server消息,添加或者停止连接服务器,或者添加记录设备,那就进行手工备份。
  • 每天备份一次msdb数据库。它一般非常小,但很重要,因为它包含了所有的SQL Server工作、操作和计划任务。
  • 只有当你修改它时,才有必要备份模型数据库。
  • 用SQL Server Agent来安排你的备份工作的时间表。
  • 如果在你的生产(production)环境中有现成资源,备份生产数据库到本地磁盘或者网络服务器(用同一个开关)。然后,把备份文件/设备拷贝到磁带上。在存在许多硬件故障(特别是在RAID系统中)的情况下,磁盘常常是完好的(inact)。如果备份文件是在磁盘上,那么恢复时的速度会提高很多。
  • 备份开发和测试数据库至少要用到SIMPLE恢复模型。
  • 除了有计划的定时备份外,在进行未记录的(nonlogged)批操作(如,批拷贝)、创建索引、或者改变恢复模型后要备份用户数据库。
  • 如果你使用的是SIMPLE恢复模型,记住在截短(truncate)交易记录之后备份你的数据库。
  • 用文档记录你的恢复步骤。至少要大概记录这些步骤,注意所有的重要文件的位置。

在截短记录之前,也就是所有的已提交(committed)交易从记录中清空之前,所有的这些信息都保存在交易记录中。在SIMPLE恢复模型中,记录在一个CHECKPOINT期间内截短(在SQL Server内存缓冲写道磁盘时),它是自动发生的,但也可以手动执行。这也就是SIMPLE恢复模型不支持时间点(point-in-time)恢复的原因。在FULL和BULK_LOGGED恢复模型下,当交易记录被备份时,交易记录被截短,除非你明确指出不进行截短。

为了备份交易记录,使用BACKUP LOG命令。其基本语法与BACKUP命令非常相似:

BACKUP LOG { database } TO <backup device>

下面是如何把交易记录备份到一个名为LogBackupDevice的逻辑设备上的例子:

BACKUP TRANSACTION Northwind TO LogBackupDevice

如果你不希望截短交易记录,使用NO_TRUNCATE选项,如下所示:

BACKUP TRANSACTION Northwind TO LogBackupDevice WITH NO_TRUNCATE

只是基本知识

尽管我在本文中仅仅概述了数据库恢复的基本知识,你还是可以通过这些技巧来找到正确的方向。那么,为了避免不必要的(丢失数据造成的)恐慌,你要做到每周备份主数据库,每天备份msdb。