Asp连接Sqlserver

 

这是ASP连接Sqlserver程序,你可以直接copy下来,然后根据自己需要进行修改就可以了

<%
Dim mode
mode=request.form("text4")
if mode=1 then
name=request.form("text1")
age=request.form("text2")
addr=request.form("text3")
if not isnumeric(age) then response.write "age must be number!<a href=javascript:history.go(-1)>try again</a>":response.end
age=clng(age)
end if
'********************************************************************
' 与SQL Server2000有关的连接
' 可以参照它建立您的数据库连接
'********************************************************************
'敬请注意:
'请根据情况配置StrServer,StrUid,StrSapwd,StrDbName四个参数
Dim StrServer,StrUid,StrSaPwd,StrDbName
StrServer="(local)" '数据库服务器名
StrUid="testuser" '您的登录帐号
StrSaPwd="12345" '您的登录密码
StrDbName="db_test_com" '您的数据库名称

Dim Conn '数据库连接
Dim StrDSN '数据库连接字符串
Dim Rs '命令字符串
StrDSN="driver={SQL server};server="&StrServer&";uid="&StrUid&";pwd="&StrSaPwd&";database="&StrDbName
'建立和数据库master的连接
set Conn = Server.CreateObject("ADODB.Connection")
set Rs=Server.CreateObject("ADODB.RecordSet")
Conn.Open StrDSN
'********************************************************************
'********************************************************************

Dim strsql
'********************************************************************
' 读数据库的相关操作
sub readdb()
strsql="select * from test"
rs.open strsql,conn,1,1
if rs.EOF then response.write "no record at all":exit sub
response.write "<table border=1>"
response.write "<tr>"
for i=0 to rs.Fields.Count-1
response.write "<td><font color=blue>"&rs.Fields(i).Name&"</font></td>"
next
response.write "</tr>"
while not rs.EOF
response.write "<tr>"
for i=0 to rs.Fields.Count-1
response.write "<td>"&rs.Fields(i).Value&"</td>"
next
response.write "</tr>"
rs.MoveNext
wend
response.write "</table>"
rs.Close
end sub
'********************************************************************

'********************************************************************
' 写数据库的相关操作
sub insertdata()
strsql="INSERT INTO test(name,age,addr) VALUES('"&name&"',"&age&",'"&addr&"')"
rs.Open strsql,conn,1,3
end sub
'********************************************************************

if mode=1 then
call insertdata()
response.write "insert ok!"
elseif mode=2 then
call readdb()
end if
'释放数据库连接对象
set rs=nothing
set conn=nothing
%>
<HTML>
<HEAD>
<TITLE></TITLE>
<script language=javascript>
function clickit(flag){
var form1=document.form2
form1.text4.value=flag;

if (flag==1){
if (form1.text1.value==""){
alert("name cant empty!");
return false;
}
if (form1.text2.value==""){
alert("age cant empty!");
return false;
}
if (form1.text3.value==""){
alert("addr cant empty!");
return false;
}

}
form1.submit();
return true;
}
</script>
</HEAD>
<BODY>
<form method=post name=form2>
name:<INPUT type="text" id=text1 name=text1 size=12>
age:<INPUT type="text" id=text2 name=text2 size=12>
city:<INPUT type="text" id=text3 name=text3 size=12><br>
<INPUT type="hidden" id=text4 name=text4>
<INPUT type="button" value="write" id=button1 name=button1 onclick="clickit(1)">
<INPUT type="button" value="read" id=button2 name=button2 onclick="clickit(2)">
</form>
</BODY>
</HTML>

posted @ 2006-05-20 10:50 青蛙學堂 阅读(1574) | 评论 (1)编辑 收藏

BAT命令

echo、@、call、pause、rem(小技巧:用::代替rem)是批处理文件最常用的几个命令,我们就从他们开始学起。
echo 表示显示此命令后的字符
echo off 表示在此语句后所有运行的命令都不显示命令行本身
@与echo off相象,但它是加在每个命令行的最前面,表示运行时不显示这一行的命令行(只能影响当前行)。
call 调用另一个批处理文件(如果不用call而直接调用别的批处理文件,那么执行完那个批处理文件后将无法返回当前文件并执行当前文件的后续命令)。
pause 运行此句会暂停批处理的执行并在屏幕上显示Press any key to continue...的提示,等待用户按任意键后继续
rem 表示此命令后的字符为解释行(注释),不执行,只是给自己今后参考用的(相当于程序中的注释)。

例1:用edit编辑a.bat文件,输入下列内容后存盘为c:\a.bat,执行该批处理文件后可实现:将根目录中所有文件写入 a.txt中,启动UCDOS,进入WPS等功能。

  批处理文件的内容为:         命令注释:

    @echo off           不显示后续命令行及当前命令行
    dir c:\*.* >a.txt       将c盘文件列表写入a.txt
    call c:\ucdos\ucdos.bat    调用ucdos
    echo 你好            显示"你好"
    pause              暂停,等待按键继续
    rem 准备运行wps         注释:准备运行wps
    cd ucdos            进入ucdos目录
    wps               运行wps  

批处理文件的参数

批处理文件还可以像C语言的函数一样使用参数(相当于DOS命令的命令行参数),这需要用到一个参数表示符“%”。

%[1-9]表示参数,参数是指在运行批处理文件时在文件名后加的以空格(或者Tab)分隔的字符串。变量可以从%0到%9,%0表示批处理命令本身,其它参数字符串用%1到%9顺序表示。

例2:C:根目录下有一批处理文件名为f.bat,内容为:
@echo off
format %1

如果执行C:\>f a:
那么在执行f.bat时,%1就表示a:,这样format %1就相当于format a:,于是上面的命令运行时实际执行的是format a:

例3:C:根目录下一批处理文件名为t.bat,内容为:
@echo off
type %1
type %2

那么运行C:\>t a.txt b.txt
%1 : 表示a.txt
%2 : 表示b.txt
于是上面的命令将顺序地显示a.txt和b.txt文件的内容。


特殊命令

if goto choice for是批处理文件中比较高级的命令,如果这几个你用得很熟练,你就是批处理文件的专家啦。

一、if 是条件语句,用来判断是否符合规定的条件,从而决定执行不同的命令。 有三种格式:

1、if [not] "参数" == "字符串" 待执行的命令

参数如果等于(not表示不等,下同)指定的字符串,则条件成立,运行命令,否则运行下一句。

例:if "%1"=="a" format a:

2、if [not] exist [路径\]文件名 待执行的命令
如果有指定的文件,则条件成立,运行命令,否则运行下一句。

如: if exist c:\config.sys type c:\config.sys
表示如果存在c:\config.sys文件,则显示它的内容。

3、if errorlevel <数字> 待执行的命令

很多DOS程序在运行结束后会返回一个数字值用来表示程序运行的结果(或者状态),通过if errorlevel命令可以判断程序的返回值,根据不同的返回值来决定执行不同的命令(返回值必须按照从大到小的顺序排列)。如果返回值等于指定的数字,则条件成立,运行命令,否则运行下一句。

如if errorlevel 2 goto x2

二、goto 批处理文件运行到这里将跳到goto所指定的标号(标号即label,标号用:后跟标准字符串来定义)处,goto语句一般与if配合使用,根据不同的条件来执行不同的命令组。

如:

goto end

:end
echo this is the end

标号用“:字符串”来定义,标号所在行不被执行。

三、choice 使用此命令可以让用户输入一个字符(用于选择),从而根据用户的选择返回不同的errorlevel,然后于if errorlevel配合,根据用户的选择运行不同的命令。

注意:choice命令为DOS或者Windows系统提供的外部命令,不同版本的choice命令语法会稍有不同,请用choice /?查看用法。

choice的命令语法(该语法为Windows 2003中choice命令的语法,其它版本的choice的命令语法与此大同小异):

CHOICE [/C choices] [/N] [/CS] [/T timeout /D choice] [/M text]

描述:
   该工具允许用户从选择列表选择一个项目并返回所选项目的索引。

参数列表:
  /C    choices       指定要创建的选项列表。默认列表是 "YN"。

  /N                  在提示符中隐藏选项列表。提示前面的消息得到显示,
                      选项依旧处于启用状态。

  /CS                 允许选择分大小写的选项。在默认情况下,这个工具
                      是不分大小写的。

  /T    timeout       做出默认选择之前,暂停的秒数。可接受的值是从 0
                      到 9999。如果指定了 0,就不会有暂停,默认选项
                      会得到选择。

  /D    choice        在 nnnn 秒之后指定默认选项。字符必须在用 /C 选
                      项指定的一组选择中; 同时,必须用 /T 指定 nnnn。

  /M    text          指定提示之前要显示的消息。如果没有指定,工具只
                      显示提示。

  /?                  显示帮助消息。

  注意:
  ERRORLEVEL 环境变量被设置为从选择集选择的键索引。列出的第一个选
  择返回 1,第二个选择返回 2,等等。如果用户按的键不是有效的选择,
  该工具会发出警告响声。如果该工具检测到错误状态,它会返回 255 的
  ERRORLEVEL 值。如果用户按 Ctrl+Break 或 Ctrl+C 键,该工具会返回 0
  的 ERRORLEVEL 值。在一个批程序中使用 ERRORLEVEL 参数时,将参数降
  序排列。

示例:
  CHOICE /?
  CHOICE /C YNC /M "确认请按 Y,否请按 N,或者取消请按 C。"
  CHOICE /T 10 /C ync /CS /D y
  CHOICE /C ab /M "选项 1 请选择 a,选项 2 请选择 b。"
  CHOICE /C ab /N /M "选项 1 请选择 a,选项 2 请选择 b。"
  
如果我运行命令:CHOICE /C YNC /M "确认请按 Y,否请按 N,或者取消请按 C。"
屏幕上会显示:
确认请按 Y,否请按 N,或者取消请按 C。 [Y,N,C]?
  
  
例:test.bat的内容如下(注意,用if errorlevel判断返回值时,要按返回值从高到低排列):
@echo off
choice /C dme /M "defrag,mem,end"
if errorlevel 3 goto end
if errorlevel 2 goto mem
if errotlevel 1 goto defrag

:defrag
c:\dos\defrag
goto end

:mem
mem
goto end

:end
echo good bye

此批处理运行后,将显示“defrag,mem,end[D,M,E]?” ,用户可选择d m e ,然后if语句根据用户的选择作出判断,d表示执行标号为defrag的程序段,m表示执行标号为mem的程序段,e表示执行标号为end的程序段,每个程序段最后都以goto end将程序跳到end标号处,然后程序将显示good bye,批处理运行结束。

四、for 循环命令,只要条件符合,它将多次执行同一命令。

语法:
对一组文件中的每一个文件执行某个特定命令。

FOR %%variable IN (set) DO command [command-parameters]

%%variable  指定一个单一字母可替换的参数。
(set)      指定一个或一组文件。可以使用通配符。
command    指定对每个文件执行的命令。
command-parameters
            为特定命令指定参数或命令行开关。

例如一个批处理文件中有一行:
for %%c in (*.bat *.txt) do type %%c

则该命令行会显示当前目录下所有以bat和txt为扩展名的文件的内容。


批处理示例

1. IF-EXIST

1)

首先用记事本在C:\建立一个test1.bat批处理文件,文件内容如下:
@echo off
IF EXIST \AUTOEXEC.BAT TYPE \AUTOEXEC.BAT
IF NOT EXIST \AUTOEXEC.BAT ECHO \AUTOEXEC.BAT does not exist

然后运行它:
C:\>TEST1.BAT

如果C:\存在AUTOEXEC.BAT文件,那么它的内容就会被显示出来,如果不存在,批处理就会提示你该文件不存在。

2)

接着再建立一个test2.bat文件,内容如下:
@ECHO OFF
IF EXIST \%1 TYPE \%1
IF NOT EXIST \%1 ECHO \%1 does not exist

执行:
C:\>TEST2 AUTOEXEC.BAT
该命令运行结果同上。

说明:
(1) IF EXIST 是用来测试文件是否存在的,格式为
IF EXIST [路径+文件名] 命令
(2) test2.bat文件中的%1是参数,DOS允许传递9个批参数信息给批处理文件,分别为%1~%9(%0表示test2命令本身) ,这有点象编程中的实参和形参的关系,%1是形参,AUTOEXEC.BAT是实参。

3) 更进一步的,建立一个名为TEST3.BAT的文件,内容如下:
@echo off
IF "%1" == "A" ECHO XIAO
IF "%2" == "B" ECHO TIAN
IF "%3" == "C" ECHO XIN

如果运行:
C:\>TEST3 A B C
屏幕上会显示:
XIAO
TIAN
XIN

如果运行:
C:\>TEST3 A B
屏幕上会显示
XIAO
TIAN

在这个命令执行过程中,DOS会将一个空字符串指定给参数%3。

2、IF-ERRORLEVEL

建立TEST4.BAT,内容如下:
@ECHO OFF
XCOPY C:\AUTOEXEC.BAT D:IF ERRORLEVEL 1 ECHO 文件拷贝失败
IF ERRORLEVEL 0 ECHO 成功拷贝文件

然后执行文件:
C:\>TEST4

如果文件拷贝成功,屏幕就会显示“成功拷贝文件”,否则就会显示“文件拷贝失败”。

IF ERRORLEVEL 是用来测试它的上一个DOS命令的返回值的,注意只是上一个命令的返回值,而且返回值必须依照从大到小次序顺序判断。
因此下面的批处理文件是错误的:
@ECHO OFF
XCOPY C:\AUTOEXEC.BAT D:\
IF ERRORLEVEL 0 ECHO 成功拷贝文件
IF ERRORLEVEL 1 ECHO 未找到拷贝文件
IF ERRORLEVEL 2 ECHO 用户通过ctrl-c中止拷贝操作
IF ERRORLEVEL 3 ECHO 预置错误阻止文件拷贝操作
IF ERRORLEVEL 4 ECHO 拷贝过程中写盘错误

无论拷贝是否成功,后面的:

未找到拷贝文件
用户通过ctrl-c中止拷贝操作
预置错误阻止文件拷贝操作
拷贝过程中写盘错误

都将显示出来。

以下就是几个常用命令的返回值及其代表的意义:
backup
0 备份成功
1 未找到备份文件
2 文件共享冲突阻止备份完成
3 用户用ctrl-c中止备份
4 由于致命的错误使备份操作中止

diskcomp
0 盘比较相同
1 盘比较不同
2 用户通过ctrl-c中止比较操作
3 由于致命的错误使比较操作中止
4 预置错误中止比较

diskcopy
0 盘拷贝操作成功
1 非致命盘读/写错
2 用户通过ctrl-c结束拷贝操作
3 因致命的处理错误使盘拷贝中止
4 预置错误阻止拷贝操作

format
0 格式化成功
3 用户通过ctrl-c中止格式化处理
4 因致命的处理错误使格式化中止
5 在提示“proceed with format(y/n)?”下用户键入n结束

xcopy
0 成功拷贝文件
1 未找到拷贝文件
2 用户通过ctrl-c中止拷贝操作
4 预置错误阻止文件拷贝操作
5 拷贝过程中写盘错误

3、IF STRING1 == STRING2

建立TEST5.BAT,文件内容如下:
@echo off
IF "%1" == "A" formAT A:

执行:
C:\>TEST5 A
屏幕上就出现是否将A:盘格式化的内容。

注意:为了防止参数为空的情况,一般会将字符串用双引号(或者其它符号,注意不能使用保留符号)括起来。
如:if [%1]==[A] 或者 if %1*==A*

5、GOTO

建立TEST6.BAT,文件内容如下:
@ECHO OFF
IF EXIST C:\AUTOEXEC.BAT GOTO _COPY
GOTO _DONE
:_COPY
COPY C:\AUTOEXEC.BAT D:\
:_DONE

注意:
(1) 标号前是ASCII字符的冒号":",冒号与标号之间不能有空格。
(2) 标号的命名规则与文件名的命名规则相同。
(3) DOS支持最长八位字符的标号,当无法区别两个标号时,将跳转至最近的一个标号。

6、FOR

建立C:\TEST7.BAT,文件内容如下:
@ECHO OFF
FOR %C IN (*.BAT *.TXT *.SYS) DO TYPE %C

运行:
C:>TEST7

执行以后,屏幕上会将C:盘根目录下所有以BAT、TXT、SYS为扩展名的文件内容显示出来(不包括隐藏文件)。

posted @ 2006-05-17 14:10 青蛙學堂 阅读(3391) | 评论 (1)编辑 收藏

清除Windows系统垃圾

为你的电脑系统清除淤塞的垃圾!轻松流畅上网你是否注意到你的电脑系统磁盘的可用空间正在一天天在减少呢?是不是像老去的猴王一样动作一天比一天迟缓呢?没错!在Windows在安装和使用过程中都会产生相当多的垃圾文件,包括临时文件(如:*.tmp、*._mp)日志文件(*.log)、临时帮助文件(*.gid)、磁盘检查文件(*.chk)、临时备份文件(如:*.old、*.bak)以及其他临时文件。

  特别是如果一段时间不清理IE的临时文件夹“Temporary Internet Files”,其中的缓存文件有时会占用上百MB的磁盘空间。这些垃圾文件不仅仅浪费了宝贵的磁盘空间,严重时还会使系统运行慢如蜗牛。这点相信你肯定忍受不了吧!所以应及时清理系统的垃圾文件的淤塞,保持系统的“苗条”身材,轻松流畅上网!朋友来吧,现在就让我们一起来快速清除系统垃圾吧!!

  新建一个记事本并输入以下的内容:

  @echo off
  echo 正在清除系统垃圾文件,请稍等......
  del /f /s /q %systemdrive%\*.tmp
  del /f /s /q %systemdrive%\*._mp
  del /f /s /q %systemdrive%\*.log
  del /f /s /q %systemdrive%\*.gid
  del /f /s /q %systemdrive%\*.chk
  del /f /s /q %systemdrive%\*.old
  del /f /s /q %systemdrive%\recycled\*.*
  del /f /s /q %windir%\*.bak
  del /f /s /q %windir%\prefetch\*.*
  rd /s /q %windir%\temp & md %windir%\temp
  del /f /q %userprofile%\cookies\*.*
  del /f /q %userprofile%\recent\*.*
  del /f /s /q "%userprofile%\Local Settings\Temporary Internet Files\*.*"
  del /f /s /q "%userprofile%\Local Settings\Temp\*.*"
  del /f /s /q "%userprofile%\recent\*.*"
  echo 清除系统垃圾完成!
  echo. & pause
  最后将它保存,然后更名为“清除系统垃圾.bat”!ok!你的垃圾清除器就这样制作成功了!

  以后只要双击运行该文件,当屏幕提示“清除系统垃圾完成!就还你一个“苗条”的系统了!!到时候再看看你的电脑,是不是急速如飞呢?

  注:这招比那些所谓的优化大师好用!不会破坏系统文件!

posted @ 2006-05-17 13:55 青蛙學堂 阅读(200) | 评论 (0)编辑 收藏

Procedure

返回记录集过程:
CREATE OR REPLACE PACKAGE pkg_test
AS
TYPE myrctype IS REF CURSOR;

PROCEDURE get (p_id NUMBER, p_rc OUT myrctype);
END pkg_test;
/

CREATE OR REPLACE PACKAGE BODY pkg_test
AS
PROCEDURE get (p_id NUMBER, p_rc OUT myrctype)
IS
sqlstr VARCHAR2 (500);
BEGIN
IF p_id = 0 THEN
OPEN p_rc FOR
SELECT ID, NAME, sex, address, postcode, birthday
FROM student;
ELSE
sqlstr :=
'select id,name,sex,address,postcode,birthday
from student where id=:w_id';
OPEN p_rc FOR sqlstr USING p_id;
END IF;
END get;
END pkg_test;
/
--------------------------------------------------------------------------------------------------------------
返回记录集函数:
1、建立测试表
CREATE TABLE student
(
id NUMBER,
name VARCHAR2(30),
sex VARCHAR2(10),
address VARCHAR2(100),
postcode VARCHAR2(10),
birthday DATE,
photo LONG RAW
);
/

2、建立带ref cursor定义的包和包体及函数:
CREATE OR REPLACE
package pkg_test as
/* 定义ref cursor类型
不加return类型,为弱类型,允许动态sql查询,
否则为强类型,无法使用动态sql查询;
*/
type myrctype is ref cursor;

--函数申明
function get(intID number) return myrctype;
end pkg_test;
/

CREATE OR REPLACE
package body pkg_test as
--函数体
function get(intID number) return myrctype is
rc myrctype; --定义ref cursor变量
sqlstr varchar2(500);
begin
if intID=0 then
--静态测试,直接用select语句直接返回结果
open rc for select id,name,sex,address,postcode,birthday from student;
else
--动态sql赋值,用:w_id来申明该变量从外部获得
sqlstr := 'select id,name,sex,address,postcode,birthday from student where id=:w_id';
--动态测试,用sqlstr字符串返回结果,用using关键词传递参数
open rc for sqlstr using intid;
end if;

return rc;
end get;

end pkg_test;
/

3、用pl/sql块进行测试:
declare
w_rc pkg_test.myrctype; --定义ref cursor型变量

--定义临时变量,用于显示结果
w_id student.id%type;
w_name student.name%type;
w_sex student.sex%type;
w_address student.address%type;
w_postcode student.postcode%type;
w_birthday student.birthday%type;

begin
--调用函数,获得记录集
w_rc := pkg_test.get(1);

--fetch结果并显示
loop
fetch w_rc into w_id,w_name,w_sex,w_address,w_postcode,w_birthday;
exit when w_rc%notfound;
dbms_output.put_line(w_name);
end loop;
end;

4、测试结果:
通过。
--------------------------------------------------------------------------------------------------------------
返回对象类型:
SQL> create table a (id number,name varchar2(50),doctime date);

Table created.

--插入六条测试数据:
SQL> insert into a values (1,'aaa',to_date('2002-07-01','yyyy-mm-dd'));

1 row created.

SQL> insert into a values (2,'bbb',to_date('2002-07-02','yyyy-mm-dd'));

1 row created.

SQL> insert into a values (3,'ccc',to_date('2002-07-03','yyyy-mm-dd'));

1 row created.

SQL> insert into a values (4,'ddd',to_date('2002-07-04','yyyy-mm-dd'));

1 row created.

SQL> insert into a values (5,'eee',to_date('2002-07-05','yyyy-mm-dd'));

1 row created.

SQL> insert into a values (6,'fff',to_date('2002-07-06','yyyy-mm-dd'));

1 row created.

SQL> commit;

Commit complete.

--创建两个type
SQL> create or replace type myobjectype as object (x int,y date,z varchar2(50));
2 /

Type created.

SQL> create or replace type mytabletype as table of myobjectype
2 /

Type created.

--创建可以返回纪录集的函数(不传入表名参数)
SQL> create or replace function testrerecordnotabname (tableid in number)
2 return mytabletype
3 as
4 l_data mytabletype :=mytabletype();
5 begin
6 for i in (select * from a where id>=tableid) loop
7 l_data.extend;
8 l_data(l_data.count) := myobjectype(i.id,i.doctime,i.name);
9 exit when i.id = 62;
10 end loop;
11 return l_data;
12 end;
13 /

Function created.

SQL> commit;

Commit complete.

--创建可以返回纪录集的函数(可以传入表名参数)
SQL> create or replace function testrerecordtabname (tablename in varchar2,tableid in number)
2 return mytabletype
3 as
4 l_data mytabletype :=mytabletype();
5 strsql varchar2(50);
6 type v_cursor is ref cursor;
7 v_tempcursor v_cursor;
8 i1 number;
9 i2 varchar2(50);
10 i3 date;
11 begin
12 strsql := 'select * from ' || tablename || ' where id>=' || tableid;
13 open v_tempcursor for strsql;
14 loop
15 fetch v_tempcursor into i1,i2,i3;
16 l_data.extend;
17 l_data(l_data.count) := myobjectype(i1,i3,i2);
18 exit when v_tempcursor%NOTFOUND;
19 end loop;
20 return l_data;
21 end;
22 /

Function created.

SQL> commit;

Commit complete.

--测试不传表名参数的function(testrerecorenotabname)
SQL> set serveroutput on
SQL> declare
2 testre mytabletype :=mytabletype();
3 i number :=0;
4 begin
5 testre := testrerecordnotabname(1);
6 loop
7 i := i+1;
8 dbms_output.put_line(';' || testre(i).x || ';' || testre(i).y || ';' || testre(i).z || ';');
9 exit when i = testre.count;
10 end loop;
11 end;
12 /
;1;01-7?? -02;aaa;
;2;02-7?? -02;bbb;
;3;03-7?? -02;ccc;
;4;04-7?? -02;ddd;
;5;05-7?? -02;eee;
;6;06-7?? -02;fff;

PL/SQL procedure successfully completed.

--测试传表名参数的function(testrerecoretabname)
SQL> set serveroutput on
SQL> declare
2 testre mytabletype :=mytabletype();
3 i number :=0;
4 begin
5 testre := testrerecordtabname('a',1);
6 loop
7 i := i+1;
8 dbms_output.put_line(';' || testre(i).x || ';' || testre(i).y || ';' || testre(i).z || ';');
9 exit when i = testre.count;
10 end loop;
11 end;
12 /
;1;01-7?? -02;aaa;
;2;02-7?? -02;bbb;
;3;03-7?? -02;ccc;
;4;04-7?? -02;ddd;
;5;05-7?? -02;eee;
;6;06-7?? -02;fff;
;6;06-7?? -02;fff;

PL/SQL procedure successfully completed.
--------------------------------------------------------------------------------------------------------------
利用对象类型通过字符串分析出数据函数:
create or replace type mytabletype as table of number;
/

create or replace function strtab(p_str in varchar2)
return mytabletype
as
lstr varchar2(1000) default p_str||',';
ln number;
ldata mytabletype:=mytabletype();
begin
loop
ln:=instr(lstr,',');
exit when (nvl(ln,0)=0);
ldata.extend;
ldata(ldata.count):=ltrim(rtrim(substr(lstr,1,ln-1)));
lstr:=substr(lstr,ln+1);
end loop;
return ldata;
end;
/

SQL> select * from table(cast(strtab('11,12,13') as mytabletype));

COLUMN_VALUE
------------
11
12
13

SQL> create table bb(id varchar2(2),name varchar2(10));

Table created

SQL> insert into bb values('11','张三');

1 row inserted

SQL> insert into bb values('12','李四');

1 row inserted

SQL> insert into bb values('13','王五');

1 row inserted

SQL> select * from bb where id in (select * from table(cast(strtab('11,12,13') as mytabletype)));

ID NAME
-- ----------
11 张三
12 李四
13 王五
------------------------------------------------------------------------------------------------------------------
字段类型为嵌套表的使用方法:
CREATE TYPE Course AS OBJECT (
course_no NUMBER(4),
title VARCHAR2(35),
credits NUMBER(1));
/

CREATE TYPE CourseList AS TABLE OF Course;
/

CREATE TABLE division (
name VARCHAR2(20),
director VARCHAR2(20),
office VARCHAR2(20),
courses CourseList)
NESTED TABLE courses STORE AS courses_tab;


INSERT INTO division
VALUES('Psychology', 'Irene Friedman', 'Fulton Hall 133',
CourseList(Course(1000, 'General Psychology', 5),
Course(2100, 'Experimental Psychology', 4),
Course(2200, 'Psychological Tests', 3),
Course(2250, 'Behavior Modification', 4),
Course(3540, 'Groups and Organizations', 3),
Course(3552, 'Human Factors in the Workplace', 4),
Course(4210, 'Theories of Learning', 4),
Course(4320, 'Cognitive Processes', 4),
Course(4410, 'Abnormal Psychology', 4)));
INSERT INTO division
VALUES('History', 'John Whalen', 'Applegate Hall 142',
CourseList(Course(1011, 'History of Europe I', 4),
Course(1012, 'History of Europe II', 4),
Course(1202, 'American History', 5),
Course(2130, 'The Renaissance', 3),
Course(2132, 'The Reformation', 3),
Course(3105, 'History of Ancient Greece', 4),
Course(3321, 'Early Japan', 4),
Course(3601, 'Latin America Since 1825', 4),
Course(3702, 'Medieval Islamic History', 4)));
INSERT INTO division
VALUES('English', 'Lynn Saunders', 'Breakstone Hall 205',
CourseList(Course(1002, 'Expository Writing', 3),
Course(2020, 'Film and Literature', 4),
Course(2418, 'Modern Science Fiction', 3),
Course(2810, 'Discursive Writing', 4),
Course(3010, 'Modern English Grammar', 3),
Course(3720, 'Introduction to Shakespeare', 4),
Course(3760, 'Modern Drama', 4),
Course(3822, 'The Short Story', 4),
Course(3870, 'The American Novel', 5)));
----------------------------------------------------------------------------------------------------------------
游标只是plsql中使用的变量并不是oracle的对象,所以它不能在过程或函数间进行传递。
下面的方法是通过table类型的对象来存储要返回的记录集。
--创建测试表:
SQL> create table a (id number,name varchar2(50),doctime date);

Table created.

--插入六条测试数据:
SQL> insert into a values (1,'aaa',to_date('2002-07-01','yyyy-mm-dd'));

1 row created.

SQL> insert into a values (2,'bbb',to_date('2002-07-02','yyyy-mm-dd'));

1 row created.

SQL> insert into a values (3,'ccc',to_date('2002-07-03','yyyy-mm-dd'));

1 row created.

SQL> insert into a values (4,'ddd',to_date('2002-07-04','yyyy-mm-dd'));

1 row created.

SQL> insert into a values (5,'eee',to_date('2002-07-05','yyyy-mm-dd'));

1 row created.

SQL> insert into a values (6,'fff',to_date('2002-07-06','yyyy-mm-dd'));

1 row created.

SQL> commit;

Commit complete.

--创建两个type
SQL> create or replace type myobjectype as object (x int,y date,z varchar2(50));
2 /

Type created.

SQL> create or replace type mytabletype as table of myobjectype
2 /

Type created.

--创建可以返回纪录集的过程
SQL> create or replace procedure testrerecordnotabname (tableid in number, l_data out mytabletype)
2
3 as
4
5 begin
6 for i in (select * from a where id>=tableid) loop
7 l_data.extend;
8 l_data(l_data.count) := myobjectype(i.id,i.doctime,i.name);
9 exit when i.id = 62;
10 end loop;
11
12 end;
13 /

Function created.

SQL> commit;

Commit complete.

SQL> commit;

Commit complete.

--测试不传表名参数的procedure(testrerecorenotabname)
SQL> set serveroutput on
SQL> declare
2 testre mytabletype :=mytabletype();
3 i number :=0;
4 begin
5 testrerecordnotabname(1,testre);
6 loop
7 i := i+1;
8 dbms_output.put_line(';' || testre(i).x || ';' || testre(i).y || ';' || testre(i).z || ';');
9 exit when i = testre.count;
10 end loop;
11 end;
12 /
;1;01-7?? -02;aaa;
;2;02-7?? -02;bbb;
;3;03-7?? -02;ccc;
;4;04-7?? -02;ddd;
;5;05-7?? -02;eee;
;6;06-7?? -02;fff;

PL/SQL procedure successfully completed.

posted @ 2006-05-16 13:51 青蛙學堂 阅读(227) | 评论 (0)编辑 收藏

PL/SQL 語句

pl/sql 是结构化程序设计语言,块(block)是pl/sql 程序中最基本的结构,所有的pl/sql程序都是由块组成的。
pl/sql 由变量说明,程序代码,和异常处理代码3部分组成。

declare -----标记声明部分
 begin ------标记程序体部分开始
exception ------标记异常处理部分开始
end;       --------标记程序体部分结束

 

pl/sql 示例


1>   

    set serveroutput on;
    declare
   empname varchar2(20);
   begin
        select emp_name into empname from cus_emp_basic where emp_no='00000027';
        dbms_output.put_line(empname);
    end ;


使用set serveroutput on 命令设置环境变量serveroutput为打开状态,从而使得pl/sql程序能够再SQL*plus和SQL*plus中输出结果

使用函数dbms_output.put_line()可以输出参数的值。

1>条件语句

      set serveroutput on ;
declare
     num integer :=3;
     begin
         if num< 0 then
          dbms_output.put_line('负数');
         elsif num > 0 then
          dbms_output.put_line('正数');
         else
          dbms_output.put_line('0');
         end if;
     end;

 

2>

循环语句loop ......exit....end

     set serveroutput on;
declare
    num integer:=1;
    v_sum integer:=0;
begin
   loop
      v_sum:=v_sum+num;
      dbms_output.put_line(num);
      if num=4 then
      exit;
      end if;
     
      dbms_output.put_line('+');     
      num:=num+1;
   end loop;
  
      dbms_output.put_line('=');
      dbms_output.put_line(v_sum);
 end;


3>
循环语句 loop......exit when ...end

 set serveroutput on;
  declare
   v_num integer:=1;
    v_sum integer:=0;
begin
    
     loop
        v_sum:=v_sum+v_num;
        dbms_output.put_line(v_num);
        exit when v_num=4;
       
        dbms_output.put_line('+');
        v_num:=v_num+1;
     end loop;
    
  dbms_output.put_line('=');
  dbms_output.put_line(v_sum);
  end;

4>

循环语句 while...loop...end loop


  set serveroutput on ;
declare
   
     v_num integer:=1;
     v_sum integer:=0;

begin
  
    while v_num <=4
    loop
       v_sum:=v_sum+v_num;
       dbms_output.put_line(v_num);
       if v_num <4 then
       dbms_output.put_line('+');
       end if;
     
       v_num:=v_num+1;
       end loop;
       dbms_output.put_line('=');
       dbms_output.put_line(v_sum);
 end;

 

5>

循环语句for...in..loop....end loop

 


set serveroutput on;
declare
     v_num integer;
     v_sum integer:=0;
 begin
    
      for v_num in 1..4
      loop
         v_sum:=v_sum+v_num;
         dbms_output.put_line(v_num);
          if v_num< 4 then
             dbms_output.put_line('+');
          end if;
          end loop;
         
          dbms_output.put_line('=');
          dbms_output.put_line(v_sum);
          end;

posted @ 2006-05-16 10:31 青蛙學堂 阅读(655) | 评论 (0)编辑 收藏

sql/plus command

SQL*PLUS命令的使用大全关键词: ORACLE    SQL*PLUS                                          
Oracle的sql*plus是与oracle进行交互的客户端工具。在sql*plus中,可以运行sql*plus命令与sql*plus语句。
   我们通常所说的DML、DDL、DCL语句都是sql*plus语句,它们执行完后,都可以保存在一个被称为sql buffer的内存区域中,并且只能保存一条最近执行的sql语句,我们可以对保存在sql buffer中的sql 语句进行修改,然后再次执行,sql*plus一般都与数据库打交道。
   除了sql*plus语句,在sql*plus中执行的其它语句我们称之为sql*plus命令。它们执行完后,不保存在sql buffer的内存区域中,它们一般用来对输出的结果进行格式化显示,以便于制作报表。
   下面就介绍一下一些常用的sql*plus命令:
 
1. 执行一个SQL脚本文件
SQL>start file_name
SQL>@ file_name
我们可以将多条sql语句保存在一个文本文件中,这样当要执行这个文件中的所有的sql语句时,用上面的任一命令即可,这类似于dos中的批处理。
 
2. 对当前的输入进行编辑
SQL>edit
 
3. 重新运行上一次运行的sql语句
SQL>/
 
4. 将显示的内容输出到指定文件
SQL> SPOOL file_name
   在屏幕上的所有内容都包含在该文件中,包括你输入的sql语句。
 
5. 关闭spool输出
SQL> SPOOL OFF
   只有关闭spool输出,才会在输出文件中看到输出的内容。
 
6.显示一个表的结构
SQL> desc table_name
 
7. COL命令:
主要格式化列的显示形式。
该命令有许多选项,具体如下:
COL[UMN] [{ column|expr} [ option ...]]
Option选项可以是如下的子句:
ALI[AS] alias
CLE[AR]
FOLD_A[FTER]
FOLD_B[EFORE]
FOR[MAT] format
HEA[DING] text
JUS[TIFY] {L[EFT]|C[ENTER]|C[ENTRE]|R[IGHT]}
LIKE { expr|alias}
NEWL[INE]
NEW_V[ALUE] variable
NOPRI[NT]|PRI[NT]
NUL[L] text
OLD_V[ALUE] variable
ON|OFF
WRA[PPED]|WOR[D_WRAPPED]|TRU[NCATED]
 
1). 改变缺省的列标题
COLUMN column_name HEADING column_heading
For example:
Sql>select * from dept;
     DEPTNO DNAME                        LOC
---------- ---------------------------- ---------
         10 ACCOUNTING                   NEW YORK
sql>col  LOC heading location
sql>select * from dept;
    DEPTNO DNAME                        location
--------- ---------------------------- -----------
        10 ACCOUNTING                   NEW YORK
 
2). 将列名ENAME改为新列名EMPLOYEE NAME并将新列名放在两行上:
Sql>select * from emp
Department  name           Salary
---------- ---------- ----------
         10 aaa                11        
SQL> COLUMN ENAME HEADING ’Employee|Name’
Sql>select * from emp
            Employee
Department  name           Salary
---------- ---------- ---------- 
         10 aaa                11
note: the col heading turn into two lines from one line.
 
3). 改变列的显示长度:
FOR[MAT] format
Sql>select empno,ename,job from emp;
      EMPNO ENAME      JOB       
---------- ----------     ---------
       7369 SMITH      CLERK     
       7499 ALLEN      SALESMAN  
7521 WARD       SALESMAN  
Sql> col ename format a40
      EMPNO ENAME                                    JOB
----------   ----------------------------------------         ---------
       7369 SMITH                                    CLERK
       7499 ALLEN                                    SALESMAN
       7521 WARD                                    SALESMAN
 
4). 设置列标题的对齐方式
JUS[TIFY] {L[EFT]|C[ENTER]|C[ENTRE]|R[IGHT]}
SQL> col ename justify center
SQL> /
      EMPNO           ENAME                   JOB
----------   ----------------------------------------       ---------
       7369 SMITH                                    CLERK
       7499 ALLEN                                    SALESMAN
7521 WARD                                     SALESMAN
对于NUMBER型的列,列标题缺省在右边,其它类型的列标题缺省在左边
 
5). 不让一个列显示在屏幕上
NOPRI[NT]|PRI[NT]
SQL> col job noprint
SQL> /
      EMPNO           ENAME
----------     ----------------------------------------
       7369 SMITH
       7499 ALLEN
7521 WARD
 
6). 格式化NUMBER类型列的显示:
SQL> COLUMN SAL FORMAT $99,990
SQL> /
Employee
Department Name        Salary    Commission
---------- ---------- --------- ----------
30          ALLEN        $1,600    300
 
7). 显示列值时,如果列值为NULL值,用text值代替NULL值
COMM NUL[L] text
SQL>COL COMM NUL[L] text
 
8). 设置一个列的回绕方式
WRA[PPED]|WOR[D_WRAPPED]|TRU[NCATED]
        COL1
--------------------
HOW ARE YOU?
 
SQL>COL COL1 FORMAT A5
SQL>COL COL1 WRAPPED
COL1
-----
HOW A
RE YO
U?
 
SQL> COL COL1 WORD_WRAPPED
COL1
-----
HOW
ARE
YOU?
 
SQL> COL COL1 WORD_WRAPPED
COL1
-----
HOW A
 
9). 显示列的当前的显示属性值
SQL> COLUMN column_name
 
10). 将所有列的显示属性设为缺省值
SQL> CLEAR COLUMNS
 
8. 屏蔽掉一个列中显示的相同的值
BREAK ON break_column
SQL> BREAK ON DEPTNO
SQL> SELECT DEPTNO, ENAME, SAL
FROM EMP
  WHERE SAL < 2500
  ORDER BY DEPTNO;
DEPTNO      ENAME         SAL
---------- ----------- ---------
10           CLARK        2450
MILLER      1300
20            SMITH       800
ADAMS       1100
 
9. 在上面屏蔽掉一个列中显示的相同的值的显示中,每当列值变化时在值变化之前插入n个空行。
BREAK ON break_column SKIP n
 
SQL> BREAK ON DEPTNO SKIP 1
SQL> /
DEPTNO ENAME SAL
---------- ----------- ---------
10 CLARK 2450
MILLER 1300
 
20 SMITH 800
ADAMS 1100
 
10. 显示对BREAK的设置
SQL> BREAK
 
11. 删除6、7的设置
SQL> CLEAR BREAKS
 
12. Set 命令:
该命令包含许多子命令:
SET system_variable value
system_variable value 可以是如下的子句之一:
APPI[NFO]{ON|OFF|text}
ARRAY[SIZE] {15|n}
AUTO[COMMIT]{ON|OFF|IMM[EDIATE]|n}
AUTOP[RINT] {ON|OFF}
AUTORECOVERY [ON|OFF]
AUTOT[RACE] {ON|OFF|TRACE[ONLY]} [EXP[LAIN]] [STAT[ISTICS]]
BLO[CKTERMINATOR] {.|c}
CMDS[EP] {;|c|ON|OFF}
COLSEP {_|text}
COM[PATIBILITY]{V7|V8|NATIVE}
CON[CAT] {.|c|ON|OFF}
COPYC[OMMIT] {0|n}
COPYTYPECHECK {ON|OFF}
DEF[INE] {&|c|ON|OFF}
DESCRIBE [DEPTH {1|n|ALL}][LINENUM {ON|OFF}][INDENT {ON|OFF}]
ECHO {ON|OFF}
EDITF[ILE] file_name[.ext]
EMB[EDDED] {ON|OFF}
ESC[APE] {\|c|ON|OFF}
FEED[BACK] {6|n|ON|OFF}
FLAGGER {OFF|ENTRY |INTERMED[IATE]|FULL}
FLU[SH] {ON|OFF}
HEA[DING] {ON|OFF}
HEADS[EP] {||c|ON|OFF}
INSTANCE [instance_path|LOCAL]
LIN[ESIZE] {80|n}
LOBOF[FSET] {n|1}
LOGSOURCE [pathname]
LONG {80|n}
LONGC[HUNKSIZE] {80|n}
MARK[UP] HTML [ON|OFF] [HEAD text] [BODY text] [ENTMAP {ON|OFF}] [SPOOL
{ON|OFF}] [PRE[FORMAT] {ON|OFF}]
NEWP[AGE] {1|n|NONE}
NULL text
NUMF[ORMAT] format
NUM[WIDTH] {10|n}
PAGES[IZE] {24|n}
PAU[SE] {ON|OFF|text}
RECSEP {WR[APPED]|EA[CH]|OFF}
RECSEPCHAR {_|c}
SERVEROUT[PUT] {ON|OFF} [SIZE n] [FOR[MAT] {WRA[PPED]|WOR[D_
WRAPPED]|TRU[NCATED]}]
SHIFT[INOUT] {VIS[IBLE]|INV[ISIBLE]}
SHOW[MODE] {ON|OFF}
SQLBL[ANKLINES] {ON|OFF}
SQLC[ASE] {MIX[ED]|LO[WER]|UP[PER]}
SQLCO[NTINUE] {> |text}
SQLN[UMBER] {ON|OFF}
SQLPRE[FIX] {#|c}
SQLP[ROMPT] {SQL>|text}
SQLT[ERMINATOR] {;|c|ON|OFF}
SUF[FIX] {SQL|text}
TAB {ON|OFF}
TERM[OUT] {ON|OFF}
TI[ME] {ON|OFF}
TIMI[NG] {ON|OFF}
TRIM[OUT] {ON|OFF}
TRIMS[POOL] {ON|OFF}
UND[ERLINE] {-|c|ON|OFF}
VER[IFY] {ON|OFF}
WRA[P] {ON|OFF}
 
1). 设置当前session是否对修改的数据进行自动提交
SQL>SET AUTO[COMMIT] {ON|OFF|IMM[EDIATE]| n}
 
2).在用start命令执行一个sql脚本时,是否显示脚本中正在执行的SQL语句
SQL> SET ECHO {ON|OFF}
 
3).是否显示当前sql语句查询或修改的行数
SQL> SET FEED[BACK] {6|n|ON|OFF}
   默认只有结果大于6行时才显示结果的行数。如果set feedback 1 ,则不管查询到多少行都返回。当为off 时,一律不显示查询的行数
 
4).是否显示列标题
SQL> SET HEA[DING] {ON|OFF}
当set heading off 时,在每页的上面不显示列标题,而是以空白行代替
 
5).设置一行可以容纳的字符数
SQL> SET LIN[ESIZE] {80|n}
   如果一行的输出内容大于设置的一行可容纳的字符数,则折行显示。
 
6).设置页与页之间的分隔
SQL> SET NEWP[AGE] {1|n|NONE}
当set newpage 0 时,会在每页的开头有一个小的黑方框。
当set newpage n 时,会在页和页之间隔着n个空行。
当set newpage none 时,会在页和页之间没有任何间隔。
 
7).显示时,用text值代替NULL值
SQL> SET NULL text
 
8).设置一页有多少行数
SQL> SET PAGES[IZE] {24|n}
如果设为0,则所有的输出内容为一页并且不显示列标题
 
9).是否显示用DBMS_OUTPUT.PUT_LINE包进行输出的信息。
SQL> SET SERVEROUT[PUT] {ON|OFF} 
在编写存储过程时,我们有时会用dbms_output.put_line将必要的信息输出,以便对存储过程进行调试,只有将serveroutput变量设为on后,信息才能显示在屏幕上。
 
10).当SQL语句的长度大于LINESIZE时,是否在显示时截取SQL语句。
SQL> SET WRA[P] {ON|OFF}
   当输出的行的长度大于设置的行的长度时(用set linesize n命令设置),当set wrap on时,输出行的多于的字符会另起一行显示,否则,会将输出行的多于字符切除,不予显示。
 
11).是否在屏幕上显示输出的内容,主要用与SPOOL结合使用。
SQL> SET TERM[OUT] {ON|OFF}
   在用spool命令将一个大表中的内容输出到一个文件中时,将内容输出在屏幕上会耗费大量的时间,设置set termspool off后,则输出的内容只会保存在输出文件中,不会显示在屏幕上,极大的提高了spool的速度。
 
12).将SPOOL输出中每行后面多余的空格去掉
SQL> SET TRIMS[OUT] {ON|OFF} 
   
13)显示每个sql语句花费的执行时间
set TIMING  {ON|OFF}
 
14.修改sql buffer中的当前行中,第一个出现的字符串
C[HANGE] /old_value/new_
 
□阅读全文(33) | 回复(0) | 引用通告(0) | 编辑 

posted @ 2006-05-16 10:01 青蛙學堂 阅读(274) | 评论 (0)编辑 收藏

系统加密

系统的加密是我们使用电脑时经常的需求,如防止他人随意修改自己系统设置,防止他人偷窥你的私人文件,保护自己的重要资料等等。随着电脑应用的进一步普及,龙龙发现这一问题越来越引起大家的关注。今天龙龙要带给你们的就是目前几种最常用的系统加密方法,一起来看看吧。

  加密,从CMOS开始

  设置CMOS密码的操作很简单,在计算机启动时按住Del键不放,直到出现CMOS SETUP界面。用键盘上的光标键选择SUPERVISOR PASSWORD项(超级用户密码,能进入并可修改BIOS设定的密码),然后回车,出现ENTER PASSWORD后,输入密码再回车,这时又出现CONFIRM PASSWORD,再次输入同一密码;然后再在USER PASSWORD项(用户密码,只能进入但无权修改BIOS设定的密码)后回车,同上面一样,密码需输入两次。以上设置的两个密码分别为“设置密码”和“修改CMOS SETUP密码”,建议两个均用同一密码,以便记忆。

  然后选BIOS FEATURES SETUP项回车,选择PASSWORD CHECK项后,用键盘上的PAGE UP/PAGE DOWN键把选项改为SYSTEM,目的是让计算机在任何时候都要检测密码,包括启动机器;如果设置成SETUP则正常开机时不必输入密码,仅进入CMOS SETUP时才会要求你输入密码检验。这样每次开机时,系统检测完计算机硬件后,就会要求输入密码,否则系统将拒绝启动。

  

图1用软件获取BIOS密码

  有时我们忘记了自己设置的CMOS密码,怎么办?有些文章介绍过使用通用密码或DOS下的Debug命令等方法,但龙龙并不推荐。其实忘记CMOS密码时,最实用的方法一个是给CMOS放电,清除CMOS的信息;另一个就是通过软件找到密码,而这个软件就是BiosPwds。

  它是免费软件,下载网址为http://download.sina.com.cn/scgi/detail.pl?s_id=7829。使用相当简单,打开下载得到的压缩包,执行其中的Biospwds.exe文件后进入BiosPwds操作界面,要获取BIOS密码只需按下界面上的“Get Passwords”按钮,很快软件就会自动将BIOS各项信息显示于如图1的界面上,这样你便可以很轻松地得知BIOS密码。

  保护驱动器和桌面

  1.隐藏特定驱动器

  通过隐藏驱动器可以防止别人使用你的软驱或光驱,甚至还可以把你的硬盘驱动器也隐藏起来,让别人无法通过“我的电脑”和资源管理器看到或进入你的硬盘。

  在注册表编辑器左边依次双击HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer,展开Explorer分支。右击注册表编辑器右边空白处,然后执行“新建”菜单中的“二进制值”命令,在Explorer主键下新建一个名为“新值#1”的二进制值。

  

图2编辑注册表隐藏驱动器码

  右击该二进制值,然后执行快捷菜单中的“重命名”命令,将“新值#1”二进制值改名为“NoDrives”。该值就是用于设置是否隐藏某个驱动器的,它由四个二进制字节构成(缺省值为00 00 00 00)。具体来说,“NoDrives”的第一个字节代表从“A”到“H”的八个盘(其中01为A、02为B、04为C、08为D、10为E、20为F、40为G、80为H)。

  双击NoDrives,系统弹出“编辑二进制值”对话框。根据自己盘符的实际情况对“NoDrives”的值进行修改,若盘符为“D”则应修改为08000000(图2);若盘符为“E”则应修改为10000000;若盘符为“F”则应修改为20000000……(改为FF FF FF FF则可隐藏所有驱动器)。OK,重新启动Windows就可生效了。

  2.暂时离开的保护方法

  Windows在运行时给我们提供了两种方式,让你暂时离开时用密码保护你的计算机,即在等待或休眠期间,用密码和通过指定屏幕保护程序的密码来保护计算机。

  要设置在等待或休眠期间用密码保护计算机,可先打开“控制面板”中的“电源管理”,单击“高级”选项卡,选中“在计算机退出等待和休眠状态时,提示输入密码”复选框。

  要通过指定屏幕保护程序的密码来保护计算机,可打开“控制面板”中的“显示属性”,在“屏幕保护程序”选项卡的“屏幕保护程序”列表中,单击要使用的屏幕保护程序,然后选中“密码保护”复选框,然后单击“更改”,键入密码,然后再次键入它以确认该密码。

  绕不开的登录口令藏驱动器码

  当我们初次安装好Windows系统重新启动时,系统会提示我们输入登录密码,当然你可以不输入密码直接点击“取消”、按“Esc键”或直接点击“确定”进入系统(如果点击“确定”进入系统,以后系统启动时将不出现登录窗口)。这样的系统登录密码简直形同虚设,不过我们可以给它动个小手术,让它能起到一定的加密作用。

  首先在“控制面板→用户”中设置可以登录本机的授权用户。然后点击“开始→运行”,在弹出的窗口中输入“Regedit”并运行,打开注册表编辑窗口。然后在HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Current Version\Winlogon中新建DWORD值,命名为Mustbevalidated,并将它的键值设置为“1”。这样没有正确密码的人便无法直接跳过你的登录密码窗口进入你的系统了。

  

图3利用查找功能找到PWL文件

  如果万一忘记了登录密码,你可以通过修改注册表取消以上功能。另外还有一招更有效,那就是直接删除登录文件。

  登录文件的形式为*.pwl,“*”是你登录的用户名,所以你可以很方便地找到该文件(在Windows 98中,它位于Windows的安装目录下)(图3),只要把它删除掉,你就又可以直接登录系统了。

  专门的加密软件

  如果想真正给系统加一把“锁”,龙龙觉得使用专门的系统加密软件是很有必要的。

  1.视窗锁王

  下载地址:http://download.sina.com.cn/scgi/detail.pl?s_id=7830

  视窗锁王主要功能有:可以对硬盘上的任意分区、目录实现加密隐藏、防删除、防改写(只读);修改控制面板设置;设置系统安全选项,抗恶性病毒传染,资料防窃等等。

  安装完成重新启动后,软件自动进入后台运行,你可以按“Alt+F12”进入软件设置(初始密码为空),点选其中选项可进入分项设置(图4),如隐藏驱动器或目录、修改系统安全设置等,操作起来相当方便。

  2、LockPC

  下载地址:http://download.sina.com.cn/scgi/detail.pl?s_id=4299

  LockPC是一个简单实用的电脑安全防护软件,当你的电脑中储存相当重要的资料,或者是正在执行某些重要的程序运算,你离开一会儿又担心被旁人干扰,就可以用这个LockPC“锁”上你的电脑。软件安装后,当你启动电脑的时候LockPC便会自动启动在系统状态栏中,你要暂时离开坐位的时候只要在系统状态栏的LockPC上按一下,它就会接管整个系统运作了。如果要解除LockPC的防护状态,必须输入你所预设的密码,否则LockPC将会忠实地将你的系统一直“锁”下去。另外点击“Hint”可以在你忘记设置的密码时进行必要的提醒。(福建罗庆锋)

  

图4视窗锁王的界面相当简洁

  3、超级兔子安全视窗

  下载:http://download.sina.com.cn/scgi/detail.pl?s_id=7831

  超级兔子系列软件,它给我们的系统提供了最简单实用的安全管理功能,软件设置了三大功能可独立使用又可结合使用。它们分别为:开机输入密码、保护文件不受别人破坏、只允许你的电脑使用你指定的软件。特别是与众不同的“只允许使用指定软件”功能,不需要软件自身,由Windows自行管理软件,配合超级兔子魔法设置的安全设置,安全效果相当不错。

posted @ 2006-04-11 16:30 青蛙學堂 阅读(434) | 评论 (0)编辑 收藏

系統進程

最基本的系统进程(也就是说,这些进程是系统运行的基本条件,有了这些进程,系统就能正常运行)

smss.exe Session Manager
csrss.exe 子系统服务器进程
winlogon.exe 管理用户登录
services.exe 包含很多系统服务
lsass.exe 管理 IP 安全策略以及启动 ISAKMP/Oakley (IKE) 和 IP 安全驱动程序。(系统服务) 产生会话密钥以及授予用于交互式客户/服务器验证的服务凭据(ticket)。(系统服务) ->netlogon
svchost.exe 包含很多系统服务 !!!->eventsystem,(SPOOLSV.EXE 将文件加载到内存中以便迟后打印。)
explorer.exe 资源管理器 (internat.exe 托盘区的拼音图标)

====================================================================

附加的系统进程(这些进程不是必要的,你可以根据需要通过服务管理器来增加或减少)

mstask.exe 允许程序在指定时间运行。(系统服务)->schedule
regsvc.exe 允许远程注册表操作。(系统服务)->remoteregister
winmgmt.exe 提供系统管理信息(系统服务)。
inetinfo.exe->msftpsvc,w3svc,iisadmn
tlntsvr.exe->tlnrsvr
tftpd.exe 实现 TFTP Internet 标准。该标准不要求用户名和密码。远程安装服务的一部分。(系统服务)
termsrv.exe ->termservice
dns.exe 应答对域名系统(DNS)名称的查询和更新请求。(系统服务)

=================================================================
以下全是系统服务,并且很少会用到,如果你暂时用不着,应该关掉(对安全有害 )

tcpsvcs.exe 提供在 PXE 可远程启动客户计算机上远程安装 Windows 2000 Professional 的能力。(系统服务)->simptcp 支持以下 TCP/IP 服务:Character Generator,Daytime,Discard, Echo, 以及 Quote of the Day。(系统服务)
ismserv.exe 允许在 Windows Advanced Server 站点间发送和接收消息。(系统服务)
ups.exe 管理连接到计算机的不间断电源(UPS)。(系统服务)
wins.exe 为注册和解析 NetBIOS 型名称的 TCP/IP 客户提供 NetBIOS 名称服务。(系统服务)
llssrv.exe License Logging Service(system service)
ntfrs.exe 在多个服务器间维护文件目录内容的文件同步。(系统服务)
RsSub.exe 控制用来远程储存数据的媒体。(系统服务)
locator.exe 管理 RPC 名称服务数据库.->rpclocator(区 RpcSs)
lserver.exe 注册客户端许可证。(系统服务)
dfssvc.exe 管理分布于局域网或广域网的逻辑卷。(系统服务)
clipsrv.exe 支持“剪贴簿查看器”,以便可以从远程剪贴簿查阅剪贴页面。(系统服务)
msdtc.exe 并列事务,是分布于两个以上的数据库,消息队列,文件系统,或其它事务保护资源管理器。(系统服务)
faxsvc.exe 帮助您发送和接收传真。(系统服务)
cisvc.exe Indexing Service(system service)!!!
dmadmin.exe 磁盘管理请求的系统管理服务。(系统服务)
mnmsrvc.exe 允许有权限的用户使用 NetMeeting 远程访问 Windows 桌面。(系统服务)
netdde.exe 提供动态数据交换 (DDE) 的网络传输和安全特性。(系统服务)
smlogsvc.exe 配置性能日志和警报。(系统服务)
rsvp.exe 为依赖质量服务(QoS)的程序和控制应用程序提供网络信号和本地通信控制安装功能。(系统服务)
RsEng.exe 协调用来储存不常用数据的服务和管理工具。(系统服务)
RsFsa.exe 管理远程储存的文件的操作。(系统服务)
grovel.exe 扫描零备份存储(SIS)卷上的重复文件,并且将重复文件指向一个数据存储点,以节省磁盘空间。(系统服务)
SCardSvr.exe 对插入在计算机智能卡阅读器中的智能卡进行管理和访问控制。(系统服务)
snmp.exe 包含代理程序可以监视网络设备的活动并且向网络控制台工作站汇报。(系统服务)
snmptrap.exe 接收由本地或远程 SNMP 代理程序产生的陷阱消息,然后将消息传递到运行在这台计算机上 SNMP 管理程序。(系统服务)
UtilMan.exe 从一个窗口中启动和配置辅助工具。(系统服务)
msiexec.exe 依据 .MSI 文件中包含的命令来安装、修复以及删除软件。(系统服务)

参考资料:http://www.netsfamily.com/dispbbs.asp?boardID=28&ID=81&page=1
回答者:KingTown - 魔法师 五级 11-23 20:51
taskmge.exe 任务管理器的进程,关掉他就关掉了任务管理器。
CDAC11BA.exe这个是系统加密软件,可以关掉,但是需要服务的话他又会出来。
ctfmon.exe系统进程,不能关掉。
svchost.exe系统加载服务的,经常会出现几个在,如果服务多的话有可能达到四个,五个之多。不能关掉。
lsass.exe系统进程,不能关掉。
services.exe系统进程,不能关掉。
winlogon.exe系统进程,不能关掉。
csrss.exe系统进程,不能关掉。
smss.exe系统进程,不能关掉。
explorer.exe系统桌面程序,能够关掉,但是桌面是一片空白,不能他自己能够再运行,如果不自动运行的话可以在任务管理器的文件—>运行下面输入explorer回车就可以运行。
conime.exe系统进程,不能关掉。
system系统进程,不能关掉。
system Idle Process系统进程,不能关掉。

Timplatform.exe QQ一个服务的进程,可以关掉,但是你要用QQ的话他又会出现。

这些是从我的任务管理器中找出来的。系统进程都在里面,但是没有写杀毒软件什么的进去。
各人的电脑其它都不一定相同,但是这些基本上是一样的。

posted @ 2006-04-11 16:20 青蛙學堂 阅读(240) | 评论 (0)编辑 收藏

防火墻一

一)防火墙介绍

防火墙是一种功能,它使得内部网络和外部网络或Internet互相隔离,以此来保护内部网络或主机。简单的防火墙可以由Router,3 Layer Switch的ACL(access control list)来充当,也可以用一台主机,甚至是一个子网来实现。复杂的可以购买专门的硬件防火墙或软件防火墙来实现。

防火墙的功能有:

1、过滤掉不安全服务和非法用户

2、控制对特殊站点的访问

3、提供监视Internet安全和预警的方便端点

防火墙并不是万能的,也有很多防火墙无能为力的地方:

1、防火墙防不住绕过防火墙的攻击。比如,防火墙不限制从内部网络到外部网络的连接,那么,一些内部用户可能形成一个直接通往Internet的连接,从而绕过防火墙,造成一个潜在的backdoor.恶意的外部用户直接连接到内部用户的机器上,以这个内部用户的机器为跳板,发起绕过防火墙的不受限制的攻击。

2、防火墙不是防毒墙,不能拦截带病毒的数据在网络之间传播。

3、防火墙对数据驱动式攻击也无能为力。

因此,我们不能过分依赖防火墙。网络的安全是一个整体,并不是有某一样特别出色的配置。网络安全遵循的是“木桶原则”。

一般防火墙具备以下特点:

1、广泛的服务支持:通过将动态的、应用层的过滤能力和认证相结合,可实现WWW浏览器、HTTP服务器、 FTP等;

2、对私有数据的加密支持:保证通过Internet进行虚拟私人网络和商务活动不受损坏;

3、客户端认证只允许指定的用户访问内部网络或选择服务:企业本地网与分支机构、商业伙伴和移动用户间安全通信的附加部分;

4、反欺骗:欺骗是从外部获取网络访问权的常用手段,它使数据包好似来自网络内部。防火墙能监视这样的数据包并能扔掉它们;

5、C/S模式和跨平台支持:能使运行在一平台的管理模块控制运行在另一平台的监视模块。

让我们来看看传统的防火墙工作原理及优缺点:

1.(传统的)包过滤防火墙的工作原理

包过滤是在IP层实现的,因此,它可以只用路由器完成。包过滤根据包的源IP地址、目的IP地址、源端口、目的端口及包传递方向等报头信息来判断是否允许包通过。过滤用户定义的内容,如IP地址。其工作原理是系统在网络层检查数据包,与应用层无关,包过滤器的应用非常广泛,因为CPU用来处理包过滤的时间可以忽略不计。而且这种防护措施对用户透明,合法用户在进出网络时,根本感觉不到它的存在,使用起来很方便。这样系统就具有很好的传输性能,易扩展。但是这种防火墙不太安全,因为系统对应用层信息无感知——也就是说,它们不理解通信的内容,不能在用户级别上进行过滤,即不能识别不同的用户和防止IP地址的盗用。如果攻击者把自己主机的IP地址设成一个合法主机的IP地址,就可以很轻易地通过包过滤器,这样更容易被黑客攻破。 基于这种工作机制,包过滤防火墙有以下缺陷:

通信信息:包过滤防火墙只能访问部分数据包的头信息;

通信和应用状态信息:包过滤防火墙是无状态的,所以它不可能保存来自于通信和应用的状态信息;

信息处理:包过滤防火墙处理信息的能力是有限的。

比如针对微软IIS漏洞的Unicode攻击,因为这种攻击是走的防火墙所允许的80端口,而包过滤的防火墙无法对数据包内容进行核查,因此此时防火墙等同于虚设,未打相应patch的提供web服务的系统,即使在防火墙的屏障之后,也会被攻击者轻松拿下超级用户的权限。

包过滤防火墙的缺点和不足,可以在应用层解决。下面我们来看看应用层网关。

2.应用网关

1、应用代理服务器(Application Gateway Proxy)

在网络应用层提供授权检查及代理服务。当外部某台主机试图访问受保护网络时,必须先在防火墙上经过身份认证。通过身份认证后,防火墙运行一个专门为该网络设计的程序,把外部主机与内部主机连接。在这个过程中,防火墙可以限制用户访问的主机、访问时间及访问的方式。同样,受保护网络内部用户访问外部网时也需先登录到防火墙上,通过验证后,才可访问。

应用网关代理的优点是既可以隐藏内部IP地址,也可以给单个用户授权,即使攻击者盗用了一个合法的IP地址,也通不过严格的身份认证。因此应用网关比报文过滤具有更高的安全性。但是这种认证使得应用网关不透明,用户每次连接都要受到认证,这给用户带来许多不便。这种代理技术需要为每个应用写专门的程序。

2、回路级代理服务器

即通常意义的代理服务器,它适用于多个协议,但不能解释应用协议,需要通过其他方式来获得信息,所以,回路级代理服务器通常要求修改过的用户程序。

套接字服务器(Sockets Server)就是回路级代理服务器。套接字(Sockets)是一种网络应用层的国际标准。当受保护网络客户机需要与外部网交互信息时,在防火墙上的套服务器检查客户的User ID、IP源地址和IP目的地址,经过确认后,套服务器才与外部的服务器建立连接。对用户来说,受保护网与外部网的信息交换是透明的,感觉不到防火墙的存在,那是因为网络用户不需要登录到防火墙上。但是客户端的应用软件必须支持 “Socketsified API”,受保护网络用户访问公共网所使用的IP地址也都是防火墙的IP地址。

3、代管服务器

代管服务器技术是把不安全的服务如FTP、Telnet等放到防火墙上,使它同时充当服务器,对外部的请求作出回答。与应用层代理实现相比,代管服务器技术不必为每种服务专门写程序。而且,受保护网内部用户想对外部网访问时,也需先登录到防火墙上,再向外提出请求,这样从外部网向内就只能看到防火墙,从而隐藏了内部地址,提高了安全性。

4、IP通道(IP Tunnels)

如果一个大公司的两个子公司相隔较远,通过Internet通信。这种情况下,可以采用IP Tunnels来防止Internet上的黑客截取信息,从而在Internet上形成一个虚拟的企业网。

5、网络地址转换器(NAT Network Address Translate)

当受保护网连到Internet上时,受保护网用户若要访问Internet,必须使用一个合法的IP地址。但由于合法Internet IP地址有限,而且受保护网络往往有自己的一套IP地址规划(非正式IP地址)。网络地址转换器就是在防火墙上装一个合法IP地址集。当内部某一用户要访问Internet时,防火墙动态地从地址集中选一个未分配的地址分配给该用户,该用户即可使用这个合法地址进行通信。同时,对于内部的某些服务器如Web服务器,网络地址转换器允许为其分配一个固定的合法地址。外部网络的用户就可通过防火墙来访问内部的服务器。这种技术既缓解了少量的IP地址和大量的主机之间的矛盾,又对外隐藏了内部主机的IP地址,提高了安全性。

6、隔离域名服务器(Split Domain Name Server )

这种技术是通过防火墙将受保护网络的域名服务器与外部网的域名服务器隔离,使外部网的域名服务器只能看到防火墙的IP地址,无法了解受保护网络的具体情况,这样可以保证受保护网络的IP地址不被外部网络知悉。

7、邮件技术(Mail Forwarding)

当防火墙采用上面所提到的几种技术使得外部网络只知道防火墙的IP地址和域名时,从外部网络发来的邮件,就只能送到防火墙上。这时防火墙对邮件进行检查,只有当发送邮件的源主机是被允许通过的,防火墙才对邮件的目的地址进行转换,送到内部的邮件服务器,由其进行转发。

应用网关是检查所有应用层的信息包,并将检查的内容信息放入决策过程,这样安全性有所提高。然而,它们是通过打破客户机/服务器模式实现的,每一个客户机/服务器通信需要两个连接:一个是从客户端到防火墙,另一个是从防火墙到服务器。另外,每一个代理需要一个不同的应用进程,或一个后台运行的服务程序,这样如果有一个新的应用就必须添加对此应用的服务程序,否则不能使用该种服务,可伸缩性差。 基于这种工作机制,应用网关防火墙有以下缺陷:

连接限制:每一个服务需要自己的代理,所以可提供的服务数和伸缩性受到限制;

技术限制:应用网关不能为UDP、RPC及普通协议族的其他服务提供代理;

性能:实现应用网关防火墙牺牲了一些系统性能。

防火墙的体系结构及组合形式

1、屏蔽路由器(Screening Router)

这是防火墙最基本的构件。它可以由厂家专门生产的路由器实现,也可以用主机来实现。屏蔽路由器作为内外连接的唯一通道,要求所有的报文都必须在此通过检查。路由器上可以装基于IP层的报文过滤软件,实现报文过滤功能。许多路由器本身带有报文过滤配置选项,但一般比较简单。

单纯由屏蔽路由器构成的防火墙的危险带包括路由器本身及路由器允许访问的主机。它的缺点是一旦被攻陷后很难发现,而且不能识别不同的用户。

2、双宿主机网关(Dual Homed Gateway)

任何拥有多个接口卡的系统都被称为多宿的,双宿主机网关是用一台装有两块网卡的主机做防火墙。两块网卡各自与受保护网和外部网相连。主机上运行着防火墙软件,可以转发应用程序,提供服务等。

双宿主机网关优于屏蔽路由器的地方是:堡垒主机的系统软件可用于维护系统日志、硬件拷贝日志或远程日志。这对于日后的检查很有用。但这不能帮助网络管理者确认内网中哪些主机可能已被黑客入侵。

双宿主机网关的一个致命弱点是:一旦入侵者侵入堡垒主机并使其只具有路由功能,则任何网上用户均可以随便访问内网。

3、被屏蔽主机网关(Screened Host Gateway)

屏蔽主机网关易于实现也很安全,因此应用广泛。例如,一个分组过滤路由器连接外部网络,同时一个堡垒主机安装在内部网络上,通常在路由器上设立过滤规则,并使这个堡垒主机成为从外部网络唯一可直接到达的主机,这确保了内部网络不受未被授权的外部用户的攻击。

如果受保护网是一个虚拟扩展的本地网,即没有子网和路由器,那么内网的变化不影响堡垒主机和屏蔽路由器的配置。危险带限制在堡垒主机和屏蔽路由器。网关的基本控制策略由安装在上面的软件决定。如果攻击者设法登录到它上面,内网中的其余主机就会受到很大威胁。这与双穴主机网关受攻击时的情形差不多。

4、被屏蔽子网 (Screened Subnet)

这种方法是在内部网络和外部网络之间建立一个被隔离的子网,用两台分组过滤路由器将这一子网分别与内部网络和外部网络分开。在很多实现中,两个分组过滤路由器放在子网的两端,在子网内构成一个“非军事区”DMZ。有的屏蔽子网中还设有一堡垒主机作为唯一可访问点,支持终端交互或作为应用网关代理。这种配置的危险带仅包括堡垒主机、子网主机及所有连接内网、外网和屏蔽子网的路由器。

如果攻击者试图完全破坏防火墙,他必须重新配置连接三个网的路由器,既不切断连接又不要把自己锁在外面,同时又不使自己被发现,这样也还是可能的。但若禁止网络访问路由器或只允许内网中的某些主机访问它,则攻击会变得很困难。在这种情况下,攻击者得先侵入堡垒主机,然后进入内网主机,再返回来破坏屏蔽路由器,整个过程中不能引发警报。

建造防火墙时,一般很少采用单一的技术,通常是多种解决不同问题的技术的组合。这种组合主要取决于网管中心向用户提供什么样的服务,以及网管中心能接受什么等级风险。采用哪种技术主要取决于经费,投资的大小或技术人员的技术、时间等因素。一般有以下几种形式:

1、使用多堡垒主机;

2、合并内部路由器与外部路由器;

3、合并堡垒主机与外部路由器;

4、合并堡垒主机与内部路由器;

5、使用多台内部路由器;

6、使用多台外部路由器;

7、使用多个周边网络;

8、使用双重宿主主机与屏蔽子网。

随着人们对网络安全意识的提高,防火墙的应用越来越广泛。有钱的用高级硬件防火墙,没钱的用免费的软件防火墙。那么,硬件防火墙和软件防火墙相比,有哪些优点呢?

硬件防火墙采用专用的硬件设备,然后集成生产厂商的专用防火墙软件。从功能上看,硬件防火墙内建安全软件,使用专属或强化的操作系统,管理方便,更换容易,软硬件搭配较固定。硬件防火墙效率高,解决了防火墙效率、性能之间的矛盾,可以达到线性。

软件防火墙一般基于某个操作系统平台开发,直接在计算机上进行软件的安装和配置。由于客户平台的多样性,软件防火墙需支持多操作系统,如Unix、Linux、SCO-Unix、Windows等,代码庞大、安装成本高、售后支持成本高、效率低。

1、性能优势。防火墙的性能对防火墙来说是至关重要的。它决定了每秒钟通过防火墙的数据流量。单位是Bps,从几十M到几百M不等,还有千兆防火墙甚至达到几G的防火墙。而软件防火墙则不可能达到如此高的速率。

2、CPU占用率的优势。硬件防火墙的CPU占用率当然是0了,而软件防火墙就不同了,如果处于节约成本的考虑将防火墙软件安装在提供服务的主机上,当数据流量较大时,CPU占用率将是主机的杀手,将拖跨主机。

3、售后支持。硬件防火墙厂家会对防火墙产品有跟踪的服务支持,而软件防火墙的用户能得到这种机会的相对较少,而且厂家也不会在软件防火墙上下太大的功夫和研发经费。

(二)防火墙渗透

以上我们简单的介绍了防火墙的原理,分类,优缺点等。下面,我们将对防火墙的渗透技术做一下简单的介绍。

精心配置过的防火墙固然将让绝大多数crackers挡在外围,掌握网络控制的主动权,但是,防火墙并不是万能的,我们也在上一节的内容中简单的讲了防火墙的缺点。没有任何一样网络产品可以说是绝对安全的。绿盟的san的一篇的文章介绍了渗透防火墙的shellcode,有兴趣的朋友可以参考一下:http://www.winnerinfo.net/infoview.asp?Kind=145&ID=529 ,我在这里想再提起“通道技术”。

说到通道技术,我想再提一下“端口复用”,很多朋友以为通道技术就是端口复用技术。那么,错了,端口复用是指一个端口上建立了多个连接,而不是在一个端口上面开放了多个服务而互不干扰。假如你想在已经开放了WWW服务的主机上,在80端口再添加一项服务,只有2种可能:1.添加服务失败 2.WWW服务出错。那么什么是通道呢?这里所谓的通道,是指一种绕过防火墙端口屏蔽的通讯方式。防火墙两端的数据包封装在防火墙所允许通过的数据包类型或是端口上,然后穿过防火墙与处在防火墙后面的主机通讯,当封装的数据包到达目的地时,再将数据包还原,并将还原后的数据包交送到相应的服务上,是在一个端口上面开放了多个服务而互不干扰的。

为了通信,不论是什么防火墙,都不可能把所有的服务,所有的端口都封闭。(如果有那样的防火墙,还不如拔网线来的直接,呵呵)大多数的防火墙或多或少都要开放一个端口或服务(比如HTTP),只要开放了端口和服务,就给了我们渗透的可能。HTTP是一种比较简单而常用的互交式协议,你给服务器发送一个请求,服务器就返回给你一个回应。几乎所有的主机都被允许发送HTTP请求。网络上HTTP协议使用的是如此广泛,这也决定了我们可以通过使用通道技术而轻松的通过防火墙或其他类似设备而将我们需要的数据发送至目标。一个很典型的例子就是http-tunnel.

在http-tunnel的官方网站http://www.http-tunnel.com上有这么一句话:“http-tunnel在HTTP请求中建立了一个双向的虚拟数据连接。HTTP请求可以经过代理而被发送,这就可以被那些处在限制了端口的防火墙背后的用户使用。如果通过HTTP代理的WWW浏览是被允许的,那么http-tunnel也就可以成立,也就是说,可以在防火墙外telnet或者PPP到防火墙的内部。”这样看来,攻击者可以使用这种技术来实现远程控制。我们来看看http-tunnel的设计思路:

A主机在防火墙的外面,没有做任何限制。B主机在防火墙内部,受到防火墙保护,防火墙配置的访问控制原则是只允许80端口的数据进出,但主机开放了telnet服务。现在假设需要从A系统Telnet到B系统上去,怎么办?使用正常的telnet肯定是不可能了,因为telnet使用的23端口被防火墙屏蔽,防火墙收到这个telnet的包后,发现不符合只允许80端口的数据通过的过滤原则,就丢弃了。但我们知道可用的有80端口,那么这个时候使用Httptunnel通道,就是一个好的办法,思路如下:

在A机器上运行tunnel的客户端,让它侦听本机的一个不被使用的任意指定端口(最好是1024以上65535以下),如,8888。同时将来自8888端口上的数据指引到B机的80端口上,因为是80端口,防火墙是允许通过的。然后在B机上起一个服务端,(在只有80端口对外开放的情况下,只能先得到一个WEBSHELL,想办法提升自己的权限,并运行服务端)同样挂接在80端口上,同时指引80端口的来自客户端的转发到本机的telnet服务端口23,这样就OK了。现在在A机上telnet本机端口8888,根据刚才的设置数据包会被转发到目标端口为80的B机,因为防火墙允许通过80端口的数据,因此数据包畅通的穿过防火墙,到达B机。此时B机在80端口侦听的进程收到来自A的数据包,会将数据包还原,再交还给telnet进程。当数据包需要由B到A返回时,将由80端口再回送,同样可以顺利的通过防火墙。

上述功能似乎用端口映射也能做的到,把A主机上的23端口重定向到80端口,再把B主机上的80端口重定向到23端口就行了。但如果B主机已经开启了WWW服务了呢?要使用上述功能,使用端口映射必须牺牲B主机的80端口,这是得不偿失的。试想在一次渗透防火墙的对某台主机的攻击中,把别人本来已经开启的WWW服务DOWN了,你还能在这台主机上呆多久?但是,使用http-tunnel就可以完美实现,即使B主机已经开放80,提供WWW,我们也照样可以发送telnet到其80端口上,享受到“正版”的telnet服务。

对于通道技术,我们的解决方案是采用应用层的数据包检测技术,因为在正常的HTTP请求中,GET、POST等行为是必不可少的,如果来自一个连接的HTTP请求中,总是没有GET、POST,那么这个连接肯定有问题。从而终止此连接。现在已经有公司的IDS产品能够查出隐藏在80中的tunnel,但是这些IDS产品的费用恐怕也不是中小型企业能承受的了的。

对于防火墙的渗透,还有一些方法,比如找防火墙本身的设计缺陷等等,但那些难度太大。恐怕不是我们应该考虑的了。

总结:

我们又把防火墙和防火墙的渗透深入浅出的复习了一遍。现在我们应该更清楚的知道,防火墙不是万能的,即使是经过精心配置的防火墙也抵挡不住隐藏在看似正常数据下的通道程序。那么,对于一个网络来说,我们应该怎么做才能够保证它的最大安全呢?

1.根据需要合适的配置防火墙,尽量少开端口。

2.采用过滤严格的WEB程序。

3.采用加密的HTTP协议(HTTPS)。

4.如果条件允许,购买一台功能较强大的NIDS。

5.管理好你的内网用户,防止攻击者和内网用户直接连接绕过防火墙。

6.经常升级你的firewall产品。(T114)

posted @ 2006-04-11 14:18 青蛙學堂 阅读(191) | 评论 (1)编辑 收藏

共享上網

"Internet连接共享",曾出现在Windows 98(SE)/Me/2000的功能,现在在Windows XP中得以完善和增强,它让局域网内的多台PC,通过其中一台已与Internet连接的PC来连接Internet,从而达到多台PC共享一条Internet连接线路上网的目的,并提供防火墙的保护。

   由于实现共享上网的网络结构有很多种,不能一一列举,所以在此选取了两种典型的网络结构来介绍Windows XP的"Internet连接共享"。

   一、局域网内多于两台PC,Internet接入方式为宽带接入

   1.网络结构图如下


   说明:网关主机装有两个网卡,其中网卡A1通过ADSL、Cable Modem或以太网口(多出现在宽带住宅小区、智能商业大厦和校园网)等宽带方式接入Internet,网卡A2跟集线器或交换机相连,与PC1和PC2处于同一局域网内。PC1和PC2各装有一个网卡跟集线器或交换机相连,在局域网内,通过共享网关主机的Internet 连接来上网。如果局域网内增加了PC,只需把新PC接到集线器或交换机就可上网。

2.网关主机的设置

   操作系统是Windows XP,"开始"->"控制面板"->"网络和Internet连接"->"网络连接",就会看到两个网卡的连接图标。


   "Local Area Connection 1"即网卡A1,与Internet连接;"Local Area Connection 2"即网卡A2,联于局域网。"Local Area Connection 1"的TCP/IP设置应视不同的宽带接入方式而不同,可以是自动获取IP地址和DNS,也可以配固定IP地址和DNS(由ISP提供给你的),用户应按ISP提供的使用说明来配置,这里不作详述了。

   下面我们就要把这个Internet连接共享出来,右击"Local Area Connection 1"->"属性"->"高级",把"Internet连接防火墙"和"Internet连接共享"的三项钩选,


   按"确定",此时会出现一对话框提示会改变另一网卡的TCP/IP设置,按"Yes"。


   这样共享就启用,网卡图标变成这个样子。

现在我们查看"Local Area Connection 2"的TCP/IP设置,右击"Local Area Connection 2"->"属性"->"Internet Protocol (TCP/IP)"->"属性",看到IP地址被系统设置为192.168.0.1。


   这个IP地址是可改变的,根据本局域网的使用者的具体要求而定了,但在本例中我们不作修改,按取消退出此对话框。网关主机的设置完成,已经共享了Internet连接并有防火墙功能,可保护整个局域网内的所有机器不被非法访问。

   3.局域网内PC1的配置

   操作系统可以是任何网络操作系统,除了Windows系列,还可以是Linux或Unix。只要设置网卡的IP地址、子网掩码、默认网关和DNS。IP地址设为与网关主机网卡A2处于同一子网的地址,但不能重复,子网掩码跟网关主机网卡A2的一样,默认网关和DNS设为网关主机的网卡A2的IP地址。如果是Windows XP系统,可按下图设置。


   确定后,打开IE就可以上网了,当然前提是网关主机已经连接上Internet。

4.局域网内PC2的配置

   PC2的设置跟PC1基本相同,只是IP地址不同,如上例PC1的IP地址是192.168.0.2,那么PC2的IP地址就可以设为192.168.0.3,只要是本子网内没用过的IP地址就行了。

   5.网关主机内的防火墙设置

   假如网关主机开启了远程桌面(《Windows XP远程体验》中介绍过)的功能,同时又开启了防火墙,Internet上的其他在线用户是不能远程登录你的系统的,但如果你希望一位专家远程登录到本局域网内的任何一台PC(包括网关主机,这台PC要具备远程桌面的功能),帮自己解决难题呢,那就按以下操作吧:(以刚才的网关主机为例子说明)右击"Local Area Connection 1"->"属性"->"高级"->"设置",钩选"远程桌面",


   输入要被专家登陆的机器的IP地址或计算机名,按三次"确定"完成,专家就可透过防火墙登陆到本局域网内的任何一台PC。


   同样的方法,可以控制局域网的Web服务或FTP服务等是否可以对外开放,只要像刚才那样钩选不同的服务即可。

二、局域网内只有两台PC,Internet接入方式为普通电话拨号

   1.网络结构图如下


   说明:网关主机跟一个普通的与电话线相连的Modem连接,还装有一个网卡。PC1也装有一个网卡,两个网卡用交叉线相连(网上有许多介绍交叉线做法的文章),构成最简单的局域网,PC1共享网关主机的Internet 连接来上网。这种网络结构是不适合扩展的。

   2.网关主机的设置

   操作系统是Windows XP。绝大多数的Modem会被系统自动识别并安装驱动,下面我们就来建一个新的拨号连接:"开始"->"控制面板"->"网络和Internet连接"->"网络连接"->"创建一个新的连接"->"下一步"->"连接到Internet"->"下一步"->"手动设置我的连接"->"下一步"->"用拨号调制解调器连接"->"下一步"->输入ISP名称:中国电信96169 ->"下一步" ->输入拨号的电话号码,如96169->"下一步"->输入用户名和密码->"下一步"->"完成"。网络连接中多了一个拨号的图标。


   要共享这个Internet连接只要右击拨号图标->"属性"->"高级",以后的设置就跟案例一里所说的一样了,包括跟局域网相连的那个网卡的设置。

   3.局域网内PC的配置

   跟案例一中的PC1的设置一样.防火墙的设置如上所述。只要网关主机拨号上网后,这个小型局域网共享上网的模式即可运作起来。

   随着宽带网络的普及,家庭内组建小型局域网并共享Internet连接资源来上网的模式将会越来越多,Windows XP为这种模式提供了廉价、安全、简洁和易维护的解决方案。

posted @ 2006-04-11 13:58 青蛙學堂 阅读(240) | 评论 (1)编辑 收藏

仅列出标题
共43页: First 26 27 28 29 30 31 32 33 34 Last 
<2024年5月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

导航

统计

常用链接

留言簿(8)

随笔分类

随笔档案

收藏夹

青蛙学堂

最新评论

阅读排行榜

评论排行榜