qileilove

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

ThinkPHP 数据库表结构处理类(简单实用)

<?php
/*
*mysql表结构处理类
*创建数据表,增加,编辑,删除表中字段
*
*/
classMysqlManage{
/*
*创建数据库,并且主键是aid
*table要查询的表名
*/
functioncreateTable($table){
$sql="CREATETABLEIFNOTEXISTS`$table`(`aid`INTNOTNULLprimarykey)ENGINE=InnoDB;";
M()->execute($sql);
$this->checkTable($table);
}
/*
*检测表是否存在,也可以获取表中所有字段的信息
*table要查询的表名
*return表里所有字段的信息
*/
functioncheckTable($table){
$sql="desc`$table`";
$info=M()->execute($sql);
return$info;
}
/*
*检测字段是否存在,也可以获取字段信息(只能是一个字段)
*table表名
*field字段名
*/
functioncheckField($table,$field){
$sql='desc`$table`$field';
$info=M()->execute($sql);
return$info;
}
/*
*添加字段
*table表名
*info字段信息数组array
*return字段信息array
*/
functionaddField($table,$info){
$sql="altertable`$table`add";
$sql.=$this->filterFieldInfo();
M()->execute($sql);
$this->checkField($table,$info['name']);
}
/*
*修改字段
*不能修改字段名称,只能修改
*/
functioneditField($table,$info){
$sql="altertable`$table`modify";
$sql.=$this->filterFieldInfo($info);
M()->execute($sql);
$this->checkField($table,$info['name']);
}
/*
*字段信息数组处理,供添加更新字段时候使用
*info[name]字段名称
*info[type]字段类型
*info[length]字段长度
*info[isNull]是否为空
*info['default']字段默认值
*info['comment']字段备注
*/
privatefunctionfilterFieldInfo($info){
if(!is_array($info))
return
$newInfo=array();
$newInfo['name']=$info['name'];
$newInfo['type']=$info['type'];
switch($info['type']){
case'varchar':
case'char':
$newInfo['length']=empty($info['length'])?100:$info['length'];
$newInfo['isNull']=$info['isNull']==1?'NULL':'NOTNULL';
$newInfo['default']=empty($info['default'])?'':'DEFAULT'.$info['default'];
$newInfo['comment']=empty($info['comment'])?'':'COMMENT'.$info['comment'];
case'int':
$newInfo['length']=empty($info['length'])?7:$info['length'];
$newInfo['isNull']=$info['isNull']==1?'NULL':'NOTNULL';
$newInfo['default']=empty($info['default'])?'':'DEFAULT'.$info['default'];
$newInfo['comment']=empty($info['comment'])?'':'COMMENT'.$info['comment'];
case'text':
$newInfo['length']='';
$newInfo['isNull']=$info['isNull']==1?'NULL':'NOTNULL';
$newInfo['default']='';
$newInfo['comment']=empty($info['comment'])?'':'COMMENT'.$info['comment'];
}
$sql=$newInfo['name'].''.$newInfo['type'];
$sql.=(!empty($newInfo['length']))?($newInfo['length'])."":'';
$sql.=$newInfo['isNull'].'';
$sql.=$newInfo['default'];
$sql.=$newInfo['comment'];
return$sql;
}
/*
*删除字段
*如果返回了字段信息则说明删除失败,返回false,则为删除成功
*/
functiondropField($table,$field){
$sql="altertable`$table`dropcolumn$field";
M()->execute($sql);
$this->checkField($table,$filed);
}
/*
*获取指定表中指定字段的信息(多字段)
*/
functiongetFieldInfo($table,$field){
$info=array();
if(is_string($field)){
$this->checkField($table,$field);
}else{
foreach($fieldas$v){
$info[$v]=$this->checkField($table,$v);
}
}
return$info;
}
}
    好久没有写博客了,最近忙的要死,搞微信平台,偶尔遇到需要模型管理,前台表单直接修改表结构的,就自己简单写了一下,也不是很难,给大家一个思路

posted @ 2014-08-29 09:49 顺其自然EVO 阅读(469) | 评论 (0)编辑 收藏

Linux搭建VPN服务器

  下面我就来介绍一个可以在linux系统上架设的专业的VPN产品,派克斯VPN,这是一款纯软件的VPN,适合各种系统。传输速度很快。管理部署都很方便。
  派克斯VPN能够实现企业分部局域网到总部局域网的VPN连接,以及移动用户到总部局域网的远程访问。
  现在派克斯VPN功能十分强大,支持动态 DNS 功能、VPN Azure 云服务、支持OpenVPN协议、支持手机VPN连接、支持证书认证、AD认证等等。
  1、首先,到网站下载Linux 系统版的派克斯VPN Server安装包,
  派克斯VPN下载he更详细的教程:www.softether.cn
  2、把下载后的文件放到linux系统的/use/local/目录下。
  用tar命令符来解压缩。命令如下:
  [root@machine root]# tar xzvf vpnserver-5070-rtm-linux-x86.tar.gz
  vpnserver/
  vpnserver/vpnserver.a
  vpnserver/vpncmd.a
  vpnserver/hamcore.se2
  vpnserver/libcrypto.a
  解压后,会出现一个‘vpnserver’的文件夹,所需要的文件都在里面了。
  3、然后进到该文件夹下,运行‘make’的命令:
  安装VPN Server时,需要进行叫做“make”的操作,生成vpnserver可运行文件。(如果make命令无法执行,请安装GCC及相关的软件包)。
  运行‘make’命令时,画面上会出现‘您想阅读本软件的授权许可协议吗?’的英文,在这选择‘1’。
[root@machinevpnserver]# make
./.install.sh
PacketiX VPN Software Install Utility
Copyright (C) 2004-2005 SoftEther Corporation. All Rights Reserved.
Do you want to read the License Agreement for this software ?
1. Yes
2. No
Please choose one of above number:
1
  然后,画面上出现‘PacketiX VPN Server Version 3.0 授权许可协议’。
  继续选择‘1’。
  Did you read and understand the License Agreement ?
  (If you couldn't read above text, Please read License_ReadMe.txt
  file with any text editor.)
  1. Yes
  2. No
  Please choose one of above number:
  1
  接下来,画面上出现‘您同意授权许可协议的内容吗’的英文,仍然选择‘1’。
  Did you agree the License Agreement ?
  1. Agree
  2. Do Not Agree
  Please choose one of above number:
  1
  即可生成vpnserver程序。这时安装就基本完成了。
  vpnserver程序的配置就算完成了。
  这时就可以手动启动PacketiX VPN服务了,在VPNserver目录下,使用下面命令启动:
  [root@machinevpnserver]#./vpnserver start
 4、如何开机自动启动PacketiX VPN服务:
  按照上述方法将vpnserver安装到/usr/local/vpnserver/目录后,如果要让VPN服务随系统开机启动,需要创建以/usr/local/vpnserver/的名字的启动项目。(以下只是举例,根据您使用的系统,有可能需要更改一部分)。
  您可以用text editor或cat 命令符来书写下面的脚本文件。以vpnserver命名:
#!/bin/sh
# chkconfig: 2345 99 01
# description: PacketiX VPN Server 3.0
DAEMON=/usr/local/vpnserver/vpnserver
LOCK=/var/lock/subsys/vpnserver
test -x $DAEMON || exit 0
case "$1" in
start)
$DAEMON start
touch $LOCK
;;
stop)
$DAEMON stop
rm $LOCK
;;
restart)
$DAEMON stop
sleep 3
$DAEMON start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac
exit 0
  然后把vpnserver脚本文件拷贝到/etc/init.d中
  添加开机启动服务,并把状态设置为开启:
  [root@machine root]#sbin/chkconfig –add vpnserver
  [root@machine root]#Sudo sysv –rc –conf vpnserver on
  在启动VPN之前,您可能还需要安装apt-get install sysv-rc-conf和apt-get install chkconfig
  此时,派克斯VPN服务就安装好了,你可以通过命令行的方式进行配置,创建用户账户,或者在一台windows电脑上安装一个管理端进行配置,进行远程管理,图形界面的。
  然后就可以让远程客户端进行连接,或者手机用户创建VPN连接,用手机访问内网的资源。
  派克斯VPN功能强大,管理简单,配置方便,安全性高,使用非常稳定。

posted @ 2014-08-29 09:49 顺其自然EVO 阅读(213) | 评论 (0)编辑 收藏

浅谈测试管理—bug的含义知多少?

 bug这个词,对我们来说从入行起,就形影不离。然而亲密如此,你真的了解他嘛?今日我不想穷究bug的全部属性,也不想谈多少理论。我们的足迹从一场实战开始。
  试想,我们做了个移动端的app,一个是启动后,首页,有个明显的文字错误。一个是你点了十多步之后,发现一个逻辑错误(比如1+1算错了)。如果是测试人员会觉得哪个bug最有价值?我相信,八成的人会认为后者,为何?
  1)传统意义上说后者严重级别高;
  2)发现步骤“复杂”显得有技术含量;
  3)有成就感被人称为大牛。
  曾几何时,我也极力追求后者。可是一些事情本来就可遇不可求。且世间永恒的二八法则告诉我们,有些百分之二十的问题往往需要花费超过百分之八十的时间。然而很长一段时间,我依旧执着着。因为不愿轻言放弃,不愿被他人说成知难而退……
  可后来我发现,事实并非这样。那些所谓的价值观,只因我们只当我们自己是测试人员。在一次次的和用户交流过程中。慢慢的我发现其实前者的价值更大:
  1)用户不是测试人员,不管你发现问题的步骤,只管明显程度。
  2)越是“低级”的错误,越容易成为用户的笑柄,越容易成为用户放弃你的理由。
  3)真正的测试大牛不是孤芳自赏,而是换位思考。
  所以,我们我们有必要重新审视一下自己关于bug的价值观。何为有价值?出现频率最高,最明显,最能成为用户笑柄,和竞争对手崩击对象的就是最有价值的。再有,在测试过程中我们该如何自处?于此,我有些浅见:
  1)时间有限时,深度和广度取广度;时间充裕时,先广度后深度。
  2)换位思考,用户体坛至上,影响用户体验,用户“心情”的问题,最大。
  3)建立量化分析体系,以数据为支撑。不断的学习调整用户关心点。所谓的狠抓“痛点”
  其实,这个时代,也算是互联网的大争之世,于此。我们怎么才能凸显价值?简单的需求验证,那叫做check,执着于很深很深的问题,或许也能算个不错的tester。但这个时代最需要的并非checker和tester而是QA。QA——质量保证。一切以品质为出发点。而用户是品质的最终裁判。就算是投其所好,是否我们也需要重新审视下曾经的种种呢……
版权声明:本文出自 qishaorain 的51Testing软件测试博客:http://www.51testing.com/?15050050
原创作品,转载时请务必以超链接形式标明本文原始出处、作者信息和本声明,否则将追究法律责任。

posted @ 2014-08-29 09:48 顺其自然EVO 阅读(238) | 评论 (0)编辑 收藏

Java桌面游戏巡礼—Java数独

“数独”(sudoku)一词来自日语,意思是“单独的数字”或“只出现一次的数字”。概括来说,它就是一种填数字游戏。但这一概念最初并非来自日本,而 是源自拉丁方块,它是十八世纪的瑞士数学家欧拉发明的。数独把填字游戏和棋盘游戏巧妙地结合在一起,采用填字游戏式的棋盘,解题时在空格中填上1-9的数 字。这种游戏不仅需要逻辑思维能力,还需要一点加法运算。
  规则
  数独的游戏规则很简单,9x9个格子里,已有若干数字,其它宫位留白,玩家需要自己按照逻辑推敲出剩下的空格里是什么数字,使得每一行与每一列都有1到9的数字,每个小九宫格里也有1到9的数字,并且一个数字在每个行列及每个小九宫格里都只能出现一次。
  这次介绍的,是一个Java版的数独游戏实现,转载于[url]http://mcsudoku.sourceforge.net/[/url],作者collomb,是一个基于Swing的javaSE应用。
  应该说这是一个中规中矩的程序,既没有别出心裁的创意,也没有明显的败笔存在,把它作为熟悉Swing各个组件功能或者Java游戏入门的案例都可以,适合中到初级用户学习
  游戏界面如下:

posted @ 2014-08-29 09:48 顺其自然EVO 阅读(176) | 评论 (0)编辑 收藏

与缺陷共舞

  软件生产人员和用户的最佳选择是承认软件不可能没有缺陷的现实,在生产和使用中都引入软件“容错”的理念和机制,并把有限的时间和精力放在“关键”部位上,而不是一味追求最少的缺陷和不分重点地使用软件开发力量,这样才能达到总体最优的结果。
  为了了解软件质量的现状,从1994年开始,一个名叫 Standish Group 的智囊团用了十年的时间研究了多达三万五千个开发项目,用了多种方法对这些项目进行了评估,其对于项目成功的定义如下:
  软件开发按时完成。
  预算未超出。
  软件功能涵盖了预定的要求。
  软件没有被缺陷致残。
  软件已被使用,而且产生了积极的效果。
  最初的结果显示符合上述定义的成功软件项目只有16%。Standish 每年都会更新这一数字。之后的结果显示,该比例没有太大的改变。
  多年来,软件业界采用了多种方法企图改善软件质量的现状。虽然 Standish Group 的研究指出成功软件的比例变化不大,却并不代表软件业界的努力没有成果。
  因为用户对于软件的要求越来越高,导致软件越来越来复杂,失败的概率也相应地越来越大。虽然一些有识之士例如 Ben Chelf 认识到人的因素对于软件产生缺陷至关重要,但是面对这一现实,多数还是朝着使人减少犯错误机会的方向去改进。这无疑是必要的。
  但是在短期不能奏效的局面下,在软件生产和使用中“容忍”缺陷是软件业得以生存和发展的关键一环,通俗地说,要与缺陷共舞。

posted @ 2014-08-29 09:47 顺其自然EVO 阅读(176) | 评论 (0)编辑 收藏

也谈配置管理团队的建设

 公司在组建配置管理团队(主要是项目级的配置管理员)时,通常有两种选择。
  1)兼职项目CM。即开发人员兼任项目CM。选择研发人员兼职的好处是项目CM了解项目进展和研发流程,能够与项目经理等一起合作,沟通无障碍。缺点是研发人员以开发任务为主,工作量大时可能难以兼顾配管工作,易导致配管工作延迟。这个方案的另外一个缺点是兼职配管的人员流动性大,项目内任务的调配,人员离职等都会造成配管更换的问题。从就职资格的角度来说。每位新任的配管都需要经过培训。这就加大了培训的难度。尽管,硬币的另一面是更多的开发人员接受了较为正式的配管培训。
  2)专职项目配管。比如一条产品线设一个专职配管,负责该产品线下所有项目的配管工作。这种做法有利于配管人员的专业化发展,长期对公司来说也是有利的。但是这种模式的前提是公司的配置管理体系已经较为完善,对于项目配管的工作流程比较清楚,权责界定也较为明确。对于新加入的项目配管,企业能够很快通过培训让其上岗。确保公司的配管流程正常运转。
  有人可能会问,第二种方案显然比第一种好,第一种方案还有存在必要吗?问题是现在很多企业在面临管理问题时,由于一些原因不能给足够的资金购买商业软件,也不会招聘正式的专职人员(这两点是企业配置管理三大误区中的两点)。背后的深层次根源还是对配管工作没有引起足够的重视。在领导还未能对配管引起足够重视的前提下,第一种方案就成了曲线救国的办法。至少解决了有无问题。慢慢的研发人员就会开始抱怨,任务重,事情杂。第二种方案也就顺理成章地成为领导自主自发的要求。
  此外,配置管理团队(这里主要指组织级配置管理工程师)的定位和汇报机制也比较关键。由于该岗位与研发关系密切,最好是归属研发部门或项目管理部。向研发部经理或项目管理部的leader汇报。必须获得对配管工作的完全授权,避免出现研发部不认可、不配合的情况,甚至无法触及研发流程和数据的问题(听起来奇怪,但你见多了国内企业的乱象就会理解什么叫”见怪不怪”)。

posted @ 2014-08-29 09:47 顺其自然EVO 阅读(181) | 评论 (0)编辑 收藏

Mantis Bug Tracker一个开源的bug追踪系统

  MantisBT介绍:
  是一个缺陷跟踪系统具有多特性包括:易于安装,易于操作,基于Web,支持任何可运行PHP的平台(Windows,Linux,Mac,Solaris,AS400/i5等),已经被翻译成68种语言,支持多个项目,为每一个项目设置不同的用户访问级别,跟踪缺陷变更历史,定制我的视图页面,提供全文搜索功能,内置报表生成功能(包括图形报表), 通过Email报告缺陷,用户可以监视特殊的Bug,附件可以保存在web服务器上或数据库中(还可以备份到FTP服务器上),自定义缺陷处理工作流,支持输出格包括csv、Microsoft Excel、 Microsoft Word,集成源代码控制(SVN与CVS ),集成wiki知识库与聊天工具(可选/可不选),支持多种数据库(MySQL、MSSQL、 PostgreSQ、Oracle、DB2),提供WebService(SOAP)接口,提供Wap访问。
  MantisBT基本特性:
  个人可定制的Email通知功能,每个用户可根据自身的工作特点只订阅相关缺陷状态邮件;
  支持多项目、多语言;
  权限设置灵活,不同角色有不同权限,每个项目可设为公开或私有状态,每个缺陷可设为公开或私有状态,每个缺陷可以在不同项目间移动
  主页可发布项目相关新闻,方便信息传播;
  方便的缺陷关联功能,除重复缺陷外,每个缺陷都可以链接到其他相关缺陷;
  缺陷报告可打印或输出为CSV格式:支持可定制的报表输出,可定制用户输入域;
  有各种缺陷趋势图和柱状图,为项目状态分析提供依据,如果不能满足要求,可以把数据输出到Excel中进一步分析;
  流程定制不够方便,但该流程可满足一般的缺陷跟踪;
  可以实现与CVS集成:缺陷和CVS仓库中文件实现关联;
  可以对历史缺陷进行检索。

posted @ 2014-08-29 09:46 顺其自然EVO 阅读(237) | 评论 (0)编辑 收藏

Web开发常见的几个漏洞解决方法

 平时工作,多数是开发Web项目,由于一般是开发内部使用的业务系统,所以对于安全性一般不是看的很重,基本上由于是内网系统,一般也很少会受到攻击,但有时候一些系统平台,需要外网也要使用,这种情况下,各方面的安全性就要求比较高了,所以往往会交付给一些专门做安全测试的第三方机构进行测试,然后根据反馈的漏洞进行修复,如果你平常对于一些安全漏洞不够了解,那么反馈的结果往往是很残酷的,迫使你必须在很多细节上进行修复完善。本文主要根据本人项目的一些第三方安全测试结果,以及本人针对这些漏洞问题的修复方案,介绍在这方面的一些经验,希望对大家有帮助。
  基本上,参加的安全测试(渗透测试)的网站,可能或多或少存在下面几个漏洞:SQL注入漏洞、跨站脚本攻击漏洞、登陆后台管理页面、IIS短文件/文件夹漏洞、系统敏感信息泄露。
  1、测试的步骤及内容
  这些安全性测试,据了解一般是先收集数据,然后进行相关的渗透测试工作,获取到网站或者系统的一些敏感数据,从而可能达到控制或者破坏系统的目的。
  第一步是信息收集,收集如IP地址、DNS记录、软件版本信息、IP段等信息。可以采用方法有:
  1)基本网络信息获取;
  2)Ping目标网络得到IP地址和TTL等信息;
  3)Tcptraceroute和Traceroute 的结果;
  4)Whois结果;
  5)Netcraft获取目标可能存在的域名、Web及服务器信息;
  6)Curl获取目标Web基本信息;
  7)Nmap对网站进行端口扫描并判断操作系统类型;
  8)Google、Yahoo、Baidu等搜索引擎获取目标信息;
  9)FWtester 、Hping3 等工具进行防火墙规则探测;
  10)其他。
  第二步是进行渗透测试,根据前面获取到的数据,进一步获取网站敏感数据。此阶段如果成功的话,可能获得普通权限。采用方法会有有下面几种:
  1)常规漏洞扫描和采用商用软件进行检查;
  2)结合使用ISS与Nessus等商用或免费的扫描工具进行漏洞扫描;
  3)采用SolarWinds对网络设备等进行搜索发现;
  4)采用Nikto、Webinspect等软件对Web常见漏洞进行扫描;
  5)采用如AppDetectiv之类的商用软件对数据库进行扫描分析;
  6)对Web和数据库应用进行分析;
  7)采用WebProxy、SPIKEProxy、Webscarab、ParosProxy、Absinthe等工具进行分析;
  8)用Ethereal抓包协助分析;
  9)用Webscan、Fuzzer进行SQL注入和XSS漏洞初步分析;
  10)手工检测SQL注入和XSS漏洞;
  11)采用类似OScanner的工具对数据库进行分析;
  12)基于通用设备、数据库、操作系统和应用的攻击;采用各种公开及私有的缓冲区溢出程序代码,也采用诸如MetasploitFramework 之类的利用程序集合。
  13)基于应用的攻击。基于Web、数据库或特定的B/S或C/S结构的网络应用程序存在的弱点进行攻击。
  14)口令猜解技术。进行口令猜解可以采用 X-Scan、Brutus、Hydra、溯雪等工具。
  第三步就是尝试由普通权限提升为管理员权限,获得对系统的完全控制权。在时间许可的情况下,必要时从第一阶段重新进行。采用方法
  1)口令嗅探与键盘记录。嗅探、键盘记录、木马等软件,功能简单,但要求不被防病毒软件发觉,因此通常需要自行开发或修改。
  2)口令破解。有许多著名的口令破解软件,如 L0phtCrack、John the Ripper、Cain 等。
  以上一些是他们测试的步骤,不过我们不一定要关注这些过程性的东西,我们可能对他们反馈的结果更关注,因为可能会爆发很多安全漏洞等着我们去修复的。
  2、SQL注入漏洞的出现和修复
  1)SQL注入定义:
  SQL注入攻击是黑客对数据库进行攻击的常用手段之一。随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。
  SQL注入有时候,在地址参数输入,或者控件输入都有可能进行。如在链接后加入’号,页面报错,并暴露出网站的物理路径在很多时候,很常见,当然如果关闭了Web.Config的CustomErrors的时候,可能就不会看到。
  另外,Sql注入是很常见的一个攻击,因此,如果对页面参数的转换或者没有经过处理,直接把数据丢给Sql语句去执行,那么可能就会暴露敏感的信息给对方了。如下面两个页面可能就会被添加注入攻击:
  ①HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top 1 name from TestD ... type='U' and status>0)>0 得到第一个用户建立表的名称,并与整数进行比较,显然abc.asp工作异常,但在异常中却可以发现表的名称。假设发现的表名是xyz,则
  ②HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top 1 name from TestDB.dbo.sysobjects& ... tatus>0 and name not in('xyz'))>0 可以得到第二个用户建立的表的名称,同理就可得到所有用建立的表的名称。

  为了屏蔽危险Sql语句的执行,可能需要对进行严格的转换,例如如果是整形的,就严格把它转换为整数,然后在操作,这样可以避免一些潜在的危险,另外对构造的sql语句必须进行Sql注入语句的过滤,如我的框架(Winform开发框架、Web开发框架等)里面就内置了对这些有害的语句和符号进行清除工作,由于是在基类进行了过滤,因此基本上子类都不用关心也可以避免了这些常规的攻击了。
/// <summary>
/// 验证是否存在注入代码(条件语句)
/// </summary>
/// <param name="inputData"></param>
public bool HasInjectionData(string inputData)
{
if (string.IsNullOrEmpty(inputData))
return false;
//里面定义恶意字符集合
//验证inputData是否包含恶意集合
if (Regex.IsMatch(inputData.ToLower(), GetRegexString()))
{
return true;
}
else
{
return false;
}
}
/// <summary>
/// 获取正则表达式
/// </summary>
/// <returns></returns>
private static string GetRegexString()
{
//构造SQL的注入关键字符
string[] strBadChar =
{
//"select\\s",
//"from\\s",
"insert\\s",
"delete\\s",
"update\\s",
"drop\\s",
"truncate\\s",
"exec\\s",
"count\\(",
"declare\\s",
"asc\\(",
"mid\\(",
"char\\(",
"net user",
"xp_cmdshell",
"/add\\s",
"exec master.dbo.xp_cmdshell",
"net localgroup administrators"
};
//构造正则表达式
string str_Regex = ".*(";
for (int i = 0; i < strBadChar.Length - 1; i++)
{
str_Regex += strBadChar[i] + "|";
}
str_Regex += strBadChar[strBadChar.Length - 1] + ").*";
return str_Regex;
}
  上面的语句用于判别常规的Sql攻击字符,我在数据库操作的基类里面,只需要判别即可,如下面的一个根据条件语句查找数据库记录的函数。
/// <summary>
/// 根据条件查询数据库,并返回对象集合
/// </summary>
/// <param name="condition">查询的条件</param>
/// <param name="orderBy">自定义排序语句,如Order By Name Desc;如不指定,则使用默认排序</param>
/// <param name="paramList">参数列表</param>
/// <returns>指定对象的集合</returns>
public virtual List<T> Find(string condition, string orderBy, IDbDataParameter[] paramList)
{
if (HasInjectionData(condition))
{
LogTextHelper.Error(string.Format("检测出SQL注入的恶意数据, {0}", condition));
throw new Exception("检测出SQL注入的恶意数据");
}
...........................
}
  以上只是防止Sql攻击的一个方面,还有就是坚持使用参数化的方式进行赋值,这样很大程度上减少可能受到SQL注入攻击。
3、跨站脚本攻击漏洞出现和修复
  跨站脚本攻击,又称XSS代码攻击,也是一种常见的脚本注入攻击。例如在下面的界面上,很多输入框是可以随意输入内容的,特别是一些文本编辑框里面,可以输入例如<script>alert('这是一个页面弹出警告');</script>这样的内容,如果在一些首页出现很多这样内容,而又不经过处理,那么页面就不断的弹框,更有甚者,在里面执行一个无限循环的脚本函数,直到页面耗尽资源为止,类似这样的攻击都是很常见的,所以我们如果是在外网或者很有危险的网络上发布程序,一般都需要对这些问题进行修复。
  XSS代码攻击还可能会窃取或操纵客户会话和 Cookie,它们可能用于模仿合法用户,从而使黑客能够以该用户身份查看或变更用户记录以及执行事务。[建议措施]清理用户输入,并过滤出 JavaScript 代码。我们建议您过滤下列字符:
  [1] <>(尖括号)
  [2] "(引号)
  [3] '(单引号)
  [4] %(百分比符号)
  [5] ;(分号)
  [6] ()(括号)
  [7] &(& 符号)
  [8] +(加号)
  为了避免上述的XSS代码攻击,解决办法是可以使用HttpUitility的HtmlEncode或者最好使用微软发布的AntiXSSLibrary进行处理,这个更安全。
  微软反跨站脚本库(AntiXSSLibrary)是一种编码库,旨在帮助保护开发人员保护他们的基于Web的应用不被XSS攻击。
  例如上面的内容,赋值给一个Lable控件,不会出现弹框的操作。
  但是,我们虽然显示的时候设置了转义,输入如果要限制它们怎么办呢,也是使用AntiXSSLibrary里面的HtmlSanitizationLibrary类库Sanitizer.GetSafeHtmlFragment即可。
  protected void btnPost_Click(object sender, EventArgs e)
  {
  this.lblName.Text = Sanitizer.GetSafeHtmlFragment(txtName.Text);
  }
  这样对于特殊脚本的内容,会自动剔除过滤,而不会记录了,从而达到我们想要的目的。
  Database db = CreateDatabase();
  DbCommand command = db.GetSqlStringCommand(sql);
  command.Parameters.AddRange(param);
 4、IIS短文件/文件夹漏洞出现和修复
  通过猜解,可能会得出一些重要的网页文件地址,如可能在/Pages/Security/下存在UserList.aspx和MenuList.aspx文件。
  [建议措施]
  1)禁止url中使用“~”或它的Unicode编码。
  2)关闭windows的8.3格式功能。
  修复可以参考下面的做法,或者找相关运维部门进行处理即可。
  http://sebug.net/vuldb/ssvid-60252
  http://webscan.360.cn/vul/view/vulid/1020
  http://www.bitscn.com/network/security/200607/36285.html
  5、系统敏感信息泄露出现和修复
  如果页面继承一般的page,而没有进行Session判断,那么可能会被攻击者获取到页面地址,进而获取到例如用户名等重要数据的。
  一般避免这种方式是对于一些需要登录才能访问到的页面,一定要进行Session判断,可能很容易给漏掉了。如我在Web框架里面,就是继承一个BasePage,BasePage 统一对页面进行一个登录判断。
public partial class UserList : BasePage
{
protected void Page_Load(object sender, EventArgs e)
{
...............
/// <summary>
/// BasePage 集成自权限基础抽象类FPage,其他页面则集成自BasePage
/// </summary>
public class BasePage : FPage
{
/// <summary>
/// 默认构造函数
/// </summary>
public BasePage()
{
this.IsFunctionControl = true;//默认页面启动权限认证
}
/// <summary>
/// 检查用户是否登录
/// </summary>
private void CheckLogin()
{
if (string.IsNullOrEmpty(Permission.Identity))
{
string url = string.Format("{0}/Pages/CommonPage/Login.aspx?userRequest={1}",
Request.ApplicationPath.TrimEnd('/'), HttpUtility.UrlEncode(Request.Url.ToString()));
Response.Redirect(url);
}
}
/// <summary>
/// 覆盖HasFunction方法以使权限类判断是否具有某功能点的权限
/// </summary>
/// <param name="functionId"></param>
/// <returns></returns>
protected override bool HasFunction(string functionId)
{
CheckLogin();
bool breturn = false;
try
{
breturn = Permission.HasFunction(functionId);
}
catch (Exception)
{
Helper.Alerts(this, "BasePage调用权限系统的HasFunction函数出错");
}
return breturn;
}
protected override void OnInit(EventArgs e)
{
Response.Cache.SetNoStore(); //清除缓存
base.OnInit(e);
CheckLogin();
}
  否则可能会受到攻击,并通过抓包软件发现页面数据,获得一些重要的用户名或者相关信息。
  还有一个值得注意的地方,就是一般这种不是很安全的网络,最好要求输入比较复杂一点的密码(强制要求),例如不能全部是数字密码或者不能是纯字符,对位数也要求多一点,因为很多人输入12345678,123456,123这样的密码,很容易被猜出来并登录系统,造成不必要的损失。
  6、总结性建议
  针对上面发现的问题,提出下面几条建议。
  1)在服务器与网络的接口处配置防火墙,用于阻断外界用户对服务器的扫描和探测。
  2)限制网站后台访问权限,如:禁止公网IP访问后台;禁止服务员使用弱口令。
  3)对用户输入的数据进行全面安全检查或过滤,尤其注意检查是否包含SQL 或XSS特殊字符。这些检查或过滤必须在服务器端完成。
  4)关闭windows的8.3格式功能。
  5)限制敏感页面或目录的访问权限。

posted @ 2014-08-29 09:45 顺其自然EVO 阅读(649) | 评论 (0)编辑 收藏

Spring框架下的单元测试方法

 介绍在Spring的框架下,做单元测试的两种办法。
  一、使用spring中对Junit框架的整合功能
  除了junit4和spring的jar包,还需要spring-test.jar。引入如下依赖:
<span style="font-size:18px;"><span style="white-space:pre">        </span><dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>3.1.1.RELEASE</version>
</dependency></span>
  然后测试类需要继承自AbstractJUnit4SpringContextTests,这样就可以在测试类中使用注解简单的注入需要的bean了。
<span style="font-size:18px;"><span style="color:#ff0000;">@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:applicationContext.xml"})</span>
public class ReadDaoImplTest extends<span style="color:#ff0000;"> AbstractJUnit4SpringContextTests</span>{
@Resource ReadDao readDao;
@Test
public void getListTest(){
List<Client> clientList = readDao.getList("client.test", null);
for(Client c:clientList){
System.out.println(c.getVersionNum());
}
}
}
</span>
  二、手动加载spring的配置文件,并启动spring容器
public class ReadDaoImplTest {
public  static void main(String[] args){
ClassPathXmlApplicationContext context = <span style="color:#ff0000;">new ClassPathXmlApplicationContext("applicationContext.xml");</span>
context.start();
ReadDao fqaService = (ReadDao) context.getBean("readDao");
System.out.println(fqaService);
}
}
  用这种方式测试,只需要Ctrl+F11就行了

posted @ 2014-08-29 09:43 顺其自然EVO 阅读(268) | 评论 (0)编辑 收藏

使用RSpec编写具有可读性的功能测试

 Chris Zetter是FutureLearn产品组的一名开发者,他为我们讲述了自己的小组为了使功能测试兼具可维护性与可读性,在把Cucumber替换为RSpec之后是如何来编写测试的。
  测试是建立与维护一个大型平台不可或缺的一部分。每当我们为FutureLearn这个平台增添新功能时,我们都会编写自动化的功能测试来记录这些新功能是如何运作的,并确保他们不运转时我们也能知晓。
  令人爱恨交加的Cucumber
  Cucumber是一款用来编写功能测试的常用工具,每当我们开启项目时它都是我们的不二选择。它可以让我们以用户的视角编写出高层级的行为驱动测试。
Feature: Enrolment
Scenario: Enrolling in a course
Given there is a course
And I am logged in as a learner
When I enrol on a course
Then the course should appear in 'my courses'
  我们乐于使用Cucumber因为它可以使根据用户故事编写测试变得简单易行,而且写完的测试通俗易懂。然而使用Cucumber也有些许不足之处。首先,我们已经在项目里使用了RSpec,再引入Cucumber意味着又要多维护一个测试框架;其次,由于两者的DSLs和测试运行器不同,在他们之间进行脑筋切换又会带来额外开销;最后,我们特别不喜欢Cucumber所使用的正则表达式,因为同Ruby的标准方法调用相比,它们使测试变得更加晦涩难懂。
  编写更好的RSpec features
  那么,我么该如何在不失测试可读性的前提下停用Cucumber呢?
  我们已经开始使用RSpec features来替代Cucumber,它们通常看起来会是这样:
feature 'Enrolment' do
scenario 'Enrolling in a course' do
course = FactoryGirl.create(:course)
learner = FactoryGirl.create(:learner)
login_as learner
visit course_path(course)
find('.join').click
expect(page).to have_content('Thanks for joining!')
visit '/'
expect(page).to have_main_header('My Courses')
expect(page).to have_content(course.full_title)
end
end
  它们总是趋于变得很长,使得难以辨明其究竟在测试些什么。而且难以区分诸如Arrange, Act, Assert(在Cucumber里又被称为’Given’、’When’和’Then’)这些部分。我们试过在代码中这些步骤里添加注释,但它们就和通常那些程序代码里的注释一样不尽如人意:一段时间之后这些注释就变得与实际代码不同步了。
  一般来说,如果是在程序里别的地方写出这么长的方法,我们就会有所警觉,并且通常会采用提取方法的办法进行重构。何不也这么做呢?让我们依据Cucumber步骤的风格,把这些代码也提取成一个个方法吧。
feature 'Enrolment' do
scenario 'Enrolling in a course' do
given_there_is_a_course
and_i_am_logged_in_as_a_learner
when_i_enrol_on_a_course
then_the_course_should_appear_in_my_courses
end
def given_there_is_a_course
@course = FactoryGirl.create(:course)
end
def and_i_am_logged_in_as_a_learner
@learner = FactoryGirl.create(:learner)
login_as @learner
end
def when_i_enrol_on_a_course
visit course_path(@course)
find('.join').click
expect(page).to have_content('Thanks for joining!')
end
def then_the_course_should_appear_in_my_courses
visit '/'
expect(page).to have_main_header('My Courses')
expect(page).to have_content(@course.full_title)
end
end
  我们有何发现
  我们移除了全部的Cucumber功能测试,并把它们中大部分用新式的RSpec features加以重写。这样一来即可保证拥有Cucumber所提供的优秀的可读性,又使得测试变得更加便于编写和维护。
  我们做了一个慎重的决定,不把各个features文件里提取的方法进行复用,因为担心这么做会使得测试难于理解。我们发现在编写一个feature下的多条scenario时,会不自觉的就想要进行代码复用。

posted @ 2014-08-29 09:42 顺其自然EVO 阅读(172) | 评论 (0)编辑 收藏

仅列出标题
共394页: First 上一页 56 57 58 59 60 61 62 63 64 下一页 Last 
<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

导航

统计

常用链接

留言簿(55)

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜