解语阁
一个“高级”架构师的个人博客

2008年7月15日

HTML圆角输入框
Technorati 标签: CSS3,CSS,HTML,圆角

这段时间做项目,美工设计的界面输入框都是圆角的,确实很好看,研究了一下,实现起来真还有些麻烦

firefox,safri,chrome这些浏览器基本都一定程度支持新的CSS3标准,可以用CSS来搞定圆角:

  1: border-radius: 5px; /* css 3标准 */
  2: -moz-border-radius: 5px; /* mozilla */
  3: -webkit-border-radius: 5px; /* webkit */
可是M$的IE就麻烦了, 直道IE9 还没完整支持CSS3,就只能用背景图片法,前后补图法等等,来模拟圆角效果了哭泣的脸
posted @ 2011-09-27 10:15 赵宝刚 阅读(3119) | 评论 (0) | 编辑 收藏
 
Flex 文件上传
Technorati 标签: Flex,Coding,upload,AS3,program,代码
:

上网查了一些资料,摸索着用Flex写了一个 文件上传的工具。没做太多修饰,主要代码贴出来,免得以后忘了

   1:  <!-- filename :flashuploader.mxml -->
   2:  <?xml version="1.0" encoding="utf-8"?>
   3:  <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
   4:                  xmlns:c="component.*"
   5:                  width="450" height="450" minWidth="460" minHeight="400" initialize="application1_initializeHandler(event)" layout="absolute">
   6:      <mx:Style source="css/main.css"/>
   7:      <mx:states>
   8:          <mx:State name="TEST">
   9:              <mx:AddChild position="lastChild" relativeTo="{filelist}">
  10:                  <c:uploadFile currentState="UploadError">
  11:                  </c:uploadFile>
  12:              </mx:AddChild>
  13:          </mx:State>
  14:      </mx:states>
  15:      <mx:LinkButton id="selectbutton" x="5" y="5" label="{selectlabel}" click="button1_clickHandler(event)"/>
  16:      <c:CountingVBox id="filelist" x="5" y="36" height="100%" maxCount="{max}"/>
  17:      <mx:Script>
  18:          <![CDATA[
  19:              import component.uploadFile;
  20:              import mx.events.FlexEvent;
  21:              private var filter:Array;
  22:              private var single:Boolean;
  23:              
  24:              private var fileRefs:FileReferenceList;
  25:              
  26:              private var fileRef:FileReference;
  27:              [Bindable]
  28:              private var max:int=10;
  29:              [Bindable]
  30:              private var selectlabel:String="文件上传";
  31:              
  32:              
  33:              
  34:              private function button1_clickHandler(event:MouseEvent):void
  35:              {
  36:                  if (single){
  37:                      fileRef = new FileReference();
  38:                      fileRef.addEventListener(Event.SELECT,singleSelectHandle);
  39:                      fileRef.browse(filter);
  40:                  }else{
  41:                      fileRefs = new FileReferenceList();
  42:                      fileRefs.addEventListener(Event.SELECT,multiSelectHandle);
  43:                      fileRefs.browse(filter);
  44:                  }
  45:              }
  46:              
  47:              private function singleSelectHandle(event:Event):void
  48:              {
  49:                  var file:uploadFile = new uploadFile();
  50:                  file.parentContainer=filelist;
  51:                  //                file.fileRef = FileReference(event.currentTarget);
  52:                  file.fileRef = fileRef;
  53:                  filelist.addChild(file);
  54:                  
  55:              }
  56:              
  57:              private function application1_initializeHandler(event:FlexEvent):void
  58:              {
  59:                  if( parameters.labelselect !=null) selectlabel = parameters.labelselect;
  60:                  if( parameters.ext != null)
  61:                      if ( parameters.type!=null)
  62:                          filter=[new FileFilter(parameters.type,parameters.ext)];
  63:                      else
  64:                          filter = [new FileFilter("Select Files"+parameters.ext, parameters.ext)];
  65:                  
  66:                  
  67:                  if (parameters.single!=null && "true" == parameters.single.toLowerCase()){
  68:                      single = true;
  69:                      max = 1;
  70:                  }else{
  71:                      if (parameters.max !=null )
  72:                          max = parameters.max ;
  73:                      if (isNaN(max)||max<=0 ) max=int.MAX_VALUE;
  74:                  }
  75:                  filelist.addEventListener("EMPTY",restoreSelectButton);
  76:                  filelist.addEventListener("FULL",disableSelectButton); 
  77:                  var prefix:String="http://localhost/fileupload";
  78:                  filelist.urlRequest = new URLRequest(prefix+"/upload.php");
  79:              }
  80:              
  81:              private function multiSelectHandle(event:Event):void
  82:              {    
  83:                  var fileList:Array=fileRefs.fileList;
  84:                  for(var i:int =0;i<fileList.length;i++){
  85:                      
  86:                      var file:uploadFile = new uploadFile();
  87:                      file.parentContainer=filelist;
  88:                      file.fileRef = fileList[i];
  89:                      filelist.addChild(file);
  90:                  }
  91:              }
  92:              
  93:              private function restoreSelectButton(event:Event):void
  94:              {
  95:                  selectbutton.visible=true;                
  96:              }
  97:              
  98:              private function disableSelectButton(event:Event):void
  99:              {
 100:                  selectbutton.visible=false;                
 101:                  
 102:              }
 103:              
 104:          ]]>
 105:      </mx:Script>    
 106:  </mx:Application>
   1:  <!-- filename: component/uploadFile.mxml -->
   2:  <?xml version="1.0" encoding="utf-8"?>
   3:  <mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml"
   4:             xmlns:c="component.*"
   5:             height="20" width="440" initialize="canvas1_initializeHandler(event)" >
   6:      <mx:states>
   7:          <mx:State name="UploadError" >
   8:              <mx:SetProperty name="label" target="{progressbar1}" value="{errorInfo}"/>
   9:              <mx:SetProperty name="styleName" value="error"/>
  10:          </mx:State>
  11:          <mx:State basedOn="UploadError" name="FileError">
  12:              <mx:SetProperty name="x" target="{image1}" value="317"/>
  13:              <mx:RemoveChild target="{progressbar1}"/>
  14:              <mx:SetStyle name="styleName" target="{label1}" value="error1"/>
  15:              <mx:SetProperty name="toolTip" target="{label1}" value="{errorInfo}"/>
  16:          </mx:State>
  17:      </mx:states>
  18:      <mx:Image x="5" width="16" height="16" source="{fileicon}" verticalCenter="-1" />
  19:      <c:FilenameLabel x="23"  width="160" text="{filename}" truncSize="10" verticalCenter="-1"/>
  20:      <mx:Label x="185" width="64" text="{extname}" verticalCenter="-1"/>
  21:      <mx:Label id="label1" x="251" width="64" text="{filesize}" textAlign="right" verticalCenter="-1"/>
  22:      <mx:ProgressBar id="progressbar1" x="317" width="100" height="16" label="%3%%" labelPlacement="center" maximum="100" source="{_fileRef}"
  23:                      verticalCenter="-1"/>
  24:      <mx:Image id="image1" x="419" width="16" height="16" click="cancle_clickHandler(event)" source="@Embed('icons/cancel.png')" verticalCenter="-1"/>
  25:      <mx:Script>
  26:          <![CDATA[
  27:              import flash.events.MouseEvent;
  28:              import flash.events.ProgressEvent;
  29:              
  30:              import mx.controls.Alert;
  31:              import mx.events.FlexEvent;
  32:              import mx.states.Transition;
  33:              
  34:              private static var MAX_FILE_SIZE:uint =int.MAX_VALUE;
  35:              
  36:              private var _parent:CountingVBox;
  37:              [Bindable]
  38:              private var _fileRef:FileReference ;
  39:              [Bindable]
  40:              private var errorInfo:String="";
  41:              [Bindable]
  42:              private var fileicon:Class;
  43:              [Bindable]
  44:              private var extname:String;
  45:              [Bindable]
  46:              private var filesize:String;
  47:              [Bindable]
  48:              private var filename:String;
  49:              
  50:              
  51:              
  52:              
  53:              public function set fileRef(value:FileReference):void
  54:              {
  55:                  _fileRef = value;
  56:                  filename=_fileRef.name.substring(0,_fileRef.name.indexOf(_fileRef.type));
  57:                  extname=_fileRef.type;
  58:                  var size:uint=_fileRef.size;
  59:                  var unit:String="B";
  60:                  if(size>10240){
  61:                      size/=1024;
  62:                      unit="KB";
  63:                  }
  64:                  if(size>10240){
  65:                      size/=1024;
  66:                      unit="MB";
  67:                  }
  68:                  if(size>10240){
  69:                      size/=1024;
  70:                      unit="GB";
  71:                  }
  72:                  
  73:                  filesize=size.toFixed(0)+unit;
  74:                  fileicon=getFileIconClass();
  75:                  if (checkFilesize()){
  76:                      _fileRef.upload(_parent.urlRequest);
  77:                      _fileRef.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA,upload_complete); 
  78:                }
  79:              }
  80:              
  81:              public function set parentContainer(p:CountingVBox):void
  82:              {
  83:                  _parent = p;
  84:              }
  85:              
  86:              
  87:              private function getFileIconClass():Class
  88:              {
  89:                  [Embed("icons/Unknown.png")] 
  90:                  var unknown:Class;
  91:                  
  92:                  [Embed("icons/doc.png")]
  93:                  var doc:Class;
  94:                                  
  95:                 //其他文件类型
  96:                  
  97:                  if (_fileRef.type == null){
  98:                      return unknown;
  99:                  }
 100:                  
 101:                  var type:String=_fileRef.type.toLowerCase();
 102:                  if (type == ".doc") return doc;
 103:                  if (type == ".docx") return doc;
 104:                  //其他文件类型
 105:                  
 106:                  return unknown;                
 107:              }
 108:              
 109:              private function cancle_clickHandler(event:MouseEvent):void
 110:              {
 111:                  _fileRef.cancel();
 112:                  _parent.removeUploadedFile(_fileRef);
 113:                  _parent.removeChild(this);
 114:                  if (_parent.count<1){
 115:                      _parent.dispatchEvent(new Event("EMPTY"));
 116:                  }
 117:              }  
 118:              
 119:              protected function upload_complete(event:DataEvent):void
 120:              {
 121:                  _parent.addUploadedFile(_fileRef); 
 122:              }
 123:              
 124:              protected function upload_IO_error(event:IOErrorEvent):void
 125:              {
 126:                  errorInfo="UploadError";
 127:                currentState = "UploadError";
 128:                   
 129:              }
 130:              
 131:              private function checkFilesize():Boolean
 132:              {
 133:                  if (_fileRef.size>MAX_FILE_SIZE){
 134:                      errorInfo = "File too Big";
 135:                      currentState = "FileError";
 136:                      return false;
 137:                  }
 138:                  return true;
 139:              }
 140:              
 141:          ]]>
 142:      </mx:Script>
 143:  </mx:Canvas>
 144:   
posted @ 2011-09-27 10:07 赵宝刚 阅读(287) | 评论 (0) | 编辑 收藏
 
千万要避免的五种程序注释方式

 

你是否有过复查程序时发现有些注释毫无用处?程序注释是为了提高代码的可读性,为了让原作者以外的其他开发人员更容易理解这段程序。

我把这些让人郁闷的注释方式归为了五类,同时把写出这些注释的程序员也归为了五类。我希望读了这篇文章后你感觉自己不属于其中的任何一种类型。如果你有兴趣的话可以读一下另外一篇文章 五种程序员(英文),和这篇讲到的五种程序员对比一下。

1. 高傲的程序员

public class Program
{
static void Main(string[] args)
{
string message = “Hello World!”; // 07/24/2010 Bob
Console.WriteLine(message); // 07/24/2010 Bob
message = “I am so proud of this code!”; // 07/24/2010 Bob
Console.WriteLine(message); // 07/24/2010 Bob
}
}

这种程序员是如此的欣赏自己的程序,以至于不得不在每行代码上都署上自己的大名。应该让版本控制系统来提供程序变更的信息,他这样做一眼看去并不能说明谁对这行代码负责。

2. 过时的程序员

public class Program
{
static void Main(string[] args)
{
/* 这段程序已经不再有用
* 因为我们发现千年虫问题只是一场虚惊
* 我们的系统不会恢复到1/1/1900
*/
//DateTime today = DateTime.Today;
//if (today == new DateTime(1900, 1, 1))
//{
// today = today.AddYears(100);
// string message = “The date has been fixed for Y2K.”;
// Console.WriteLine(message);
//}
}
}

如果一段程序不再有用(比如废弃了),那就删了它吧——不要被几行没用的注释搞的程序混乱不堪。即使你可能以后重用这段代码,你也可以使用版本控制系统,用它把你的程序恢复到以前的样子。

3. 天真的程序员

public class Program
{
static void Main(string[] args)
{
/* 这个程序是用来在屏幕上
* 循环打印1百万次”I Rule!”
* 每次输出一行。循环计数
* 从0开始,每次加1。
* 当计数器等于1百万时,
* 循环就会停止运行
*/
for (int i = 0; i < 1000000; i++)
{
Console.WriteLine(“I Rule
!”);
}
}
}

基本的编程语法规则我们大家都知道——我们不需要“编程入门”。你不需要浪费时间来解释一个显而易见的东西,我们更希望知道的是你的程序功能——那是浪费空间了。

4. 传奇的程序员

public class Program
{
static void Main(string[] args)
{
/* 有一天我在大街上的一家星巴克里
* 和销售部的Jim讨论问题,他告诉我
* 销售代表是依据以下的比例提取佣金的。
* 周五: 25%
* 周三: 15%
* 其它日期: 5%
* 我是否告诉你过我点了一个卡拉梅
* 铁咖啡和两份的Espresso?
*/
double price = 5.00;
double commissionRate;
double commission;
if (DateTime.Today.DayOfWeek == DayOfWeek.Friday)
{
commissionRate
= .25;
}
else if (DateTime.Today.DayOfWeek == DayOfWeek.Wednesday)
{
commissionRate
= .15;
}
else
{
commissionRate
= .05;
}
commission
= price * commissionRate;
}
}

如果你不得不在注释里写明需求,那也不要提到人名。销售员Jim很可能在公司里不再是销售。而且大多数读到这段注释的程序员未必都知道Jim是谁。你描述的是实际情况但跟我们的内容不相干,所以就省掉吧。

5. 未来程序员

public class Program
{
static void Main(string[] args)
{
//TODO: 将来我会修复这个问题 – 07/24/1995 Bob
/* 我知道这个问题很难解决而且
* 我现在依赖于这个Contains函数,但
* 我以后会用一种更有意义,更
* 优雅的方式打印这段代码。
* 我只是现在没时间。
*/
string message = “An error has occurred”;
if(message.Contains(“error”))
{
throw new Exception(message);
}
}
}

这种注释是一种集大成者,它包含了上面所说的注释的所有问题。TODO注释在一个项目最初的开发阶段是非常有用的,但这个注释看起来是在好几年前的产品程序里的——它证明了程序有问题。如果程序有问题需要解决,马上解决,不要拖到日后再解决。

如果你写过这样的注释,或者是你正在寻找一种最好的注释方案,我推荐你读一读Steve McConnell写的《Code Complete》这本书。这是我推荐给所有程序员必读的六本书中的一种。或者你可以学学如何停止注释你的程序(英文)。

你是否在你的程序里还见到过其它种没有意义的或讨厌的注释?欢迎共享。

英文原文:5 Types of Comments to Avoid Making in Your Code

 

posted @ 2010-08-13 22:32 赵宝刚 阅读(246) | 评论 (0) | 编辑 收藏
 
如何选择最合适的Web开发框架
  开发框架的选择,始终是个仁者见仁、智者见智的事情。尤其是Web层的开发框架,数量非常多,而且各有特色,如:Struts、WebWork、Spring MVC、Tapestry、JSF、WebPage3.0……等等。

  下面先来看看为什么要使用Web开发框架


  一:使用框架的必然性


  框架,即framework。其实就是某种应用的半成品,把不同应用程序中有共性的一些东西抽取出来,做成一个半成品程序,这样的半成品就是所谓的程序框架。


  软件系统发展到今天已经很复杂了,特别是服务器端软件,涉及到的知识,内容,问题太多。在某些方面使用别人成熟的框架,就相当于让别人帮你完成一些基础工作,你只需要集中精力完成系统的业务逻辑设计。这样每次开发就不用白手起家,而是可以在这个基础上开始搭建。


  使用框架的最大好处:减少重复开发工作量、缩短开发时间、降低开发成本。同时还有其它的好处,如:使程序设计更合理、程序运行更稳定等。基于这些原因,基本上现在在开发中,都会选用某些合适的开发框架,来帮助快速高效的开发应用系统。


  了解了使用框架的必然性,下面来看看如何选择,当然我们的话题集中在Web层的开发框架。在谈这个问题之前,先来看看我们在Web开发中究竟需要做些什么工作:


  二:Web层开发的工作


  在J2EE开发中,分层是基本的思想,3层架构或者多层架构早已深入人心,在这里我们就把目光集中到Web层,看看到底Web层开发做了那些工作:


  1:数据展示


  Web层需要从逻辑层获取需要展示的数据,然后以合理的方式在页面进行展示


  2:人机交互


  用户需要从界面上输入数据,在界面上进行按钮点击,进而触发事件,标准的事件驱动模型,然后跟后台进行数据交换,出现新的界面。


  3:收集数据,调用逻辑层接口


  Web层收到用户的事件请求,需要调用相应的逻辑层接口来进行处理,Web层是不会有任何逻辑处理的。调用逻辑层接口,需要传递参数,这时需要收集用户在界面上输入的数据,然后进行组织,组织成为逻辑层接口需要的数据封装形式(通常都是ValueObject)。


  4:根据逻辑层的数据来重新展示页面


  逻辑层处理完了,需要返回数据或信息到界面上。这个时候Web层需要根据返回的值选择合适的页面,然后展示这些数据或者信息。


  从上面可以看出,Web层开发的主要工作集中在展示上,也就是图形用户界面。这一部分是用户直观感受应用程序的窗口,也是用户要求最多的地方,其表现形式也是最丰富的。


  三:Web层开发的步骤


  下面再来总结一下Web层开发的大致步骤(也就是需要开发人员做的工作):


  注意:这里讨论的Web层开发,是不使用任何开发框架时候的开发。


  1:写页面Html,到底有哪些数据需要在界面上表现


  2:每个数据的具体表现形式,如:有的需要表现成为下拉列表,有的需要表现成为单选按钮等。


  3:界面表现形式的逻辑布局,所谓逻辑布局是指某些数据的表现形式应该放在前面,某些应该放在后面;某些放在上面,某些放在下面。如:某个请假
申请的业务,有请假开始时间和结束时间,很明显开始时间的表现就应该排在结束时间的前面。而美工是负责最后页面的美观,一般美工不能动界面的逻辑布局。

  4:完成前面3步,页面的表现形式的大致模样就有了,下面需要来做功能性的开发。第一个就是这些表现形式的值的来源,如:下拉列表显示的值从什么地方来。值的来源方式很多,有数据库中来、固定值、某断程序运行的中间结果、前面页面传递过来等等,当然典型的还是来自数据库。

  好了,确定了值的来源,开发人员就要写代码来获取这些值,然后把这些值赋值到对应的表现形式里面。


  5:还有一些比较特殊,也就是真实操作的是一类值,但是在界面上显示的是另一类值,比如:数据库中有用户编号,到了界面上就得显示用户姓名,但
是所有的操作都是要操作用户编号的。我们把这种情况分做:真实值和表现值,他们有一定的内在联系。这些都是要开发人员去转化和维护的。


  6:接下来就应该开发功能性的事件响应了。用户点击了某个按钮或者触发了某个事件,首先是客户端:数据检测、客户端事件处理;然后提交到服务端,服务端要获取到客户端提交的数据,然后调用相应的逻辑层接口来响应。当然如何写逻辑层的实现这里就不去谈论了。


  7:逻辑层执行完过后,返回数据和信息到Web层,开发人员还需要写代码去处理,选择哪个页面来显示,如何显示这些数据和信息等。


  8:在整个交互的过程中,还必须考虑到如何控制权限,如:某些数据不能显示,某些数据不能编辑等等;同样还需要考虑到消息的配置和国际化等等。这些功能起源于逻辑层,但是实际的控制要到Web层,这些都需要开发人员来控制。


  9:完成了上面的开发步骤,页面基本的功能开发就告一段落,接下来开发人员需要考虑页面美观的问题了。大家可能会说:“不是有美工吗,还需要开
发人员干什么?”。事实上美工多半只能出一个静态页面的美化模版,美工对于一推Java代码和Html的混杂物,多半是没有办法的,更不要说还有一些内容
是动态生成的,美工就更不可能搞定了。还是得开发人员上阵,按照美工给的模版,开始添加Css:class、id、style……


  10:完成上面的开发,基本页面的开发工作就完成了,最后的一个步骤就是把各个页面有机的组织起来,开发应用程序的整体应用导航框架,通常就是菜单,然后把各个功能页面跟菜单结合起来,形成一个完整的应用。


  在这里我们省略了开发期反复的调试过程,仅总结开发的步骤。


  四:选择Web开发框架的目的


  了解了如果没有框架,我们需要做的工作,这对选择框架有非常大的帮助。


  框架,直白点说,就是一个半成品,能够帮我们做一些事情的半成品。


  框架的选择,就是看哪个框架最合适,从而减少开发的工作量,提高开发的效率和质量,并有效减少维护的工作量,最终达到节约综合开发成本,获取更多的收益。


  五:选择Web开发框架的标准


  声明:这里所谈的选择Web开发框架的标准,只是我们的总结和一家之言,并不是放之四海而皆准的真理,请根据您的体会客观的看待我们的总结。


  另外:我们这里更多的讨论业务功能性应用程序的Web开发框架。


  1:选择能够对我们的开发过程提供更多、更好帮助的Web开发框架


  2:Web开发框架的学习一定要简单,上手一定要快,没有什么比使用能得到更深的体会。那些动不动就需要半个月或者一个月学习周期的框架,实在是有些恐怖。


  3:一定要能得到很好的技术支持,在应用的过程中,或多或少都会出现这样或者那样的问题,如果不能很快很好的解决,会对整个项目开发带来影响。一定要考虑综合成本,其实这是目前应用开源软件最大的问题,碰到问题除了死肯文档就是查阅源代码,或者是网上搜寻解决的办法,通常一个问题就会导致1-2天的开发停顿,严重的甚至需要一个星期或者更长,一个项目有上这么几次,项目整体的开发成本嗖嗖的就上去了。


  4:Web开发框架结合其他技术的能力一定要强,比如:在逻辑层要使用Spring或者Ejb3,那么Web开发框架一定要能很容易,很方便的与它们进行结合。


  5:Web开发框架的扩展能力一定要强。在好的框架都有力所不及的地方,这就要求能很容易的扩展Web开发框架的功能,以满足新的业务需要。同时要注意扩展的简单性,如果扩展框架的功能代价非常大,还不如不用呢。


  6:Web开发框架最好能提供可视化的开发和配置,可视化开发对开发效率的提高,已经得到业界公认。


  7:Web开发框架的设计结构一定要合理,应用程序会基于这个框架,框架设计的不合理会大大影响到整个应用的可扩展性。


  8:Web开发框架一定要是运行稳定的,运行效率高的。框架的稳定性和运行效率直接影响到整个系统的稳定性和效率。


  9:Web开发框架一定要能很好的结合目前公司的积累。在多年的开发中已有了很多积累,不能因为使用Web开发框架就不能再使用了,那未免有些得不偿失。


  10:选择开发框架另外要注意的一点就是:任何开发框架都不可能是十全十美的,也不可能是适应所有的应用场景的,也就是说任何开发框架都有它适用的范围。所以选择的时候要注意判断应用的场景和开发框架的适用性。



posted @ 2008-11-14 09:28 赵宝刚 阅读(221) | 评论 (0) | 编辑 收藏
 
XSS攻击防御技术白皮书
  XSS攻击,跨站脚本攻击是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。XSS攻击将对用户的web安全构成巨大的威胁。
1、什么是XSS攻击

  XSS攻击:跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆。故将跨站脚本攻击缩写为XSS。XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。比如这些代码包括HTML代码和客户端脚本。攻击者利用XSS漏洞旁路掉访问控制——例如同源策略(same origin policy)。这种类型的漏洞由于被骇客用来编写危害性更大的phishing攻击而变得广为人知。对于跨站脚本攻击,黑客界共识是:跨站脚本攻击是新型的“缓冲区溢出攻击“,而JavaScript是新型的“ShellCode”。

  数据来源:2007 OWASP Top 10的MITRE数据

  2007 OWASP Top 10的MITRE数据

  注:OWASP是世界上最知名的Web安全与数据库安全研究组织

  从这张图中我们看到,在2007年OWASP所统计的所有安全威胁中,跨站脚本攻击占到了22%,高居所有Web威胁之首。

  XSS攻击的危害包括

  1、盗取各类用户帐号,如机器登录帐号、用户网银帐号、各类管理员帐号

  2、控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力

  3、盗窃企业重要的具有商业价值的资料

  4、非法转账

  5、强制发送电子邮件

  6、网站挂马

  7、控制受害者机器向其它网站发起攻击

  XSS漏洞的分类

  XSS漏洞按照攻击利用手法的不同,有以下三种类型:

  类型A,本地利用漏洞,这种漏洞存在于页面中客户端脚本自身。其攻击过程如下所示:

  Alice给Bob发送一个恶意构造了Web的URL。

  Bob点击并查看了这个URL。

  恶意页面中的JavaScript打开一个具有漏洞的HTML页面并将其安装在Bob电脑上。

  具有漏洞的HTML页面包含了在Bob电脑本地域执行的JavaScript。

  Alice的恶意脚本可以在Bob的电脑上执行Bob所持有的权限下的命令。

  类型B,反射式漏洞,这种漏洞和类型A有些类似,不同的是Web客户端使用Server端脚本生成页面为用户提供数据时,如果未经验证的用户数据被包含在页面中而未经HTML实体编码,客户端代码便能够注入到动态页面中。其攻击过程如下:

  Alice经常浏览某个网站,此网站为Bob所拥有。Bob的站点运行Alice使用用户名/密码进行登录,并存储敏感信息(比如银行帐户信息)。

  Charly发现Bob的站点包含反射性的XSS漏洞。

  Charly编写一个利用漏洞的URL,并将其冒充为来自Bob的邮件发送给Alice。

  Alice在登录到Bob的站点后,浏览Charly提供的URL。

  嵌入到URL中的恶意脚本在Alice的浏览器中执行,就像它直接来自Bob的服务器一样。此脚本盗窃敏感信息(授权、信用卡、帐号信息等)然后在Alice完全不知情的情况下将这些信息发送到Charly的Web站点。

  类型C,存储式漏洞,该类型是应用最为广泛而且有可能影响到Web服务器自身安全的漏洞,骇客将攻击脚本上传到Web服务器上,使得所有访问该页面的用户都面临信息泄漏的可能,其中也包括了Web服务器的管理员。其攻击过程如下:

  Bob拥有一个Web站点,该站点允许用户发布信息/浏览已发布的信息。

  Charly注意到Bob的站点具有类型C的XXS漏洞。

  Charly发布一个热点信息,吸引其它用户纷纷阅读。

  Bob或者是任何的其他人如Alice浏览该信息,其会话cookies或者其它信息将被Charly盗走。

  类型A直接威胁用户个体,而类型B和类型C所威胁的对象都是企业级Web应用,目前天清入侵防御产品所能防范的XSS攻击包括类型B和类型C。

 2、XSS攻击防御

  基于特征的防御

  XSS漏洞和著名的SQL注入漏洞一样,都是利用了Web页面的编写不完善,所以每一个漏洞所利用和针对的弱点都不尽相同。这就给XSS漏洞防御带来了困难:不可能以单一特征来概括所有XSS攻击。

  传统XSS防御多采用特征匹配方式,在所有提交的信息中都进行匹配检查。如, 对于这种类型的XSS攻击,采用的模式匹配方法一般会需要对“javascript”这个关键字进行检索,一旦发现提交信息中包含 “javascript”,就认定为XSS攻击。这种检测方法的缺陷显而易见:骇客可以通过插入字符或完全编码的方式躲避检测:

  躲避方法1)在javascript中加入多个tab键,得到    

<IMG SRC="jav ascript:alert('XSS');">

  躲避方法2) 在javascript中加入&#x09编码字符,得到 

<IMG SRC="jav&#x09;ascript:alert('XSS');">

  躲避方法3) 在javascript中加入字符,得到    

<IMG SRC="jav&#x0A;ascript:alert('XSS');">

  躲避方法4)在javascript中的每个字符间加入回车换行符,得到

<IMG SRC="j\r\na\r\nv\r\n\r\na\r\ns\r\nc\r\nr\r\ni\r\np\r\nt\r\n:alert('XSS');">   

   躲避方法5)对"javascript:alert('XSS')"采用完全编码,得到

<IMGSRC=&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x27&#x58&#x53&#x53&#x27&#x29>

  上述方法都可以很容易的躲避基于特征的检测。而除了会有大量的漏报外,基于特征的还存在大量的误报可能:在上面的例子中,对"http://www.xxx.com/javascript/kkk.asp?id=2345"这样一个URL,由于包含了关键字“javascript”,也将会触发报警。

  基于代码修改的防御

  和SQL注入防御一样,XSS攻击也是利用了Web页面的编写疏忽,所以还有一种方法就是从Web应用开发的角度来避免:

  步骤1、对所有用户提交内容进行可靠的输入验证,包括对URL、查询关键字、HTTP头、POST数据等,仅接受指定长度范围内、采用适当格式、采用所预期的字符的内容提交,对其他的一律过滤。

  步骤2、实现Session标记(session tokens)、CAPTCHA系统或者HTTP引用头检查,以防功能被第三方网站所执行。

  步骤3、确认接收的的内容被妥善的规范化,仅包含最小的、安全的Tag(没有javascript),去掉任何对远程内容的引用(尤其是样式表和javascript),使用HTTP only的cookie。

  当然,如上操作将会降低Web业务系统的可用性,用户仅能输入少量的制定字符,人与系统间的交互被降到极致,仅适用于信息发布型站点。并且考虑到很少有Web编码人员受过正规的安全培训,很难做到完全避免页面中的XSS漏洞。

  正是由于传统检测方法存在诸多缺陷,国内厂商(如启明星辰天清入侵防御系统)并未采用这一方法,而是采用了基于攻击手法的行为检测方法。  

  首先对各种场景下的XSS攻击样本库进行整理和分类,并建立起XSS攻击行为特征库,在实时攻击检测阶段,对所有可能实现XSS攻击的数据来 源,如HTTP-Refere、URL、COOKIE、表单数据等,进行数据收集和初步分析,存在注入脚本的用户提交信息才进入下一步的XSS攻击判断。

  这种分析方法有以下几点优势:

  A:采用行为特征库而非数据特征库方式,可以避免由于检测固定特征导致的误报可能。

  B:内置数据预处理过程,可以对所有可能包含XSS攻击的数据进行预处理,放行大部分正常HTTP请求,仅对少量疑似事件进行深入分析,提升分析速度,降低资源开销。

  C:XSS攻击行为特征库维护由启明星辰公司AD-LAB(积极防御实验室)和博士后工作站负责,AD-LAB拥有大批漏洞发掘和分析人 员,2007年发现并获得CVE编号的漏洞数量多达26个,是国内独立发掘CVE漏洞数量最多的团队。启明星辰博士后工作站是业内第一家驻企业的信息安全 博士后工作站,为产品算法实现、研究技术转化提供有力保障。

  3、综论

  XSS攻击作为Web业务的最大威胁之一,不仅危害Web业务本身,对访问Web业务的用户也会带来直接的影响,如何防范和阻止XSS攻击,保障Web站点的业务安全,是定位于业务威胁防御的入侵防御产品的本职工作。只有结合对XSS攻击的分析,才能能准确的发现和防御各类XSS攻击行为,保障Web业务的正常运营。

Blogged with the Flock Browser

Tags: XSS, Web, Web安全, 攻击, 网页挂马, 防御

posted @ 2008-08-21 09:01 赵宝刚 阅读(311) | 评论 (0) | 编辑 收藏
 
产品经理们,遇到Bug请别十万火急

原文作者:Jeff Lash 原文链接:Take a cautious approach to problem-solving 翻译:远骋

如果你希望成为一个失败的产品经理,在遇到bug时,请立即动手修复它。

如果bug可以立即被修复,为何要一拖再拖?PM应该是一位“执行者”,而非总是纸上谈兵的“思考者”。当问题出现后,必须在第一时间搞定它。当然,这样做可能浪费大量的时间,也可能分散精力,不过这是一位PM的最佳时间分配方式,不是吗?

如果你希望成为一个成功的产品经理,在遇到bug时,请不要总是立即着急的修复它。

不可否认,我们在遇到问题时,总是迫不及待的想改正。然而事实上,其实根本不用那么的十万火急,理由如下:

  1. 如果迅速解决了问题,你可能会忽略问题的根本原因。 在大多数时候,每个问题都有其根本诱因。在问题刚暴露的时候,诱因一般深藏不露,有很多的可能性。 笔者认为,根本诱因最可能来自于需求确认阶段。多篇文章都探讨了这方面的问题,比如:  Stop Gathering Requirements, Follow up on requests to learn more, Find solutions that address multiple problems.

    同样,在产品管理的其他阶段,这个理论也适用。有些问题可以很容易就找到根本诱因,但产品开发的真正挑战来自各种不稳定的因素。 例如,有时候一款漏 洞百出的产品在上线之初,只暴露了冰山一角:一个很小的Bug,似乎十分容易解决。 另一个例子,开发过程中,团队成员对各项功能的优先级有争议时,靠“民主投票”来做决策,而忘了引发争议的源头:对产品远景、战略及计划缺乏共识。

    医生的任务不是治标,而是治本。对于PM而言,道理一模一样。

  2. 让问题暴露一段时间,或许是让大家认识到其严重性的唯一方法。 很多父母都会说,他们的小孩吃一堑才长一智--例如,不去摸滚烫的炭炉--若小孩自己被炭炉烫伤一次后,他们自然会明白那东西是摸不得的。在产品开发过程 中,存在着同样的道理。当你试图请同事修改或改进某功能时,你需要解释这是为了什么。如果大家不明白改进的意义,自然会无动于衷。

    举 个例子,假设你发现团队使用的需求管理软件存在着很大的问题,假如你希望马上修改它,或许得花大量精力去告诉大家修改的意义,还得制作demo进行说明。 但如果让这个需求管理软件继续运转一段时间,让它自己暴露出弱点,可能是一种更好的办法。因为需求管理软件的问题,在新产品上线前,你会发现有些 最初制定的需求并没有实现。此时,你可以告知大家这些遗漏的需求,但是不需要为之耽误了上线时间。如果你是正确的,要不了多久,大家就会意识到,因为使用 了那个糟糕的需求管理软件,才导致产品出现一些无法挽救的Bug。

    提醒,本方法需十分小心的使用。作为PM,就算你本意是为了让同事们更透彻的看清问题,也不能忘了你是该产品最终成败的负责人。所以多数情况下,使用本方法时,最好选择小项目来作为案例。

  3. 问题可能没有你想象中那么严重。 每次问题出现的时候--产品暴露了Bug,用户发出抱怨,会议上的争论--看上去总是迫切得非解决不可。于是,PM不得不暂时暂停正在进行的真正关键工作--战略、计划、用户调研--而把精力用在四处“灭火”上。

  4. 然而,必须立即解决的Bug其实很少。 同时,与PM应该着重思考的产品方向等问题比起来,这些Bug的重要性实 在很低。每个Bug都 有看上去万分关键的时刻,但过段时间后,它们似乎都变得无关紧要了。事实上,真正严重的Bug会迅速暴露出来。牢记这一点,会让PM把时间用在刀刃上,而 不是每天都在处理危机。

  5. 花更多的时间可以找到更完美的解决方案。 若 在全面了解Bug之前,就急着去为Bug寻找答案,我们通常会选择脑 海中冒出来的第一个解决方案。这可能也算是一个过得去的方案,不过若我们花更多时间来分析此Bug,找到其根本诱因,甚至来一场头脑风暴,或许我们能发现 更完美的解决方案。当然了,花更多时间也不一定就找得到更棒的方案,但至少,花了时间之后,得到的不会是更少的备选方案或更差的解决方案。

下 一次遭遇Bug时,请别十万火急。PM需要有战略眼光(不是战术),请先分析Bug,找到根本诱因,并衡量全局重要性,再对Bug进行 解决。若不是每一次都着急解决每一个Bug,PM可以花更少的时间四处“灭火”,从而拥有更多的时间去思考产品战略--如何给用户带去更多的价值。

Blogged with the Flock Browser

Tags: 产品经理, 项目经理, BUG, 需求

posted @ 2008-08-11 17:28 赵宝刚 阅读(205) | 评论 (0) | 编辑 收藏
 
在ERP项目中建立针对个人激励制度
  ERP实施顾问在推进项目的过程中,应该注意项目团队中各成员之间的相互激励。如果激励制度设置的不当,可能项目小组成员不仅不会创造贡献,还很有可能发生内部战争,产生一些比必要的内耗。

  ERP实施顾问在推进项目的过程中,应该注意项目团队中各成员之间的相互激励。如果激励制度设置的不当,可能项目小组成员不仅不会创造贡献,还很有可能发生内部战争,产生一些比必要的内耗。为此,实施顾问必须建立有效的只针对个人而不是成员之间的激励制度。换句话说,即将现有的个体之间的竞争,人与人之间的比较,转化为自己和自己的竞争。如果错误的将所有的项目小组成员都赶到一条独木桥上,让他们去夺取隔岸的那一颗唯一的胜利果实,那么合作将不可能形成,相互激烈就会被相互泄气所代替。

  简而言之,在项目实施的过程中,ERP实施顾问需要建立一定的激励制度,但是,不能让员工感到是相互之间的竞争,而是要让他们感受到是一种自我的提升。当然,要做到这一点,对于那些没有团队管理的项目负责人来说,可能会有一点难度。下面作者就分享一些这方面的团队管理技巧,或许能够给大家带来一定的帮助。

  原则一:不要在团队内部缔造英雄。

  俗话说,棒打出头鸟。若你把团队中的某个人员缔造成英雄,那是一种很不理智的行为。你可能初始的目的,想在团队中树立一个榜样,让大家都能够效仿他。但是,在实际工作中,往往是适得其反。大家看到这个榜样,有时会不仅不会学习他,而是会眼红,会妒忌,更会有不平。他们会觉得公司既然认为这个ERP项目的成就都是这个英雄取得的,那么以后就让他一个人去工作好了,以后这个项目跟我们无关,反正项目的好坏跟我们没有关系。很明显,这跟项目负责人起初的目的大相径庭。

  在国际上,有一个著名的足球教练,他说过一句非常有哲理的话,我是记忆犹深。他说,我们足球队没有英雄,个个都是英雄。确实,在足球场上赢得胜利,不是前锋一个人的功劳,而是后卫、中锋、门卫一起的功劳。若在足球场上过度的强调进球人的贡献的话,则难免会在团队中形成隔阂。所有的光环都在射球人身上的话,那谁以后还去当这幕后的英雄呢?

  其实,在ERP项目实施过程中也是类似的道理。有可能某个人,在项目的实施过程中确实有伟大的贡献,但是,整个项目要取得成功,不是一人之力可以达到的。若把项目取得成效的光环都套在某一个人的头上的话,则对其他人是不公平的。要知道ERP项目是一个持续完善的过程,若在一个阶段取得胜利之后,就把某位员工塑造成英雄,那么后续完善工作有谁来做呢?难道凭一个英雄就可以完成吗?

  所以,笔者认为,在ERP项目的团队中,不要塑造个人英雄。ERP项目实施小组中,没有英雄。只要项目取得成功,那么个个都是英雄,每个人都应该得到嘉奖。

  原则二:尽量以团队为单位进行嘉奖,而不是以个人

  若我们在激励员工的时候,以个人为单位进行嘉奖,会产生什么情况呢?则难免就会形成员工个人与个人之间的竞争。俗话说,人比人,气死人。这真是团队管理的禁忌。笔者认为,ERP项目要取得成功,不是靠个人之力,而是团队相互协作的结果。所以,不要在团队内部之间形成相互赛跑的局面,而应该努力培养一个自我提升的氛围。

  1、在项目取得阶段性胜利的时候,为团队进行嘉奖。很多企业在项目取得成功之后,很喜欢论功行赏。根据团队成员中,项目贡献的大小,分别给与不同程度的奖励。这看起来好像很公平,谁的贡献多,谁的奖励就多。但是,在实际工作中,笔者认为这是行不通的,这可能会造成项目组成员之间的对立。为什么这么说呢?首先,我们扪心自问,在评论项目组各个成员的贡献时,我们能够做到合理吗?要知道,很多工作都是大家协作的结果,我们能够区分彼此贡献的大小吗?其次,我们再次扪心自问,在对他们进行评价的时候,我们会不会按照个人的喜好,在评价的结果中介入一些主观的因素呢?所以,笔者认为,若一定要把一个团队的贡献一一分解开来,强加到各个项目成员身上的话,那是不合理的,会加深员工之间的矛盾。那么,后续的项目工作,将很难开展。贡献大的人会居功自傲,而贡献小的人则会认为自己再怎么努力也不会被人赏识。所以,在项目取得阶段性成果之后,要对整个团队进行嘉奖,而完全没有必要,对项目小组的成员进行按功行赏。这不对不会提升团队的合作能力,而只会加大团队成员之间的隔阂。

  2、要设置尽量多的胜利帽子,而不要造成众人抢过独木桥的现象。在足球赛场上,会按不同的位置设置不同的奖项。如最佳守门员、最佳前锋、最佳后卫等等。如此的话,每个位置的人就会坚守自己的岗位,努力做的更好。他们就不会三心二意,觉得自己所负责的位置没有出风头的机会,一心就想着去射门、去做前锋等等。如此的团队,其协作型又怎么会好呢?其实,在ERP项目中也有类似的问题。若我们在设置项目激励制度的时候,只设置了一个奖项,如把项目奖金的80%奖励给项目实施过程中有杰出贡献之人,而这人也就只有一个。那会产生什么样的情况呢?项目小组成员个个都是企业的皇子,他们就会为了争夺这个太子的位置,相互扯后腿,相互攻击。企业这是人为的造了一条独木桥。如此的话,ERP项目小组的各个成员之间,就会拉小帮派,就不会有劲往一处使了。笔者是非常反对这种做法的。笔者现在的处理方式是,以部门为单位,进行选拔。也就是说,我们ERP项目有五个部门参与的话,则把80%的奖金分为5份,每个部门一份。让每个部门自己选择一个杰出贡献人员。如此的话,就可以有效的避免部门之间的竞争,同时,又能够起到激励的作用。

Blogged with the Flock Browser

Tags: 项目管理, ERP, 软件工程

posted @ 2008-08-11 16:05 赵宝刚 阅读(198) | 评论 (0) | 编辑 收藏
 
MySQL 5.1正式版即将公开发布
  Sun的官员日前表示MySQL 5.1开源数据库的正式版将在未来的几周内公开发布(generally available)。Sun原定于2008年更早的时候公开发布该版数据库,但为了让开发人员修复软件漏洞而不得不推迟发布时间。

  Sun日前已经确认最新版的MySQL 5.1的所有重大漏洞已经被修复,一切都准备就绪,翘首以盼的开源用户可以期待它能够在未来的几周之内公开发布。Sun公司的数据库产品部门副主席Zack Urlocker表示,Sun的开发人员已经在很多方面对MySQL 5.1进行了反复检查和测试,确保公开发行的正式版毫无问题。

  Sun的官员早在四月份的MySQL大会上就曾经放出消息说,这个新版的MySQL数据库会在会议结束的几周之内与大家见面。不过,为了找出 MySQL 5.1的重大漏洞并将其修复所花费的时间远远超出了Sun的预算,所以MySQL 5.1正式版的公开发布时间不得不一拖再拖。

  市场调查机构451集团的分析师Matt Aslett表示,数周前MySQL的创始人Monty Widenius邀请MySQL的开发人员帮助公司决定是否该公开发布MySQL 5.1。很显然,该公司对之前5.0的公开发布以及5.1候选版发布时因为不够审慎所犯下的错误仍然心有余悸,以至于现在很担心会不会第三次犯错。 MySQL认为有必要公开咨询发布事宜的事实表明,公司对于漏洞报告过程信心不足,不然就是过于谨慎了。

  Urlocker称,Sun承诺,在给该产品贴上公开发行的标签并正式推荐客户将其用在生产环境前,必须确保产品是真的没有问题可以投放市场才 行。这也是Sun为什么在产品发布候选版(RC)阶段找人来帮忙的原因。同时,Urlocker也表示,在开发人员的努力下,目前已经把客户曾经上报没有 修复的优先级为一和二的已知漏洞都修复了。

  Forrester市场调查机构的分析师Noel Yuhanna则认为,如果MySQL要扩展其现有功能,以便为高性能的企业级环境提供支持,那么在这条提升的道路上必定会遇到困难,而Sun的延迟发布 就是最有力的证明。MySQL 5.1的研发大概耗时了三年时间,Sun对MySQL的项目一直都雄心勃勃,为此增加了大量企业级功能,以改善性能,例如基于行的复制等特性。这个功能可 以在主服务器和从服务器之间复制数据的变化,而不是实际的SQL语句。为了提高灵活性,MySQL团队还添加了混合复制功能,可以根据单个的SQL操作来 选择使用语句复制或行复制。其他的增强功能还包括支持五种不同的数据分区形式——hash分区、list分区、key分区、range分区和sub-partitioning分区,据称这项功能可以帮助客户处理超大型的数据集。考虑到这些功能都非常复杂,确实需要在研发和测试过程中投入相当大的力度,特别是如果想让这款软件能够支持大型复杂的生产环境的话。

Blogged with the Flock Browser

Tags: Mysql, 产品发布, Sun

posted @ 2008-08-07 13:36 赵宝刚 阅读(201) | 评论 (0) | 编辑 收藏
 
电子商务几大问题阻碍中小企业发展
在电子信息时代,是否充分利用电子商务成为中小企业成败的关键。但在中小企业运用电子商务的过程中,会遇到一些问题,影响到中小企业的电子商务的实施。

在电子信息时代,是否充分利用电子商务成为中小企业成败的关键。“没有电子商务,企业就只能等待死亡!”或许有些偏激,但确实是企业发展壮大的基本。但在中小企业运用电子商务的过程中,会遇到一些问题,影响到中小企业的电子商务的实施。

首先,对电子商务认识不足的问题

许多中小企业管理基础落后,领导信息化意识不强,也没有充分认识到知识经济时代抢占信息市场的重要性。或者对如何开展电子商务理解比较片面,如 认为电子商务就是上网,或简单地建一个网站,而相关的管理基础却没有跟上,企业的电子商务仅停留在表面的网站建设上。因此中小企业不但在观念上要重视电子 商务,而且要了解电子商务的实质,不宜盲目跟风。

此外,电子商务不单是一个企业的事情。中小企业供应链的管理能力欠缺,如何和供应链的核心企业合作,借助其平台或第三方共享交易平台开展业务也是中小企业开展电子商务的重要话题。

其次,设施落后的问题

中小企业使用互联网和参与电子商务的程度参差不齐。据统计,目前参与电子商务的企业仅为22.3%,在众多的行业用户中,汽车行业、电子行业和 贸易行业等信息化建设水平较高。但在这些领先的行业,电子商务的应用也极不平衡,很多网站都不成熟,如网站建设目的不明确,不知道目标用户是谁,不能反映 出企业的形象,网站功能简陋,用户找不到自己需要的信息,用户的咨询也常常得不到回复等。有些企业虽然建立了网站,但过于关注于传统业务,网站利用率极 低,甚至成为一个空壳。

由于资源有限,许多中小企业需要把主要精力集中放在业务上,难以投入足够的资源进行信息化建设。但中小企业普遍对采购、生产、库存、销售、财务 和人事等方面的应用有一定需求,应用服务提供商模式ASP就成为中小型企业开展电子商务的选择。就目前ASP的发展情况而言,由于观念、安全等方面的因素 影响,ASP在国内的发展并不让人满意。

再次,执行不力的问题

由于中小型企业管理者还未充分认识到电子商务给企业发展,营销手段带来的革命性变化,因此对人才的培养没有足够的重视,导致电子商务人才的匮 乏。中小型企业开展电子商务既要技术又要人才,但这方面的人才在大企业也不是很充裕。专业人员的不足,电子商务模式缺乏创新,导致中小型企业缺乏网络经营 的经验,电子商务的优越性表现不出来,许多中小型企业涉足电子商务心有余力不足。

资金短缺是中小企业的普遍困难。在有限资金的合理使用方面,许多中小企业尚处于摸索阶段。很多中小企业对硬件的投资占到整个信息化投资80%以上,而配套软件和IT服务等方面投入相对滞后,对软件的选型不恰当,咨询合作伙伴协调不力,最终会使企业的投资回报率低,难以获得持久的发展动力。

第四、缺乏规划的问题

中小型企业开展电子商务往往缺乏长远规划,比较注意短期效益。电子商务涉及业务转型,不同企业发展电子商务的方式也是不同的。从利用互联网浏 览、收集、发布信息,到建立企业网站,建立信息平台,实施网上采购,再到建立行业联合采购平台,完善自己的供应链管理系统等,中小型企业电子商务的实施要 逐步到位,长远规划,分步实施。

电子商务在我国的发展时间不长短,中小企业对实施电子商务发展战略方面还缺乏深刻的认识,但是,“机不可失,时不我待”,在不以我们的意志为转移的、势不可挡的电子商务发展大潮面前,中小企业除了尽早实施电子商务以外,别无选择。否则,迟早要被电子商务潮流所淘汰。

最后,全球化不足的问题

当今,全球电子商务的发展是不可逆转的态势。电子商务是世界经济全球化和科技发展的必然产物,其发展势头不可阻挡,目前电子商务在技术上已初步 具备实施条件,在美国的推动下,国际组织和发达国家政府相继发表电子商务文件,而且从多边贸易自由化发展的趋势来看,不久将会有这方面的国际协议和规则出 台。而目前的电子商务国际谈判主要集中在少数发达国家之间,发展中国家若不及时参与到对话中来,不利于形成电子商务的国际框架。

对于中小企业来说,要致力于产品技术含量的提高、附加值的增加,最重要的是要增强企业的全球意识。全球电子商务专家中国诺网认为,企业要真正地 实施全球化战略,最紧迫的是提高企业的信息化程度。在融入国际市场后,已经有相当多的中小企业认识到,网站的建设尤其是直接针对客户的英文网站的建设,将 成为企业业务增长的一个关键因素;同时也是企业区别于其他同行,建立自身品牌的重要平台。而中小企业从网站的建立到托管再到维护这之间花费的金钱,与在信息化程度提高、客户来源更广、品牌价值提升后获得的利润相比,根本不值一提。正是意识到了网络的重要性,中小企业的英文网站纷纷地建了起来。

品牌化、信息化、全球化,中小为外贸企业重新迎接更大商机的必经之路。全球电子商务专家中国诺网作为国内首家成熟的全球电子商务平台,为国内中 小企业精心准备了高质量的海外空间,让国内外贸企业的网站在海外高速、稳定的运行。让全世界都能快速访问你的网站,让你的网站为你带来更多的定单!使中国 企业的全球互联梦想不再遥远。

Blogged with the Flock Browser

Tags: 中小企业, SMB, 电子商务

posted @ 2008-08-07 13:24 赵宝刚 阅读(215) | 评论 (0) | 编辑 收藏
 
企业信息化:体系比软件更重要
  从根本上说,这一现象的真正原因是出自组织体系。如果公司具备一套明确的体系,并得到管理高层的高度支持,那就可以借助相应的软件来顺利展开工作。如果本末倒置,舍体系而求软件,那恐怕世上任何一款软件都难以从本质上解决问题。
  CRM不仅是一种软件,更是一种体系。如果你不能把它融合成公司DNA的一部分,那它就无法如预期般解决你的问题。成熟的体系与流程往往都是企业成功的基石。

  从管理角度来看,人们通常将问题划分为三大类:即技术与技能、价值与行为,还有组织体系。

  一套成熟的体系并不一定要基于软件(尽管软件能起到很大的作用)。它如同一本员工手册,明确指导每位员工该做什么,何时做,以及如何去做,同时提供绩效测量和责任分配的方式。

  体系是公司的缩影

  从本质上说,公司就是一种体系。不同的体系造就了不同的公司特色。一套精良的体系是往往都会受到公司管理层的大力支持。公司中每个人都应参与、了解,并从中得到帮助。体系是一种收集智能、获取反馈的形式。

  比如在CRM方面,我们就曾发现许多软件实施其实都踏入了误区。主要表现为:首先,几乎没有人去真正使用这一系统;其次,公司管理人员也忽略了这一现象。

  从根本上说,这一现象的真正原因是出自组织体系。如果公司具备一套明确的体系,并得到管理高层的高度支持,那就可以借助相应的软件来顺利展开工 作。如果本末倒置,舍体系而求软件,那恐怕世上任何一款软件都难以从本质上解决问题。有不少公司一套接一套地实施各种软件,斥资数百万,但却忽略了体系的 重要意义。

  大道至简

  每一家成功的企业都有成熟完善的员工手册。这种手册是一种活文件,它会定期更新,并用来培训指导新晋员工。

  制定公司体系不是研究航天科学,所以越简单越好。然而,有不少企业往往匮乏这一体系来与员工进行双向沟通,并测量他们的绩效。我们认为,体系是提高效率最简单的方式。

  比如有一家专业服务公司就部署了CRM软件,并将它集成到销售与市场体系中,从而为该公司带来了显著的投资回报。这家公司所谓的“秘诀”就是设 计一套体系来达成既定目标,明确与每个责任人沟通,然后测量工作绩效。CRM软件中所获取的数据会在董事会中进行回顾检验,从中查看该公司创建了多少潜在 客户,制定了哪些流程。在这家公司中,从来没有人讨论“我们该如何让员工使用CRM”之类的问题,因为使用CRM早已被定义成工作的一部分。

  善于借鉴

  借鉴优秀公司在这方面的经验能帮助中小企业做的更好。很多公司都十分勤快地向CRM中录入各种联系人资料,但CRM却没有带给他们什么成长。而 一旦你制定了一套明确的体系,你的员工就知道何时该跟进案例,如何根据服务等级协议(SLA)测量绩效。CRM还是原来的CRM,但员工却有了更为明确的 工作目标与方向。

  有些公司或许喜欢聘请外部顾问来分析自己的商业流程,但归根到底,只有你自己才最了解你的企业,也只有你自己才能量体而裁,设计出合适的体系。

  在一个体系里,软件只是一种颇具价值的催化剂,而不是替代品。

Blogged with the Flock Browser

Tags: SMB, 中小企业信息化, SaaS

posted @ 2008-08-07 13:22 赵宝刚 阅读(170) | 评论 (0) | 编辑 收藏
 
用户所不需要的也是应该被关注的
  厂商们或许总是在考虑用户需要什么产品功能或什么解决方案,那么,现在,是否可以换个角度想一下用户不需要哪些产品功能或者哪些解决方案?

  “相比我们总在关心用户需要什么而言,或许我们很少去关注用户不需要什么,而这一点却同样值得我们去关注与重视。”酷爱绘画艺术的Trend Micro(趋势科技)全球CEO近日指出。

  的确,对于熟悉了企业商业运作流程的IT供货商来说,满足用户需求一直被解读为对用户需要什么的回答,然而从数学的角度看,这显然不是一个充分 且必要的等式。相应地,需要在回答用户需要什么的基础上追加用户不需要什么。当然,这样的追加并非只适用于Trend Micro这一家或者这一类安全类的供应商,诸如软件及其升级功能、硬件设备、系统解决方案中各子模块功能等统统都应在追加之列。

  随便环顾一下我们身处的网络环境,或者再稍试遥想一下网络建设之初的当年,不算完善的网络环境发展至今虽然明显有七拼八凑的嫌疑,但至少在上线 的当时,各个零散的软件或者硬件都的的确确曾经发挥过各自独有的功效。大概分析一下也不难理解,网络环境从不成形到成熟显然会经历需求在前、供应在后的阶 段,相应的产品也自然都是跟着需求一步一步建设起来的。但是到今天,相信70%以上的企业用户都深切感受到网络环境错综复杂的痛楚。这就说明人们不再一味 地需要“叠加式”的供应模式了,用户需求也已经进入需求与供应的磨合期。

  对此,或许厂商们依然会辩驳“我们一直在挖掘和满足用户的需求,用户希望磨合的话那就磨合好了”,或者对于一些大型供应商还会拿出很多整合型的 系统解决方案……凡此种种,其实我们不难发现很多时候或很多情况下,用户的声音都被淹没了,供应商总会用方案或者产品引导用户,使得原本用户比较清晰的需 求意向演变为最终上线后的落差,久而久之,错综复杂的痛楚也将继续上演……

  面对相似功能的产品如何选择,甚至面对不同叫法却相似功能的产品又该如何选择,对于既要满足当前网络承载的需求又须考虑未来可扩展的用户们,这些都正在成为他们所头疼的问题。

  那么,用户到底希望怎么做呢?

  从需求来看的话很简单,无非是“做减法”——简捷而奏效,在现有的IT资源上用最有性价比的投入同时获得原有资产的充分利用和IT设施的可持续 发展。或许从实现的角度,供应商甚至会恐惧这样的需求,但无论如何,现在用户市场出现的产品功能重叠、难以协同、采购量与功效比严重脱节等现象实在不容忽 视。

Blogged with the Flock Browser

Tags: 企业信息化, 需求,

posted @ 2008-07-30 09:20 赵宝刚 阅读(181) | 评论 (0) | 编辑 收藏
 
五大趋势推动云计算发展
  在未来的三至五年里,随着五个主要的消费者和商业趋势的加速发展,云计算将不断发展并且获得更广泛的应用。
  在技术行业忙于精确定义运计算这个词汇的同时,运计算似乎更像是一种宣传,而不是一个现实。然而,实际的业务和市场趋势正在利用云计算使自己走在前面。企业和政府部门正在现实世界中利用这个新兴的概念。云计算的应用正在增长。

  云计算基本上是用于一个由大量的连接在一起的计算机系统组成的共享的IT基础设施的一种方法。由于它访问“虚拟”资源,云计算不受本地和远程计 算机的功率和能力的限制。云计算是下一代企业数据中心,能够像互联网一样操作,向连接到网络的用户提供极大的规模和快速的访问能力。

  云计算为需要时的使用、降低成本和能源的使用提供一种简化的、集中的平台。与网格计算不同,网格计算是为一项具体的任务分布IT资源,云计算是在整个活动范围内使用的。受到媒体最多关注的这种平台是外部托管的服务,但是,有些是在企业内部使用的,特别是在全球运营的企业中使用。

  在未来的三至五年里,随着五个主要的消费者和商业趋势的加速发展,云计算将不断发展并且获得更广泛的应用。

  1.网络成为一种全球共享的通信媒介

  目前,网络用于交换、发布和操作信息。网络内容不再像早些年那样是静态的,全球用户每一天都在改变网络内容。维基百科、Facebook和 YouTube等网站就是突出的例子。不过,这些网站只是冰山的一角。社交网络、流音频和视频和其它协作工具正在企业内部网的防火墙后面快速发展。知识工 人,特别是那些搞研发的知识工人,使用网络应用程序在全球范围内协作研究项目。

  中国电信和欧洲专业服务公司Sogeti使用内部云计算平台在员工之间进行在线的、实时的集思广益的讨论。这个高性能的平台能够搜集Sogeti公司1.8万员工的意见并且对这些意见进行分类和分析以便应用到业务中。

  互动、实时的通讯也称作Web 2.0,是云计算的主要推动因素。云计算能够使用现有的基础设施在极短的时间内处理大量的信息以满足动态网络的高性能的需求。

  2.使用较少的能源的需求

  由于担心成本问题和增加碳排放量,减少IT部门使用能源的目标正在日益受到关注。云计算更有效地使用能源,减少了运行数据中心所需要的耗电量。 过剩的计算能力会得到利用,不是打开电源,使用能源,而是保持待机状态。据研究机构Info-Tech Research Group称,大多数计算机服务器都是一直在运行的,但是,仅有10%至20%的工作负荷得到了利用。通过整合资源,云计算平台能够升级或者降级,节省能 源和运行成本。

  3.急切需要的技术创新

  在全球经济中,寻求更多的技术创新、把新思想更快地应用到市场和实用技术加快实现结果是推动云计算的主要动力。云计算能够随时随地在需要时以较低的成本提供强大的计算能力。

  在中国无锡的一个工业园区,大多数新兴的软件企业都能够让员工把计算机插入网络接口访问整个公司的IT基础设施。这个工业园区与IBM合 作创建了一个云计算中心为园区内的租户提供托管的服务。IT是这个工业园区的基础设施的一部分,同取暖、照明和水一样。对于软件新型企业来说,这就意味着 降低了开发产品的成本。他们不用购买和操作自己的服务器、应用程序和工具,只需要为自己实际使用的IT服务付费。越南国家大学最新建立了一个云计算平台以 便更快地培养员工队伍的IT技能。

 4.寻求简单化

  虽然技术的发展越来越高级,但是,用户希望技术仍然像以前一样容易使用。以服务的方式在互联网上提供软件取得的市场成功就是向简单化发展的一个 例子。软件服务也是云计算的一个先驱。通过购买一项服务,而不是直接购买软件产品,企业能够直接使用最新的软件,没有复杂性和管理成本,也不需要进行升 级。

  云计算能够给整个IT范围带来同样的简单性。有些云计算平台是由外部托管的并且是作为一项服务购买的。这对于那些缺乏技术人员的小企业是有吸引力的。然而,许多企业,特别是大企业,可能会选择内部的平台,特别是在存在安全和隐私问题的金融等行业。

  5.消除混乱建立结构

  网络实现了快速访问大量的信息。但是,分类这些信息是一个挑战。谷歌等搜索技术的成功就在于满足了次序和分类的需求,因为信息的快速扩张超出了人类大脑能够处理的速度。谷歌在美国的搜索网站每个月的访问人次达到1.41亿。

  每一天大量的互联网用户都要向全球的网站贡献数据、照片、音频和博客。没有快速和准确地找到用户需要的信息的能力,网络作为一种生产率工具的价值就会开始消失。

  云计算是专门为消除混乱建立次序量身定做的技术。云计算提供了把各种不同种类的信息集成在一起的能力。为处理大量的数据提供了更多的计算能力,提供更简单的基础设施管理复杂性。

  作为一种新兴的技术,云计算将随着时间的发展而变化。云计算的真正价值是能够对主要的商业和市场趋势做出反应。这些趋势未来几年将仍然存在于我们的技术环境中。

Blogged with the Flock Browser

Tags: 云计算, 技术趋势, web2.0

posted @ 2008-07-28 09:57 赵宝刚 阅读(153) | 评论 (0) | 编辑 收藏
 
如何控制虚拟机蔓延产生的成本增加?
当人们在过去的几年里考虑技术创新、可适应性、改变游戏规则的IT发展的时候,虚拟化肯定要排在列表的前面。摩尔定律推动的系统性能的提高在历史上一直超过了软件有效地利用新增加的性能的能力。但是,虚拟化能够让以前利用率不高的系统分区为多个操作系统环境,显著提高效率。

  此外,方便地设置和配置的虚拟机能够让数据中心更灵活和更动态化,对变化的应用程序工作量迅速做出反应。一个增加的优势是虚拟机管理程序提供的操作系统分区非常适合当前的N层的、以Web为中心的应用程序架构。

  尽管有这些大量的好处,虚拟化对于数据中心管理员并不是一个真正的祝福。虚拟化的薄弱方面(也称作虚拟蔓延)能够很快侵蚀掉从物理向虚拟化过渡 节省的硬件和人员开支。蔓延还是一个粘糊糊的词汇。一个人的蔓延也许是另一个的适应性。但是,Embotics公司产品营销经理Anthony Mar对于这个词汇提出了这样的定义:虚拟蔓延可以定义为虚拟机没有适当的IT控制的扩散。他补充说,这不是关于虚拟机的实际数量的问题。这主要是关于虚 拟环境如何构造和控制的问题。

  FastScale公司负责工程的副总裁Richard Offer说,鼓励这种行为被认为是零成本创建虚拟机。他指出,虚拟机是很容易创建和存储的,特别是与物理服务器相比更是如此。用户没有认识到存在着极度浪费的累积成本。

  创建虚拟机的容易和方便性是造成蔓延的主要因素。但是,根本的原因是围绕虚拟机管理缺少管理控制和流程。Info-Tech分析师John Sloan指出,即使一家公司拥有一个除非例外全部采用虚拟化的政策,这家公司仍然需要正式的部署流程,甚至要像对待物理服务器那样对待虚拟服务器。

  独立质询顾问Anil Desai在Embotics公司赞助的白皮书中称,虚拟机蔓延最常见的根源是没有计划和没有协调的部署、非生产的虚拟机和虚拟设备。

  虚拟机蔓延成本增加

  虚拟蔓延不仅是管理方面令人讨厌的问题,它还是有昂贵代价的。Mar指出,虚拟机的四类成本包括基础设施、管理系统、服务器软件和管理。在虚拟机基础设施中,虽然机器也许是虚拟的,但是,它们消费的资源是真实的。

  Mar指出,应用程序需要处理、内存、存储和网络,无论它是否包含在虚拟机中。你拥有的虚拟机数量越多,你需要的资源就越多,它的成本就越多。

  CiRBA公司共同创始人和首席技术官Andrew Hillier指出,他称作“朽木”的利用率不足的虚拟机或者孤儿式的虚拟机的成本会非常高,因为一个真运行而不做任何有用的工作的镜像仍然在消耗系统的内存。所有的虚拟机都要占用有价值的硬盘空间,每个ISO镜像通常占用几GB空间。

  Mar指出,蔓延还会增加数据中心管理系统的成本,因为许多管理系统的许可证都是根据管理的节点或者客户端代理收费的。这意味着你拥有的每一台 虚拟机都有累计的许可证费用。Mar还谨慎地指出,虽然虚拟机很容易创建和部署,但是,配置、监视、升级和使用补丁等标准的系统管理活动是有管理成本的。

  Info-Tech公司的Sloan赞成这个观点。他指出,许多服务器管理任务,如升级补丁、都把服务器当作运行的操作系统和应用程序实例处理。在这方面,100个虚拟服务器仍是100个管理实例,而不管下面的物理服务器的数量是多少。

  由于包含各种变量,预测蔓延的财务成本是有问题的。这些变量包括没有使用的多余的机器、IT管理员逐步增加的开销、需要的新的软件许可证的数量、硬盘空间的成本和存储管理等。

  据Embotics公司进行的调查,大多数客户认为他们公司的大约30%的虚拟机很可能是冗余的。实际的物理服务器审计证实了这个数字。这个审计指出,有些客户把冗余量定在50%以上。Embotics的客户预计他们运行一台普通服务器的成本大约是1000至3000美元。这些成本包括操作系统、应用程序、工具和相关的管理系统代理程序等软件许可证。Mar称,一个150个虚拟机的环境平均有5万至15万美元的费用与冗余的虚拟机有关。

  由于虚拟机的设置不当,蔓延还增加了软成本,如增加的安全风险或者遵守法规的问题。

  如何减小或者防止蔓延

  减小蔓延的两个主要方法是恢复对虚拟机的生命周期管理控制和根据可用的物理资源优化虚拟机和相关应用程序的使用。Sloan说,改善虚拟机管理对于虚拟机厂商来说是一个积极开发和差异化的领域,因为虚拟机管理程序将很快被修改。第三方软件开发商也进入了这个领域,推出一些新的基于政策的虚拟化管理产品,特别是针对管理虚拟化环境独特难题的产品。

  优化软件旨在通过描绘虚拟化应用程序工作量的特点并且把它们映射到数据中心的服务器池和存储中来改善可用资源的利用。比较新的方法许诺通过创建 FastScale公司所说的“动态应用程序捆绑”来显著减少虚拟机占用的资源。“动态应用程序捆绑”是一个小的、功能齐全的软件环境(一个虚拟机镜像使 用大约1%的内存),仅需要一个应用程序需要的准备的软件组件。

  虚拟化是一个强大的工具,允许IT部 门快速建立和部署新的系统环境,同时增加使用不足的硬件的利用率。遗憾的是虚拟机创建的简单性和方便性能够导致不太好的事情,如大量冗余的、很少使用的或 者孤儿式的虚拟镜像。如果部发现这个问题,这种虚拟蔓延将迫使企业付出巨大的成本。不过,新的管理工具和优化软件现在能够让数据中心管理员控制虚拟机环 境,更有效地把虚拟的应用程序映射到他们的物理服务器。

Blogged with the Flock Browser

Tags: 虚拟化, 虚拟机, 成本.IT, 架构

posted @ 2008-07-15 10:26 赵宝刚 阅读(176) | 评论 (0) | 编辑 收藏
 
 
<2008年7月>
日一二三四五六
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

 导航

  • 首页
  • 发新随笔
  • 发新文章
  • 联系
  • 聚合
  • 管理

 统计

  • 随笔: 44
  • 文章: 5
  • 评论: 0
  • 引用: 0

常用链接

  • 我的随笔
  • 我的文章
  • 我的评论
  • 我的参与

留言簿(5)

  • 给我留言
  • 查看公开留言
  • 查看私人留言

随笔分类(26)

  • 技术趋势(21) (rss)
  • 汶川地震(1) (rss)
  • 管理心得(4) (rss)

随笔档案(49)

  • 2011年9月 (2)
  • 2010年8月 (1)
  • 2008年11月 (1)
  • 2008年8月 (6)
  • 2008年7月 (5)
  • 2008年6月 (6)
  • 2008年5月 (15)
  • 2006年7月 (2)
  • 2006年6月 (11)

友情链接

  • 我的另一个Blog地址 (rss)
  • 我的斗牛士(mydonews) (rss)
  • 老婆的QQZone (rss)

好玩的

  • 好玩的

最新随笔

  • 1. HTML圆角输入框
  • 2. Flex 文件上传
  • 3. 千万要避免的五种程序注释方式
  • 4. 如何选择最合适的Web开发框架
  • 5. XSS攻击防御技术白皮书
  • 6. 产品经理们,遇到Bug请别十万火急
  • 7. 在ERP项目中建立针对个人激励制度
  • 8. MySQL 5.1正式版即将公开发布
  • 9. 电子商务几大问题阻碍中小企业发展
  • 10. 企业信息化:体系比软件更重要
  • 11. 用户所不需要的也是应该被关注的
  • 12. 五大趋势推动云计算发展
  • 13. 如何控制虚拟机蔓延产生的成本增加?
  • 14. 不应忽视小型项目开发的管理问题
  • 15. 腾讯本月将首推Linux QQ
  • 16. 好消息——Mysql放弃闭源
  • 17. ITIL:指导企业IT外包应用最佳实践方法
  • 18. 从模式到优势 SaaS技术详细介绍
  • 19. 中小企业Email营销的用户体验设计
  • 20. 美国警告中国:小心被“技术隔离”
  • 21. 《仓鼠革命》四大方法简介
  • 22. [转贴]了解 Eclipse 插件如何使用 OSGi
  • 23. 阐述中小企业选择ERP标准及注意事项
  • 24. 云计算成软件厂商必争之地
  • 25. [震区求助]急需 260 万顶帐篷
  • 26. 企业如何在电子新闻邮件中展示广告
  • 27. 解析SOA未能获得成功的原因
  • 28. 坏消息——Sun开始关闭MySQL部分功能的源代码
  • 29. 内聚对SOA是否重要?
  • 30. SCA同OSGI的比较
  • 31. ebXML:一种商业协作发展方向
  • 32. 电子商务全球化标准:ebXML
  • 33. [转贴]关于员工离职引发的思考
  • 34. [转贴]云计算下的商业雨
  • 35. [转贴]福布斯:云计算已成未来经济的必然选择
  • 36. [转贴]Gartner:IT主管应该尽早为云计算做准备
  • 37. 从选择 Java 框架谈谈技术人员的“舒适区”
  • 38. [导入]为什么 Java 开发者应该写 Blog
  • 39. [导入]Eclipse使用技巧之插件管理
  • 40. [导入]Eclipse插件之FindBugs

最新评论

阅读排行榜

  • 1. HTML圆角输入框(3119)
  • 2. PMD Squashes Code Bugs(1158)
  • 3. [导入]Eclipse使用技巧之插件管理(924)
  • 4. [转贴]了解 Eclipse 插件如何使用 OSGi(442)
  • 5. [导入]Eclipse插件之FindBugs(374)

Powered by: 博客园
模板提供:沪江博客
Copyright ©2025 赵宝刚