qileilove

blog已经转移至github,大家请访问 http://qaseven.github.io/

JVM调优总结:一些概念

数据类型

  Java虚拟机中,数据类型可以分为两类:基本类型和引用类型。基本类型的变量保存原始值,即:他代表的值就是数值本身;而引用类型的变量保存引用值。“引用值”代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置。

  基本类型包括:byte,short,int,long,char,float,double,Boolean,returnAddress

  引用类型包括:类类型,接口类型和数组。

  堆与栈

  堆和栈是程序运行的关键,很有必要把他们的关系说清楚。

  栈是运行时的单位,而堆是存储的单位。

  栈解决程序的运行问题,即程序如何执行,或者说如何处理数据;堆解决的是数据存储的问题,即数据怎么放、放在哪儿。

  在Java中一个线程就会相应有一个线程栈与之对应,这点很容易理解,因为不同的线程执行逻辑有所不同,因此需要一个独立的线程栈。而堆则是所有线程共享的。栈因为是运行单位,因此里面存储的信息都是跟当前线程(或程序)相关信息的。包括局部变量、程序运行状态、方法返回值等等;而堆只负责存储对象信息。

  为什么要把堆和栈区分出来呢?栈中不是也可以存储数据吗?

  第一,从软件设计的角度看,栈代表了处理逻辑,而堆代表了数据。这样分开,使得处理逻辑更为清晰。分而治之的思想。这种隔离、模块化的思想在软件设计的方方面面都有体现。

  第二,堆与栈的分离,使得堆中的内容可以被多个栈共享(也可以理解为多个线程访问同一个对象)。这种共享的收益是很多的。一方面这种共享提供了一种有效的数据交互方式(如:共享内存),另一方面,堆中的共享常量和缓存可以被所有栈访问,节省了空间。

  第三,栈因为运行时的需要,比如保存系统运行的上下文,需要进行地址段的划分。由于栈只能向上增长,因此就会限制住栈存储内容的能力。而堆不同,堆中的对象是可以根据需要动态增长的,因此栈和堆的拆分,使得动态增长成为可能,相应栈中只需记录堆中的一个地址即可。

  第四,面向对象就是堆和栈的完美结合。其实,面向对象方式的程序与以前结构化的程序在执行上没有任何区别。但是,面向对象的引入,使得对待问题的思考方式发生了改变,而更接近于自然方式的思考。当我们把对象拆开,你会发现,对象的属性其实就是数据,存放在堆中;而对象的行为(方法),就是运行逻辑,放在栈中。我们在编写对象的时候,其实即编写了数据结构,也编写的处理数据的逻辑。不得不承认,面向对象的设计,确实很美。

在Java中,Main函数就是栈的起始点,也是程序的起始点。

  程序要运行总是有一个起点的。同C语言一样,java中的Main就是那个起点。无论什么java程序,找到main就找到了程序执行的入口:)

  堆中存什么?栈中存什么?

  堆中存的是对象。栈中存的是基本数据类型和堆中对象的引用。一个对象的大小是不可估计的,或者说是可以动态变化的,但是在栈中,一个对象只对应了一个4btye的引用(堆栈分离的好处:))。

  为什么不把基本类型放堆中呢?因为其占用的空间一般是1~8个字节——需要空间比较少,而且因为是基本类型,所以不会出现动态增长的情况——长度固定,因此栈中存储就够了,如果把他存在堆中是没有什么意义的(还会浪费空间,后面说明)。可以这么说,基本类型和对象的引用都是存放在栈中,而且都是几个字节的一个数,因此在程序运行时,他们的处理方式是统一的。但是基本类型、对象引用和对象本身就有所区别了,因为一个是栈中的数据一个是堆中的数据。最常见的一个问题就是,Java中参数传递时的问题。

  Java中的参数传递时传值呢?还是传引用?

  要说明这个问题,先要明确两点:

  1、不要试图与C进行类比,Java中没有指针的概念

  2、程序运行永远都是在栈中进行的,因而参数传递时,只存在传递基本类型和对象引用的问题。不会直接传对象本身。

  明确以上两点后。Java在方法调用传递参数时,因为没有指针,所以它都是进行传值调用(这点可以参考C的传值调用)。因此,很多书里面都说Java是进行传值调用,这点没有问题,而且也简化的C中复杂性。

  但是传引用的错觉是如何造成的呢?在运行栈中,基本类型和引用的处理是一样的,都是传值,所以,如果是传引用的方法调用,也同时可以理解为“传引用值”的传值调用,即引用的处理跟基本类型是完全一样的。但是当进入被调用方法时,被传递的这个引用的值,被程序解释(或者查找)到堆中的对象,这个时候才对应到真正的对象。如果此时进行修改,修改的是引用对应的对象,而不是引用本身,即:修改的是堆中的数据。所以这个修改是可以保持的了。

  对象,从某种意义上说,是由基本类型组成的。可以把一个对象看作为一棵树,对象的属性如果还是对象,则还是一颗树(即非叶子节点),基本类型则为树的叶子节点。程序参数传递时,被传递的值本身都是不能进行修改的,但是,如果这个值是一个非叶子节点(即一个对象引用),则可以修改这个节点下面的所有内容。

  堆和栈中,栈是程序运行最根本的东西。程序运行可以没有堆,但是不能没有栈。而堆是为栈进行数据存储服务,说白了堆就是一块共享的内存。不过,正是因为堆和栈的分离的思想,才使得Java的垃圾回收成为可能。

  Java中,栈的大小通过-Xss来设置,当栈中存储数据比较多时,需要适当调大这个值,否则会出现java.lang.StackOverflowError异常。常见的出现这个异常的是无法返回的递归,因为此时栈中保存的信息都是方法返回的记录点。

  Java对象的大小

  基本数据的类型的大小是固定的,这里就不多说了。对于非基本类型的Java对象,其大小就值得商榷。

  在Java中,一个空Object对象的大小是8byte,这个大小只是保存堆中一个没有任何属性的对象的大小。看下面语句:

  Object ob = new Object();

  这样在程序中完成了一个Java对象的生命,但是它所占的空间为:4byte+8byte。4byte是上面部分所说的Java栈中保存引用的所需要的空间。而那8byte则是Java堆中对象的信息。因为所有的Java非基本类型的对象都需要默认继承Object对象,因此不论什么样的Java对象,其大小都必须是大于8byte。

 有了Object对象的大小,我们就可以计算其他对象的大小了。

  1. Class NewObject {  
  2.    int count;  
  3.    boolean flag;  
  4.    Object ob;  
  5.    }  
  6. //其大小为:空对象大小(8byte)+int大小(4byte)+Boolean大小(1byte)+空Object引用的大小(4byte)=17byte。
  7. 但是因为Java在对对象内存分配时都是以8的整数倍来分,因此大于17byte的最接近8的整数倍的是24,因此此对象的大
  8. 小为24byte。

  这里需要注意一下基本类型的包装类型的大小。因为这种包装类型已经成为对象了,因此需要把他们作为对象来看待。包装类型的大小至少是12byte(声明一个空Object至少需要的空间),而且12byte没有包含任何有效信息,同时,因为Java对象大小是8的整数倍,因此一个基本类型包装类的大小至少是16byte。这个内存占用是很恐怖的,它是使用基本类型的N倍(N>2),有些类型的内存占用更是夸张(随便想下就知道了)。因此,可能的话应尽量少使用包装类。在JDK5.0以后,因为加入了自动类型装换,因此,Java虚拟机会在存储方面进行相应的优化。

  引用类型

  对象引用类型分为强引用、软引用、弱引用和虚引用。

  强引用:就是我们一般声明对象是时虚拟机生成的引用,强引用环境下,垃圾回收时需要严格判断当前对象是否被强引用,如果被强引用,则不会被垃圾回收

  软引用:软引用一般被做为缓存来使用。与强引用的区别是,软引用在垃圾回收时,虚拟机会根据当前系统的剩余内存来决定是否对软引用进行回收。如果剩余内存比较紧张,则虚拟机会回收软引用所引用的空间;如果剩余内存相对富裕,则不会进行回收。换句话说,虚拟机在发生OutOfMemory时,肯定是没有软引用存在的。

  弱引用:弱引用与软引用类似,都是作为缓存来使用。但与软引用不同,弱引用在进行垃圾回收时,是一定会被回收掉的,因此其生命周期只存在于一个垃圾回收周期内。

  强引用不用说,我们系统一般在使用时都是用的强引用。而“软引用”和“弱引用”比较少见。他们一般被作为缓存使用,而且一般是在内存大小比较受限的情况下做为缓存。因为如果内存足够大的话,可以直接使用强引用作为缓存即可,同时可控性更高。因而,他们常见的是被使用在桌面应用系统的缓存。


posted @ 2012-01-11 13:46 顺其自然EVO 阅读(156) | 评论 (0)编辑 收藏

Java网络编程菜鸟进阶:TCP和套接字入门

     摘要: 我竟然到现在才发现《Fundamental Networking in Java》这本神作,真有点无地自容的感觉。最近几年做的都是所谓的企业级开发,免不了和网络打交道,但在实际工作中,往往会采用框架将底层细节和上层应用隔离开,感觉就像是在一个 Word 模板表单里面填写内容,做出来也没什么成就感。虽然没有不使用框架的理由,但我还真是有点怀念当初直接用套接字做网络编程的日子,既能掌控更多东西,还可以...  阅读全文

posted @ 2012-01-10 16:06 顺其自然EVO 阅读(876) | 评论 (0)编辑 收藏

PHP开发者常犯的10个MySQL错误

 数据库是Web大多数应用开发的基础。如果你是用PHP,那么大多数据库用的是MYSQL也是LAMP架构的重要部分。

  PHP看起来很简单,一个初学者也可以几个小时内就能开始写函数了。但是建立一个稳定、可靠的数据库确需要时间和经验。下面就是一些这样的经验,不仅仅是MYSQL,其他数据库也一样可以参考。

  1、使用MyISAM而不是InnoDB

  MySQL有很多的数据库引擎,单一般也就用MyISAM和InnoDB。

  MyISAM 是默认使用的。但是除非你是建立一个非常简单的数据库或者只是实验性的,那么到大多数时候这个选择是错误的。MyISAM不支持外键的约束,这是保证数据完整性的精华所在啊。另外,MyISAM会在添加或者更新数据的时候将整个表锁住,这在以后的扩展性能上会有很大的问题。

  解决办法很简单:使用InnoDB。

  2、使用PHP的mysql方法

  PHP从一开始就提供了MySQL的函数库。很多程序都依赖于mysql_connect、mysql_query、mysql_fetch_assoc等等,但是PHP手册中建议:

  如果你使用的MySQL版本在4.1.3之后,那么强烈建议使用mysqli扩展。

  mysqli,或者说MySQL的高级扩展,有一些优点:

  有面向对象的接口

  prepared statements(预处理语句,可以有效防止SQL-注入攻击,还能提高性能)

  支持多种语句和事务

  另外,如果你想支持多数据库那么应该考虑一下PDO。

  3、不过滤用户输入

  应该是:永远别相信用户的输入。用后端的PHP来校验过滤每一条输入的信息,不要相信Javascript。像下面这样的SQL语句很容易就会被攻击:

  1. $username = $_POST["name"];  
  2.   $password = $_POST["password"];  
  3.   $sql = "SELECT userid FROM usertable WHERE username='$username'AND password='$password';"; // run query...

  这样的代码,如果用户输入”admin’;”那么,就相当于下面这条了:

SELECT userid FROM usertable WHERE username='admin';

  这样入侵者就能不输入密码,就通过admin身份登录了。

  4、不使用UTF-8

  那些英美国家的用户,很少考虑语言的问题,这样就造成很多产品就不能在其他地方通用。还有一些GBK编码的,也会有很多的麻烦。

  UTF-8解决了很多国际化的问题。虽然PHP6才能比较完美的解决这个问题,但是也不妨碍你将MySQL的字符集设置为UTF-8。

  5、该用SQL的地方使用PHP

  如果你刚接触MySQL,有时候解决问题的时候可能会先考虑使用你熟悉的语言来解决。这样就可能造成一些浪费和性能比较差的情况。比如:计算平均值的时候不适用MySQL原生的AVG()方法,而是用PHP将所有值循环一遍然后累加计算平均值。

  另外还要注意SQL查询中的PHP循环。通常,在取得所有结果之后再用PHP来循环的效率更高。

  一般在处理大量数据的时候使用强有力的数据库方法,更能提高效率。

  6、不优化查询

  99%的PHP性能问题都是数据库造成的,一条糟糕的SQL语句可能让你的整个程序都非常慢。MySQL的EXPLAIN statement,Query Profiler,many other tools的这些工具可以帮你找出那些调皮的SELECT。

  7、使用错误的数据类型

  MySQL提供一系列数字、字符串、时间等的数据类型。如果你想存储日期,那么就是用DATE或者DATETIME类型,使用整形或者字符串会让事情更加复杂。

  有时候你想用自己定义的数据类型,例如,使用字符串存储序列化的PHP对象。数据库的添加可能很容易,但是这样的话,MySQL就会变得很笨重,而且以后可能导致一些问题。

  8、在SELECT查询中使用*

  不要使用*在表中返回所有的字段,这会非常的慢。你只需要取出你需要的数据字段。如果你需要取出所有的字段,那么可能你的表需要更改了。

  9、索引不足或者过度索引

  一般来说,应该索引出现在SELECT语句中WHERE后面所有的字段。

  例如,假如我们的用户表有一个数字的ID(主键)和email地址。登录之后,MySQL应该通过email找到相应的ID。通过索引,MySQL可以通过搜索算法很快的定位email。如果没有索引,MySQL就需要检查每一项记录直到找到。

  这样的话,你可能想给每一个字段都添加索引,但是这样做的后果就是在你更新或者添加的时候,索引就会重新做一遍,当数据量大的时候,就会有性能问题。所以,只在需要的字段做索引。

  10、不备份

  也许不常发生,但是数据库损毁,硬盘坏了、服务停止等等,这些都会对数据造成灾难性的破坏。所以你一定要确保自动备份数据或者保存副本。

  11、另外:不考虑其他数据库

  MySQL可能是PHP用的最多的数据库了,但是也不是唯一的选择。 PostgreSQL和Firebird也是竞争者,他们都开源,而且不被某些公司所控制。微软提供SQL Server Express,Oracle有10g Express,这些企业级的也有免费版。SQLite对于一些小型的或者嵌入式应用来说也是不错的选择。

posted @ 2012-01-09 21:03 顺其自然EVO 阅读(142) | 评论 (0)编辑 收藏

UML中关联,组合与聚合等关系的辨析

以前学习面向对象的时候,常听到介绍对象之间的各种关系,常见的有关联,组合与聚合。

  关联:

  关联是一种最普遍和常见的关系形式。一般是指一个对象可以发消息给另外一个对象。典型的实现情况下指某个对象有一个指针或者引用指向一个实体变量,当通过方法的参数来传递或者创建本地变量来访问这种情况也可以称之为关联。

  典型的代码如下:

  1. class A  
  2. {  
  3.     private B itemB;  
  4. }

  也可能有如下的形式:

  1. class A  
  2. {  
  3.     void test(B b) {...}  
  4. }

  笼统的情况下,一般两个对象的引用,参数传递等形式产生的关系,我们都可以称之为关联关系。

  聚合(aggregation):

  聚合表示的是一种has-a的关系,同时,它也是一种整体-部分关系。它的特点在于,它这个部分的生命周期并不由整体来管理。也就是说,当整体这个对象已经不存在的时候,部分的对象还是可能继续存在的。它的uml图表示形式如下:

  我们用一个空心的箭头来表示聚合关系。

  笼统的说声明周期管理还是比较模糊。我们就以如图的Person和Address类来进一步的解释。假设我们要定义这两个对象,对于每个人来说,他有一个关联的地址。人和地址的关系是has-a的关系。但是,我们不能说这个地址是这个人的一个组成部分。同时,我们建立地址对象和人的对象是可以相对独立存在的。

  用代码来表示的话,典型的代码样式如下:

  1. public class Address  
  2. {  
  3. . . .  
  4. }  
  5. public class Person  
  6. {  
  7.      private Address address;  
  8.      public Person(Address address)  
  9.      {  
  10.          this.address = address;  
  11.      }  
  12.      . . .  
  13. }



我们通常通过如下的方式来使用Person对象:

  1. Address address = new Address();  
  2. Person person = new Person(address);

  或者:

Person person = new Person( new Address() );

  我们可以看到,我们是创建了一个独立的Address对象,然后将这个对象传入了Person的构造函数。当Person对象声明周期结束的时候,Address对象如果还有其他指向它的引用,是可能继续存在的。也就是说,他们的声明周期是相对独立的。

  组合(Composition):

  当理解了聚合的关系之后,再来看组合的关系就相对来说要好很多。和聚合比起来,组合是一种更加严格的has-a关系。它表示一种严格的组成关系。以汽车和引擎为例子,引擎是汽车的一个组成部分。他们是一种严格的部分组成关系,因此他们的声明周期也应该是一致的。也就是说引擎的声明周期是通过汽车对象来管理。

  组合的uml图表示如下:

  一般用一个实心的箭头表示组合。

  组合代码的典型示例如下:

  1. public class Engine  
  2. {  
  3. . . .   
  4. }  
  5.  
  6. public class Car  
  7. {  
  8.     Engine e = new Engine();  
  9.     .......  
  10. }

  Engine对象是在Car对象里面创建的,所以在Car对象生命周期结束的时候,Engine对象的生命周期也同样结束了。

posted @ 2012-01-09 21:02 顺其自然EVO 阅读(205) | 评论 (0)编辑 收藏

JIRAJIRA是集项目计划、任务分配、需求管理、错误跟踪于一体的商业软件


http://wenku.baidu.com/view/43d702600b1c59eef8c7b4fb.html
http://baike.baidu.com/view/1094245.htm
http://down.51cto.com/data/241953

posted @ 2012-01-09 18:33 顺其自然EVO 阅读(155) | 评论 (0)编辑 收藏

Mssql和Mysql的安全性分析

Mssql和Mysql的安全性分析

数据库是电子商务、金融以及ERP系统的基础,通常都保存着重要的商业伙伴和客户信息。大多数企业、组织以及政府部门的电子数据都保存在各种数据库中,他们用这些数据库保存一些个人资料,还掌握着敏感的金融数据。但是数据库通常没有象操作系统和网络这样在安全性上受到重视。数据是企业,组织的命脉所在,因此选择一款安全的数据库是至关重要的。大型网站一般使用oracle或DB2,而中小型网站大多数使用更加灵活小巧的mssql数据库或者mysql数据库。那么,在同样的条件下,微软的mssql和免费的mysql哪个更加安全呢?

  我在我的机子上面用管理员帐号默认安装了mssql和mysql以便在相同的情况下测试他们的安全性。我的系统配置如下:操作系统Microsoft Windows 2000 Version5.0,安装了sp4,ftp服务和iis服务,支持asp和php。系统只有一个管理员帐号admin,guest帐号没有禁用。

  一、系统内部安全性分析

  1、mysql数据库权限控制问题

  mysql的权限控制是基于mysql这个数据库的,叫做授权表,一共包括包括六个表columns_priv,db,func,host,tables_priv和user。先使用desc user命令查看非常重要的user表的结构以便查询内容,现在可以查看他的权限设置了。

  使用命令select host,user,password,delete_priv,update_priv,drop_priv from user;这个命令查看了几个比较危险的权限,显示结果如下:

+-----------+------+------------------+-------------+-------------+-----------+
| host | user | password | delete_priv | update_priv | drop_priv |
+-----------+------+------------------+-------------+-------------+-----------+
| localhost | root |0e4941f53f6fa106 | Y | Y | Y |
| % | root | | Y | Y | Y |
| localhost | | | Y | Y | Y |
| % | | | N | N | N |
+-----------+------+------------------+-------------+-------------+-----------+
4 rows in set (0.00 sec)

  第一条表示在本机使用root用密码登陆,拥有删除记录,修改记录,删除表等权限,好,这是安全的。第二条表示在任何主机使用root不需密码登陆,拥有删除记录,修改记录,删除表等权限。第三条表示在本机匿名登陆,拥有删除记录,修改记录,删除表等权限。最后条表示可以再任何主机匿名登陆,但是没有任何权限。

  显然,第二,三,四都是不安全的!第二条不用说,就第三条而言,就算你在本地是guest权限,但是也可以登陆mysql数据库,而且拥有全部权限。这样,就可以对数据库为所欲为了。

  解决方法:如果你不需要远程维护,删除掉第二条,delete from user where host="%" and user="root";或者给它加个强壮的密码。删除第三条,delete from user where host="localhost" and user="";

  2、mysql安装目录权限问题

  mysql默认安装到c:/mysql,但是c盘默认是everyone完全控制,由于权限的继承性,c:/mysql对everyone也是完全控制的,显然这样是不安全的。因为恶意用户可以删除重要的数据文件。

  解决方法:重新设置mysql目录的存取权限。或者将mysql安装到其他目录,如果你移动Mysql分发到D:/mysql,你就必须使用D:/mysql/bin/mysqld --basedir D:/mysql来启动mysqld,甚至还需要修改它的配置文件。

  3、mssql数据库权限控制问题

  mssql数据库的权限控制是基于master库的syslogins表,拥有所有权限的帐号是sa,其他还有sysadmin,db_owner等不同权限帐号。但是,mssql数据库最高权限帐号sa的默认密码是空,这样如果安装的时候不注意,就会给数据带来毁灭性的灾难。恶意攻击者可以修改,删除所有数据,更加重要的是mssql帐号可以利用扩展执行系统命令。

  解决方法:定期检查所有登陆帐号,查看是否有不符合要求的密码。

  Use master

  Select name,Password from syslogins where password is null命令检查是否有空口令帐号存在。尽可能的删除存储扩展,防止本地用户利用存储扩展执行恶意命令。

  use master

  sp_dropextendedproc xp_cmdshell 命令删除xp_cmdshell扩展。

 4、mssql安装目录权限问题

  同mysql一样,mssql也是安装到everyone完全控制c盘,由于存取控制问题,最好安装到d盘等非系统盘进行严格的权限控制。而且,由于mssql数据库与系统结合非常紧密,系统管理员在没有数据库密码的情况下也可以通过选择windows验证来操作数据库。因此,普通用户有可能通过系统漏洞提升自己的权限,对数据库进行破坏。

  解决办法:除了严格的存取限制外,还要定期查看SQL Server日志检查是否有可疑的登录事件发生,或者使用DOS命令findstr /C:"登录" d:/Microsoft SQL Server/MSSQL/LOG/*.*。

  mssql的安全是和windows系统安全紧密结合的,任何一个出现漏洞,都会威胁到另一个的安全。

  总结,在系统内部安全性上,mysql和mssql都没有达到令人满意的程度,帐号安全,存取权限都控制的不是很好。但是mssql有详细的日志可以查看登陆情况,比mysql要高出一筹。如果进行了合理的设置,mysql反而要更加安全些,因为对mssql而言,只要有系统权限即可拥有数据库权限。

  二、外部网络安全性分析

  1、数据库服务的探测

  为了安全,可以让mysql服务运行在内网,但是如果你的机器有外网的接口,mysql也会自动被绑定在外网上面,暴露在internet中,而且系统会在TCP的3306端口监听,非常容易被端口扫描工具发现,不能保证数据安全。如果默认,mssql则会打开TCP的1433端口监听。虽然mssql可以人为的改变监听端口,但是通过微软未公开的1434端口的UDP探测可以很容易知道SQL Server使用的什么TCP/IP端口了。往UDP1434端口

  发送一个1个字节的内容为02的数据包,被探测的系统则会返回安装的mssql服务信息,这些信息包括:主机名称、实例名称、版本、管道名称以及使用的端口等。这个端口是微软自己使用,而且不象默认的1433端口那样可以改变,1434是不能改变的。一个典型的返回的信息如下:

ServerName;Sky;InstanceName;sky;IsClustered;No;Version;8.00.194;tcp;3341;np;//sky/pipe/MSSQL$XHT310/sql/query;可以发现mssql的tcp端口改成了3341,为攻击者打开了方便之门!只要会一点socket编程知识,很容易就可以写出扫描mssql服务的程序,而且,由于利用了udp端口,一般的过滤是很难防范的。 补天的awen写了个探测程序,用的是c#语言,代码如下:

using System; 
using System.Net.Sockets; 
using System.Net; 
using System.Text; 
using System.Threading;

namespace ConsoleApplication3 
{

class Class1 

//创建一个UDPCLIENT实例 
private static UdpClient m_Client;

//LISTEN用来获取返回的信息 
public static string Listen(string hostip) 

string HostIP = hostip; 
IPAddress thisIP = IPAddress.Parse(HostIP); 
IPEndPoint host = new IPEndPoint(thisIP,1434); 
byte [] data = m_Client.Receive(ref host); 
Encoding ASCII = Encoding.ASCII; 
String strData = ASCII.GetString(data); 
return strData;


//SEND 
public static void Send(string hostip) 

string HostIP = hostip; 
byte [] buffer = {02}; 
//02为要发送的数据,只有02、03、04有回应 
int ecode = m_Client.Send(buffer,1,HostIP,1434); 
//ecode用来返回是否成功发送 
if(ecode <= 0) 

Console.WriteLine("发送时出错:" + ecode);

}


//对返回的信息的简单的处理 
public static void OutputInfo(string strdata) 

string str = strdata; 
//str.le 
char [] that = {‘;‘,‘;‘}; 
string [] strofthis =str.Split(that); 
//int i= 0  
for(int i=0;i{

Console.Write(strofthis); 
Console.Write(‘
‘); 
}


//输入IP 
public static string InputHostIP() 

Console.Write("enter the ip you want to scan:

"); 
string hostip =Console.ReadLine(); 
Console.Write(‘
‘); 
return hostip; 

//EXIT 
public static void Exit() 

Console.WriteLine("if you want to exit ,just input 1
"); 
int a = Console.Read(); 
if(a!= 1) 

Console.WriteLine("if you want to exit ,just input 1
"); 
Console.Read(); 

else 


}

[STAThread]

static void Main(string[] args) 

string HostIP; 
HostIP = InputHostIP(); 
Console.WriteLine("Begin to send udp to the host"); 
m_Client = new UdpClient(); 
Send(HostIP); 
string strData=Listen(HostIP); 
OutputInfo(strData); 
Exit();



}


 3一个典型的返回的信息

  ServerName;AWEN;
  InstanceName;AWEN;
  IsClustered;No;
  Version;8.00.194;
  tcp;1044; (TCP的端口,可见就算改了端口也是很容易找到的)
  np;//AWEN/pipe/MSSQL$XHT310/sql/query;

  解决办法:安装防火墙,或者利用Windows2000系统的ipsec对网络连接进行ip限制,实现IP数据包的安全性。对IP连接进行限制,只保证自己的IP能够访问,拒绝其他IP进行的端口连接,把来自网络上的安全威胁进行有效的控制。重要的是,还要对端口作过滤,包括大部分的tcp和udp端口,因为仅仅做ip限制的话,有可能恶意攻击者先攻击被数据库服务器信任的主机,控制之后作为跳板对数据库服务器进行攻击。

  2、数据库的密码探测

  密码攻击包括两种,破解密码和网络监听。破解密码是使用工具不停的连接数据库来猜测密码, 包括字典攻击,暴力攻击和界于两者之间的半暴力半字典攻击。通常攻击者先采用字典攻击的方法,没有成功的话依次采用半暴力半字典攻击,暴力攻击。在网络速度够好,电脑运算能力够强的情况下,这样的密码攻击危害是相当大的。网络监听则是控制一台网络设备,在上面运行监听工具捕获在网络中传送的密码信息。网络监听可以分为两种,一种是外部的监听,将侦听工具软件放到网络连接的设备或者 放到可以控制网络连接设备的电脑上,这里的网络连接设备,比如网关服务器,比如路由器等等。另外一 种是来自内部的监听,对于不安全的局域网,数据是采用广播的方式传播的,只要把网卡设置为混杂模式即可接收到本来不属于自己的数据包,当然可能包括密码信息等资料。

  解决方法:针对密码破解,只要把密码设置为足够强壮,并且对同个ip地址不停的连接请求进行屏蔽即可。 但是对于监听来说,网络传输的时候如果不加密的话,所有的网络传输都是明文的,包括密码、数据库内容等 等,不管多么复杂的密码都是于事无补的,这是一个很大的安全威胁。所以,在条件容许情况下,最好使用SSL

  来加密协议,当然,你需要一个证书来支持。并且,对于网络监听应该及时发现,如果网络中的丢包率突然提 高,那么就有理由怀疑网络遭到监听。

  3、脚本安全

  脚本安全本身就是个非常复杂的问题,足以写一篇专业的长篇分析文章,而且我对脚本不是很内行,mix,envymask,pskey,angel他们比较疯狂,哈哈。脚本

  安全主要是对提交的数据缺乏严格的检查导致的,比较危险的符号有“;”,“ ”,“#”,“--”,“$”,“/”等。这个问题最初被认为是asp+sqlserver的问题,但是很快就发现实质上它的影响非常大,后来有人继续深入发现在php+mysql该问题依然会存在,san对php作过深入分析,有兴趣的去安全焦点找他的文章。对于脚本

  好象没有特有效的解决方法,只有依靠程序员的个人素质了……

  总结,不管是mysql,还是mssql,在外部网络中,都受到相当大的威胁。相比而言,mssql受到的威胁甚至要更大些,最近2年来,mssql暴露出了多个远程溢出漏洞。如果配置的比较好的话,我认为,mysql要比mssql安全一些,因为随时会爆发的新溢出漏洞是防不胜防的,而且能够执行系统命令的sql注入攻击也非常可怕。好了,限于篇幅,这篇文章到此结束。

posted @ 2012-01-06 11:39 顺其自然EVO 阅读(213) | 评论 (0)编辑 收藏

《青花瓷》JAVA版:周杰伦告诉你怎么学Java

 “青花瓷Java版”为北京师范大学教育学部蔡苏作词原创,覆盖教育技术学院专业选修课《面向对象程序设计》教学大纲中的所有知识点。

  视频:http://player.youku.com/player.php/sid/XMjU3Mjk2NzA0/v.swf

  歌词:

  JDK 和JRE 莫要混淆去

  环境变量的配置有时让人迷

  初学的人莫贪图上来I D E

  先用J D K +文本编辑器

  面向对象仨特点一定要牢记

  封装继承和多态一个不能离

  接口为多重继承

  抽象类一定要有实例

  O b je c t呀 所有类爹地

  package在类中只能有唯一

  注释命名时要既规范又明晰

  就当为好程序员伏笔

  G U I 不是鬼 千万别恐惧

  四大布局管理 多练才熟悉

  勤能补拙熟能生巧到考试时

  你眼带笑意

  三整两浮一布尔再加字节符

  基本数据Byte数了然于心底

  碰到异常一定记得try/catch

  要打包发布使用jar命令

  线程何时被调用全看调度器

  睡眠同步和死锁使用要仔细

  网页中Applet

  独立程序Application

  ApplicationO b je c t呀所有类爹地

  package在类中只能有唯一

  注释命名时要既规范又明晰就当为好程序员伏笔

  (这样程序员才是好样滴)

  G U I 不是鬼

  千万别恐惧四大布局管理

  多练才熟悉

  勤能补拙熟能生巧到考试时你眼带笑意

歌词理解:

  JDK 和JRE 莫要混淆去

  JRE(Java Runtime Environment):即Java运行环境,运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库。

  JDK(Java Development Kit):是整个Java的核心,包括了Java运行环境,Java工具和Java基础的类库。

  环境变量的配置有时让人迷

  JAVA_HOME、CLASSPATH、PATH

  记得加入当前目录“.”

  初学的人莫贪图上来IDE

  IDE(Integrated Development,集成开发环境)

  不错的Java IDE:Eclipse、Netbeans、Jbuilder、 Jcreator

  先用JDK +文本编辑器

  vim、javac、java

  面向对象仨特点一定要牢记,封装继承和多态一个不能离

  封装:隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别

  继承:对已有类的复用和修改

  多态:指一个程序中,同名的不同方法共存的情况

  接口为多重继承

  抽象类一定要有实例

  Object呀,所有类爹地

  所有类都是从Object类继承而来的。

  package在类中只能有唯一

  package 语句必须是文件中除注释以外的第一句程序代码

  package 将文件中的类都遮蔽到一定的名字空间下,别的文件导入须用到import关键字

  注释命名时要既规范又明晰,就当为好程序员伏笔

  GUI 不是鬼,千万别恐惧

  四大布局管理 多练才熟悉

  勤能补拙熟能生巧到考试时,你眼带笑意

 三整两浮一布尔再加字节符

  三整:short int long

  两浮:float double

  一布尔:boolean

  字节符:byte char

  基本数据Byte数了然于心底

  boolean:特殊,表示1 bit的信息,但不明确指定占用内存空间的大小。

  char:2 Byte

  byte:1 Byte

  short:2 Byte

  int:4 Byte

  long:8 Byte

  float:4 Byte

  double:8 Byte

  碰到异常一定记得try/catch

  要打包发布使用jar命令

  线程何时被调用全看调度器

  睡眠同步和死锁使用要仔细

  网页中Applet

  独立程序Application

posted @ 2012-01-06 11:37 顺其自然EVO 阅读(201) | 评论 (0)编辑 收藏

服务器重启前请做完你该做的工作

 对于系统管理员来说如何管理自己的服务器已经是再简单不过,但是如何管理好服务器却不是一个简单的事情。对于管理员来说重启服务器可不是一件闹着玩的事情。对于Windows服务器管理员来说经常性重启Windows设备已经成为一种生活常态,但在Unix系统中这种办法却难以奏效——在默认情况下重新启动不会带来任何形式的改善。

  我打算借此机会跟大家详细聊聊重启的问题。对于每一位服务器管理员来说这都算得上热门话题,但在Unix极客们眼中它则属于一种层次更深的课题——可能因为Windows管理员们往往把重启当成故障排查工作的首要步骤之一,而Unix团队则一般只在束手无策的情况下才进行尝试。

  Unix服务器重启的两种情况

  实际情况是:服务器重启操作应该极少出现——请注意是极少。在这里我列举内核更新与硬件更换作为例子,因为它们是Unix领域中引发重新启动的两大主要原因。有些人一直在鼓吹什么不重启服务器的话会带来某些严重的安全风险,这简直是一派胡言。如果服务项目与应用程序中确实存在安全风险,那么打上漏洞补丁就能解决问题了,而且补丁往往不要求重启设备。而如果安全风险存在于内核模块中,一般来说只需卸载对应模块、安装补丁,最后重新加载模块。没错,我承认一旦内核中存在安全风险,那么重启操作的确是必要的。但在这种情况之外,大家根本没有切实的理由重新启动Unix服务器。

  有些人认为如果不进行重启操作,其它形式的风险往往会接踵而至,例如某些关键性服务项目在开机时没有得到正确启用,而这将导致一系列隐患。当然,这种说法本身是正确的,但只要管理工作执行到位,这其实根本就是种杞人忧天。只有刚刚接掌服务器设备的菜鸟才会忘记正确设置服务项目的启动参数。不过话说回来,如果大家的服务器正处于构建阶段,且其中还不涉及任何生产方面的内容,那么不妨随意进行各类重启测试,这不会带来任何不良影响。而且我认为这正是熟悉重启机制的最好时机。

  但还有另一方面需要考虑:那些将重启操作当成故障排查重要步骤之一的家伙是抱着死猪不怕开水烫的心态,打算一次性把问题都暴露出来。就说一套已经出现问题的Unix设备吧,某些还处于运行中的服务项目实际上已经无法再次启动,而这一点在重启之后就会显现出来——也许是由于分段故障或者其它稀奇古怪的原因。

  造成Unix服务器重启的原因

  如果我们只是简单查看几分钟之后就一拍脑门决定重启设备,那么也许故障的真正原因就彻底湮没在时光中了——也许是某位初级管理员在运行一套自己编写的愚蠢脚本时无意中删除了/boot目录或者/etc、/usr/lib64目录下的部分内容。这正是引发分段故障以及设备不稳定情况的罪魁祸首。然而一旦我们选择直接重启服务器而没有深入挖掘问题,那么显然问题会变得更加严重,接下来不出意外的话大家应该会启动恢复镜像——这就代表需要面对大量恢复工作——而与此同时生产服务器也将陷入停机状态。

  以上只是我们在Unix领域中应该尽量避免重启操作的原因之一。与其说这算是种故障排查方法,不如把它看作一类孤注一掷的豪赌——要么发现问题,要么亲手毁掉一切再慢慢重建。总之,没人能利用/var分区重启设备就完全修正错误。(另外请别提什么打开文件句柄这类迂腐的蠢话——我想大家应该理解我的意思)

  服务器重启前请做完你该做的工作

  在大多数情况下,不进行重启是极其重要的,因为系统中能够帮助我们修复问题的关键性内容在重启前是一定存在的,但在重启后却未必还在。重启之后问题绝对会再次出现,然而一旦解决方案随重启行为而烟消云散,那么故障本身就陷入了无解的死循环中。除非有人决定不进行重启,而是尝试找出问题的根源。遗憾的是,能做了这种明智选择的人实在少之又少。实际情况是:一根小小的故障内存条就能给系统正常运行与设备启动状态带来极大的麻烦。而这个时候,对症下药才是上策,一味重启只会带来额外的损失。

  因此,今后大家在面对问题时,如果有某个家伙说什么“嘿,不如先重启一下看看”,不妨直接给他两个大嘴巴。重启当然是方案之一,但在实施重启前请务必确保我们已经采取了一切能够想到的处理措施;毕竟节省下来的都是咱们自己的时间跟精力嘛。

posted @ 2012-01-05 17:50 顺其自然EVO 阅读(183) | 评论 (0)编辑 收藏

J2EE总结:Java命名与目录接口JNDI

JNDI 是什么

  JNDI是 Java 命名与目录接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之一,不少专家认为,没有透彻理解JNDI的意义和作用,就没有真正掌握J2EE特别是EJB的知识。

  那么,JNDI到底起什么作用?

  要了解JNDI的作用,我们可以从“如果不用JNDI我们怎样做?用了JNDI后我们又将怎样做?”这个问题来探讨。

  没有JNDI的做法:

  程序员开发时,知道要开发访问MySQL数据库的应用,于是将一个对 MySQL JDBC 驱动程序类的引用进行了编码,并通过使用适当的 JDBC URL 连接到数据库。

  就像以下代码这样:

  1. Connection conn=null;  
  2. try {  
  3. Class.forName("com.mysql.jdbc.Driver",  
  4. true, Thread.currentThread().getContextClassLoader());  
  5. conn=DriverManager.getConnection("jdbc:mysql://MyDBServer?user=qingfeng&password=mingyue");  
  6. /* 使用conn并进行SQL操作 */ 
  7. ......  
  8. conn.close();  
  9. }   
  10. catch(Exception e) {  
  11. e.printStackTrace();  
  12. }   
  13. finally {  
  14. if(conn!=null) {  
  15. try {  
  16. conn.close();  
  17. catch(SQLException e) {}  
  18. }  
  19. }

  这是传统的做法,也是以前非Java程序员(如Delphi、VB等)常见的做法。这种做法一般在小规模的开发过程中不会产生问题,只要程序员熟悉Java语言、了解JDBC技术和MySQL,可以很快开发出相应的应用程序。

  没有JNDI的做法存在的问题:

  1、数据库服务器名称MyDBServer 、用户名和口令都可能需要改变,由此引发JDBC URL需要修改;

  2、数据库可能改用别的产品,如改用DB2或者Oracle,引发JDBC驱动程序包和类名需要修改;

  3、随着实际使用终端的增加,原配置的连接池参数可能需要调整;

  4、......

  解决办法:

  程序员应该不需要关心“具体的数据库后台是什么?JDBC驱动程序是什么?JDBC URL格式是什么?访问数据库的用户名和口令是什么?”等等这些问题,程序员编写的程序应该没有对 JDBC 驱动程序的引用,没有服务器名称,没有用户名称或口令 —— 甚至没有数据库池或连接管理。而是把这些问题交给J2EE容器来配置和管理,程序员只需要对这些配置和管理进行引用即可。

  由此,就有了JNDI。

  用了JNDI之后的做法:

  首先,在在J2EE容器中配置JNDI参数,定义一个数据源,也就是JDBC引用参数,给这个数据源设置一个名称;然后,在程序中,通过数据源名称引用数据源从而访问后台数据库。

 具体操作如下(以JBoss为例):

  1、配置数据源

  在JBoss的 D:/jboss420GA/docs/examples/jca 文件夹下面,有很多不同数据库引用的数据源定义模板。将其中的 mysql-ds.xml 文件Copy到你使用的服务器下,如 D:/jboss420GA/server/default/deploy。

  修改 mysql-ds.xml 文件的内容,使之能通过JDBC正确访问你的MySQL数据库,如下:

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <datasources> 
  3. <local-tx-datasource> 
  4. <jndi-name>MySqlDS</jndi-name> 
  5. <connection-url>jdbc:mysql://localhost:3306/lw</connection-url> 
  6. <driver-class>com.mysql.jdbc.Driver</driver-class> 
  7. <user-name>root</user-name> 
  8. <password>rootpassword</password> 
  9. <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name> 
  10. <metadata> 
  11. <type-mapping>mySQL</type-mapping> 
  12. </metadata> 
  13. </local-tx-datasource> 
  14. </datasources>

  这里,定义了一个名为MySqlDS的数据源,其参数包括JDBC的URL,驱动类名,用户名及密码等。

  2、在程序中引用数据源:

  1. Connection conn=null;  
  2. try {  
  3. Context ctx=new InitialContext();  
  4. Object datasourceRef=ctx.lookup("java:MySqlDS"); //引用数据源  
  5. DataSource ds=(Datasource)datasourceRef;  
  6. conn=ds.getConnection();  
  7. /* 使用conn进行数据库SQL操作 */ 
  8. ......  
  9. c.close();  
  10. }   
  11. catch(Exception e) {  
  12. e.printStackTrace();  
  13. }   
  14. finally {  
  15. if(conn!=null) {  
  16. try {  
  17. conn.close();  
  18. catch(SQLException e) { }  
  19. }  
  20. }

  直接使用JDBC或者通过JNDI引用数据源的编程代码量相差无几,但是现在的程序可以不用关心具体JDBC参数了。

  在系统部署后,如果数据库的相关参数变更,只需要重新配置 mysql-ds.xml 修改其中的JDBC参数,只要保证数据源的名称不变,那么程序源代码就无需修改。

  由此可见,JNDI避免了程序与数据库之间的紧耦合,使应用更加易于配置、易于部署。

  JNDI的扩展:JNDI在满足了数据源配置的要求的基础上,还进一步扩充了作用:所有与系统外部的资源的引用,都可以通过JNDI定义和引用。

  所以,在J2EE规范中,J2EE 中的资源并不局限于 JDBC 数据源。引用的类型有很多,其中包括资源引用(已经讨论过)、环境实体和 EJB 引用。特别是 EJB 引用,它暴露了 JNDI 在 J2EE 中的另外一项关键角色:查找其他应用程序组件。

  EJB 的 JNDI 引用非常类似于 JDBC 资源的引用。在服务趋于转换的环境中,这是一种很有效的方法。可以对应用程序架构中所得到的所有组件进行这类配置管理,从 EJB 组件到 JMS 队列和主题,再到简单配置字符串或其他对象,这可以降低随时间的推移服务变更所产生的维护成本,同时还可以简化部署,减少集成工作。 外部资源”。

 具体操作如下(以JBoss为例):

  1、配置数据源

  在JBoss的 D:/jboss420GA/docs/examples/jca 文件夹下面,有很多不同数据库引用的数据源定义模板。将其中的 mysql-ds.xml 文件Copy到你使用的服务器下,如 D:/jboss420GA/server/default/deploy。

  修改 mysql-ds.xml 文件的内容,使之能通过JDBC正确访问你的MySQL数据库,如下:

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <datasources> 
  3. <local-tx-datasource> 
  4. <jndi-name>MySqlDS</jndi-name> 
  5. <connection-url>jdbc:mysql://localhost:3306/lw</connection-url> 
  6. <driver-class>com.mysql.jdbc.Driver</driver-class> 
  7. <user-name>root</user-name> 
  8. <password>rootpassword</password> 
  9. <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name> 
  10. <metadata> 
  11. <type-mapping>mySQL</type-mapping> 
  12. </metadata> 
  13. </local-tx-datasource> 
  14. </datasources>

  这里,定义了一个名为MySqlDS的数据源,其参数包括JDBC的URL,驱动类名,用户名及密码等。

  2、在程序中引用数据源:

  1. Connection conn=null;  
  2. try {  
  3. Context ctx=new InitialContext();  
  4. Object datasourceRef=ctx.lookup("java:MySqlDS"); //引用数据源  
  5. DataSource ds=(Datasource)datasourceRef;  
  6. conn=ds.getConnection();  
  7. /* 使用conn进行数据库SQL操作 */ 
  8. ......  
  9. c.close();  
  10. }   
  11. catch(Exception e) {  
  12. e.printStackTrace();  
  13. }   
  14. finally {  
  15. if(conn!=null) {  
  16. try {  
  17. conn.close();  
  18. catch(SQLException e) { }  
  19. }  
  20. }

  直接使用JDBC或者通过JNDI引用数据源的编程代码量相差无几,但是现在的程序可以不用关心具体JDBC参数了。

  在系统部署后,如果数据库的相关参数变更,只需要重新配置 mysql-ds.xml 修改其中的JDBC参数,只要保证数据源的名称不变,那么程序源代码就无需修改。

  由此可见,JNDI避免了程序与数据库之间的紧耦合,使应用更加易于配置、易于部署。

  JNDI的扩展:JNDI在满足了数据源配置的要求的基础上,还进一步扩充了作用:所有与系统外部的资源的引用,都可以通过JNDI定义和引用。

  所以,在J2EE规范中,J2EE 中的资源并不局限于 JDBC 数据源。引用的类型有很多,其中包括资源引用(已经讨论过)、环境实体和 EJB 引用。特别是 EJB 引用,它暴露了 JNDI 在 J2EE 中的另外一项关键角色:查找其他应用程序组件。

  EJB 的 JNDI 引用非常类似于 JDBC 资源的引用。在服务趋于转换的环境中,这是一种很有效的方法。可以对应用程序架构中所得到的所有组件进行这类配置管理,从 EJB 组件到 JMS 队列和主题,再到简单配置字符串或其他对象,这可以降低随时间的推移服务变更所产生的维护成本,同时还可以简化部署,减少集成工作。 外部资源”。

 从我们日常生活中去理解目录服务的概念可以从电话簿说起,电话簿本身就是一个比较典型的目录服务,如果你要找到某个人的电话号码,你需要从电话簿里找到这个人的名称,然后再看其电话号码。

  理解了命名服务和目录服务再回过头来看JDNI,它是一个为Java应用程序提供命名服务的应用程序接口,为我们提供了查找和访问各种命名和目录服务的通用统一的接口.通过JNDI统一接口我们可以来访问各种不同类型的服务.如下图所示,我们可以通过JNDI API来访问刚才谈到的DNS。

  至此已经对JNDI有了一个初步认识,如果想要进一步了解JNDI,并对使用JDNI给我们带来哪些便利之处,我推荐两篇关于JDNI的文章,写的非常的好,两篇文章从“如果不用JNDI我们怎样做?用了JNDI后我们又将怎样做?”这个角度来加深对JNDI的认识。

posted @ 2012-01-05 17:48 顺其自然EVO 阅读(165) | 评论 (0)编辑 收藏

企业数据库合规的最佳实践

 数据库是存放数据、经常是那些高敏感度数据的宝库,因此它也毫无疑问的是合规检查程序的重点区域。几乎所有的企业合规都会对哪些人、能在什么时间、访问什么数据库作出规定,并且需要一个专职人员来管理这些权限。本文,我们将讨论针对数据库合规的基本数据库安全要求,如PCI DSS和HIPAA,以及为了遵守合规要求用于管理数据库权限和维护的最佳实践。

  最常见的五大企业核心数据库环境是:1、微软SQL Server数据库;2、IBM的DB2数据库;3、MySQL数据库;4、Oracle数据库;5、Postgres数据库。这些数据库在首次实施安装时都能够恰当地配置、加固、保护及锁定。真正的挑战是理解那些实际上需要到位的重要组件。这不只是对数据库本身,还有容纳操作系统和数据库的服务器。

  PCI DSS当前对于数据库要求有下述明确的控制措施:

  ◆ 对访问任意数据库的所有用户进行认证。

  ◆ 所有用户访问任何数据库时,用户的查询和操作(例如移动、拷贝和删除)只能通过编程性事务(例如存储过程)。

  ◆ 数据库和应用的配置设置为只限于给DBA(数据库管理员)的直接用户访问或是查询。

  ◆ 对于数据库应用和相关的应用ID,应用ID只能被应用使用,而不能被单独的用户或是其它进程使用。

  就HIPAA法案来说,上述的措施没有作为HIPAA合规要求的内容特别写出来,但是应当看作是用于合规遵从的最佳安全控制组合,并且最终有助于满足HIPAA中安全条款的需要。具体来说,HIPAA的规定条款如下:

  ◆ 确保所有新建、接收、维护或是传输中的电子个人健康信息(e-PHI)的保密性、完整性和可用性。

  ◆ 辨识和防范那些对信息的安全性或完整性来说合理的、可预见的威胁。

  ◆ 防范那些合理的、可预见的、不允许的滥用或是泄漏;并且

  ◆ 确保他们所有员工的合规性。

  此外,除了满足像PCI DSS这样的合规要求外,下述是应该考虑的最佳实践、可用来确保上面列出的所有数据库环境的安全。

  就运行数据库的主机的操作系统来说,以下的最佳实践应该到位:

  1、系统管理员和其他相关的IT人员应该拥有充分的知识、技能并理解所有关键操作系统的安全要求。

  2、当部署操作系统到受管理的服务环境中时,应采用行业领先的配置标准和配套的内部文档。

  3、在操作系统上应该只启用那些必需的和安全的服务、协议、守护进程和其它必要的功能。

  4、操作系统上所有不需要的功能和不安全的服务及协议应该有效地禁用。

posted @ 2012-01-05 17:48 顺其自然EVO 阅读(168) | 评论 (0)编辑 收藏

仅列出标题
共394页: First 上一页 344 345 346 347 348 349 350 351 352 下一页 Last 
<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

导航

统计

常用链接

留言簿(55)

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜