載地址HTMLTestRunner.py文件:
http://tungwaiyip.info/software/HTMLTestRunner.html
下載的適合python2,如果python3要修改一些內(nèi)容
首先吧HTMLTestRunner文件添加到環(huán)境變量里,可以直接放到python的Lib目錄下
HTMLTestRunner是python標(biāo)準(zhǔn)庫(kù)unittest單元測(cè)試框架的一個(gè)擴(kuò)展,用于生成HTML測(cè)試報(bào)告
#coding:utf-8
import unittest, HTMLTestRunner
class Testcase(unittest.TestCase): # 測(cè)試用例類
# 具體的測(cè)試用例,一定要以test開頭
def test1(self):
self.assertEqual(1, 1)
def test2(self):
self.assertEqual(2, 2)
if __name__ == "__main__":
# 構(gòu)造測(cè)試集
suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(Testcase)) # 執(zhí)行該測(cè)試類所有用例
# 定義報(bào)告的存放路徑,以二進(jìn)制寫的形式打開文件
f = open('test.html', 'wb')
# 定義測(cè)試報(bào)告,stream:報(bào)告存放路徑,title:報(bào)告標(biāo)題,description:描述
runner = HTMLTestRunner.HTMLTestRunner(stream=f, title=u'測(cè)試用例標(biāo)題', description=u'描述')
runner.run(suite) # 運(yùn)行測(cè)試用例
f.close() # 關(guān)閉文件
返回結(jié)果(測(cè)試報(bào)告詳情):
--stream :存放報(bào)告寫入文件的存入?yún)^(qū)域
--title :測(cè)試報(bào)告的主題
--description :測(cè)試報(bào)告的描述
為了生成帶有中文描述的測(cè)試用例類和測(cè)試用例
在用例類和用例方法下,通過’’’ ‘’’或””” “””來添加備注
#coding:utf-8
import unittest, HTMLTestRunner
class Testcase(unittest.TestCase): # 測(cè)試用例類
u'''類名后加備注'''
def test1(self):
u'''用例后面加備注1'''
self.assertEqual(1, 1)
def test2(self):
u'''用例后面加備注2'''
self.assertEqual(2, 2)
if __name__ == "__main__":
# 構(gòu)造測(cè)試集
suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(Testcase))
# 定義報(bào)告的存放路徑,以二進(jìn)制寫的形式打開文件
f = open('test.html', 'wb')
# 定義測(cè)試報(bào)告,stream:報(bào)告存放路徑,title:報(bào)告標(biāo)題,description:描述
runner = HTMLTestRunner.HTMLTestRunner(stream=f, title=u'測(cè)試用例標(biāo)題', description=u'描述')
runner.run(suite) # 運(yùn)行測(cè)試用例
f.close() # 關(guān)閉文件
返回結(jié)果:
#coding:utf-8
import unittest, HTMLTestRunner, time
from unittest.loader import makeSuite
class Testcase(unittest.TestCase): # 測(cè)試用例類
# 具體的測(cè)試用例,一定要以test開頭
def test1(self):
self.assertEqual(1, 1)
def test2(self):
self.assertEqual(2, 2)
if __name__ == "__main__":
# 構(gòu)造測(cè)試集
suite = unittest.TestSuite()
suite.addTest(makeSuite(Testcase)) # 執(zhí)行該測(cè)試類所有用例
# 定義報(bào)告的存放路徑,以二進(jìn)制寫的形式打開文件
now = time.strftime("%y-%m-%d %H_%M_%S")
f = open('./' + now + 'test.html', 'wb')
# 定義測(cè)試報(bào)告,stream:報(bào)告存放路徑,title:報(bào)告標(biāo)題,description:描述
runner = HTMLTestRunner.HTMLTestRunner(stream=f, title=u'測(cè)試用例標(biāo)題', description=u'描述')
runner.run(suite) # 運(yùn)行測(cè)試用例
f.close() # 關(guān)閉文件
返回結(jié)果:
將紅框里的內(nèi)容注釋掉改成uo = o.decode('utf-8')
DF文檔的打印在很多應(yīng)用場(chǎng)景中都會(huì)被使用到,最為常見的就是實(shí)驗(yàn)室信息管理的應(yīng)用場(chǎng)景,期間涉及到大量的報(bào)告呈現(xiàn)及打印的需求。
實(shí)驗(yàn)室信息管理系統(tǒng)(Laboratory Information Management System 英文縮寫LIMS)是將以數(shù)據(jù)庫(kù)為核心的信息化技術(shù)與實(shí)驗(yàn)室管理需求相結(jié)合的信息化管理工具。以ISO/IEC17025:2017 CNAS-CL01《檢測(cè)和校準(zhǔn)實(shí)驗(yàn)室能力的通用要求》(國(guó)標(biāo)為GB/T 27025:2008)規(guī)范為基礎(chǔ),結(jié)合網(wǎng)絡(luò)化技術(shù),將實(shí)驗(yàn)室的業(yè)務(wù)流程和一切資源以及行政管理等以合理方式進(jìn)行管理。
通過LIMS系統(tǒng),配合分析數(shù)據(jù)的自動(dòng)采集和分析,大大提高了實(shí)驗(yàn)室的檢測(cè)效率;降低了實(shí)驗(yàn)室運(yùn)行成本并且體現(xiàn)了快速溯源和痕跡,使傳統(tǒng)實(shí)驗(yàn)室手工作業(yè)中存在的各種弊端得以順利解決。目前實(shí)驗(yàn)室信息管理系統(tǒng)在西方發(fā)達(dá)國(guó)家的應(yīng)用相對(duì)比較成熟,我們國(guó)家經(jīng)過多年發(fā)展,很多實(shí)驗(yàn)室也開始逐漸認(rèn)識(shí)到信息化在管理中的作用,紛紛開始引入LIMS。
在LIMS系統(tǒng)構(gòu)建的過程中,實(shí)驗(yàn)?zāi)0逶O(shè)計(jì)、實(shí)驗(yàn)數(shù)據(jù)填報(bào)、導(dǎo)出完整的PDF實(shí)驗(yàn)報(bào)告并且實(shí)現(xiàn)檢測(cè)過程無(wú)紙化、系統(tǒng)化,檢測(cè)報(bào)告電子化是LIMS系統(tǒng)的主要需求。那么如何快速又高質(zhì)量的輸出PDF實(shí)驗(yàn)報(bào)告呢?
借助SpreadJS表格技術(shù)及GcExcel僅僅需要三步就可以完成整個(gè)功能的開發(fā):
用SpreadJS完成實(shí)現(xiàn)模板設(shè)計(jì)和實(shí)驗(yàn)數(shù)據(jù)填報(bào)
利用SpreadJS的在線表格編輯器,實(shí)驗(yàn)人員就可以通過類Excel的操作完成實(shí)驗(yàn)報(bào)告的設(shè)計(jì)。
通過以下代碼就可以將SpreadJS快速集成到現(xiàn)有的系統(tǒng)中:
創(chuàng)建一個(gè)JavaScript應(yīng)用程序:
注意 SpreadJS是無(wú)依賴的,僅僅需要以下文件: gc.spread.sheets.xx.x.x.css, gc.spread.sheets.all.xx.x.x.min.js即可.
<!DOCTYPE html><html lang="zh"><head>
<meta charset="utf-8" />
<script src="gc.spread.sheets.all.xx.x.x.min.js"><link rel="stylesheet" href="gc.spread.sheets.xx.x.x.css"type="text/css"/></head>
<body></body></html>
添加SpreadJS容器元素 - 在頁(yè)面的body元素中添加一個(gè)DOM元素作為它的容器。
<div id="ss"></div>
初始化SpreadJS JavaScript控件。 - SpreadJS控件通過使用new GC.Spread.Sheets.Workbook(document.getElementById('ss'), { sheetCount: 1 })來進(jìn)行初始化。
window.onload = function () {// Initialize a workbookvar workbook = new GC.Spread.Sheets.Workbook(document.getElementById('ss'), { sheetCount: 1 });// get workbook object// var workbook = GC.Spread.Sheets.findControl(document.getElementById('ss'));
};
在完成嵌入之后,通過SpreadJS的數(shù)據(jù)綁定的功能,某些默認(rèn)數(shù)據(jù)可以從數(shù)據(jù)庫(kù)加載,顯示到實(shí)驗(yàn)?zāi)0逯校瑢?shí)驗(yàn)人員填報(bào)的實(shí)驗(yàn)數(shù)據(jù)也可以通過數(shù)據(jù)綁定輕松獲取到
用SpreadJS完成導(dǎo)出PDF(打印)的配置
使用SpreadJS的在線表格編輯器可以完成導(dǎo)出PDF的配置,可配置導(dǎo)出區(qū)域,重復(fù)區(qū)域,頁(yè)眉,頁(yè)腳,水印等,對(duì)導(dǎo)出PDF報(bào)告進(jìn)行自定義。
用GCExcel將實(shí)驗(yàn)報(bào)告導(dǎo)出
在SpreadJS中完成模板設(shè)計(jì),實(shí)驗(yàn)數(shù)據(jù)填報(bào),以及各種打印配置后,可以將整個(gè)實(shí)驗(yàn)?zāi)0逦募?dǎo)出為一個(gè)json,發(fā)給后端,后端就可以用GCExcel加載,GCExcel可以完美兼容SpreadJS的特性,在SpreadJS中對(duì)模板的配置,以及對(duì)導(dǎo)出的PDF的配置,在GCExcel中都完美兼容,當(dāng)然也可以在GCExcel完成對(duì)模板的配置以及PDF導(dǎo)出的配置。
Java
Workbook workbook = new Workbook();
//打開SpreadJS導(dǎo)出的模板
workbook.open("template.ssjson");
// 導(dǎo)出PDF配置
PdfSaveOptions pdfSaveOptions = new PdfSaveOptions();
// 配置支持換行縮小
pdfSaveOptions.getShrinkToFitSettings().setCanShrinkToFitWrappedText(true);
// 導(dǎo)出PDF
workbook.save("ExportPdf.pdf");
至此,就完成PDF文檔的打印。
活中我們經(jīng)常會(huì)碰到空間領(lǐng)紅包“中毒”自動(dòng)發(fā)不良信息的現(xiàn)象,或者是不知不覺的被人盜取了信息的情況。通常這種情況都是XSS漏洞導(dǎo)致的,我們今天就來講解一下關(guān)于XSS漏洞的原理。
反射型
存儲(chǔ)型
Dom-based型
這里面反射型跟持久型都是很常見的,也是用的最廣泛的一種攻擊方式。
它的主要利用原理是:
給受害者發(fā)送帶有惡意代碼或腳本的鏈接,如果你點(diǎn)擊了鏈接,只要是被HTML所解析并且執(zhí)行了,那無(wú)論你是否快速關(guān)閉了點(diǎn)開的頁(yè)面,都白瞎了。
Dom這種XSS漏洞是基于文檔對(duì)象模型的一種漏洞,它的特點(diǎn)是通過url傳入?yún)?shù)去控制觸發(fā)的。
下面我們主要來說一下反射型跟存儲(chǔ)型XSS的原理,并附上代碼。
我們平時(shí)常見XSS地方很多都是搜索框(一般網(wǎng)站上都會(huì)有搜索文章什么的),我們可以在這種搜索框里面輸入:
<script>alert('XSS')</script>
來驗(yàn)證XSS的漏洞存在與否,如果存在會(huì)彈出一個(gè)編輯框“XSS”,下面我們自己構(gòu)建一個(gè)這樣的搜索框:
先新搭建好PHP環(huán)境,在站點(diǎn)新建一個(gè)xss.php文件,輸入以下的代碼。
代碼的意思很簡(jiǎn)單:
然后在瀏覽器上訪問的效果應(yīng)該是這樣的:
這個(gè)時(shí)候我們就可以輸入常規(guī)的信息去搜索,輸入“im liuse”顯示效果如下:
現(xiàn)在我們改變策略,輸入我們上面說的xss測(cè)試代碼<script>alert('XSS')</script>然后執(zhí)行,你會(huì)看到下圖的效果:
事實(shí)證明,沒有進(jìn)行過濾,如果我們把這個(gè)地方的<script>alert('XSS')</script>改成其它的代碼,如:
<script>alert(document.cookie)</script>
就可以獲取用戶的cookie(cookie記錄了用戶的登錄信息),拿到cookie有什么用呢?
舉個(gè)例子,比如說拿到你的QQ空間的cookie就可以不需要用戶名密碼登錄你的空間,我們經(jīng)常見到空間好友自動(dòng)轉(zhuǎn)發(fā)一些亂七八糟的東西的圖片文字的,基本都是通過xss漏洞搞的。
說完反射型XSS我們?cè)賮碚f說存儲(chǔ)型XSS。
相對(duì)于反射型XSS,存儲(chǔ)型XSS的檔次確實(shí)高了不少,不過利用難度也相對(duì)提高了。
什么是存儲(chǔ)型XSS呢?沒錯(cuò)就跟它的名字一樣,是可以儲(chǔ)存起惡意代碼的方式。這種漏洞利用多出現(xiàn)在論壇評(píng)論,后臺(tái)上傳這些地方,可以是圖片也可以是文字。相對(duì)于反射型XSS不同的是,存儲(chǔ)型XSS可以保存在服務(wù)器端(存到數(shù)據(jù)庫(kù))下面我們用代碼舉例:
我們?cè)谏厦娴膞ss.php文件的基礎(chǔ)上修改一下:
同樣的代碼還是很容易理解:
下面,我們來實(shí)驗(yàn)一下。
在搜索框同樣輸入我們的XSS代碼:
你會(huì)發(fā)現(xiàn)貌似前臺(tái)沒有顯示,但去mysql數(shù)據(jù)庫(kù)看已經(jīng)存儲(chǔ)到數(shù)據(jù)庫(kù)了,以后任何人去訪問某個(gè)調(diào)用這個(gè)數(shù)據(jù)庫(kù)的頁(yè)面都會(huì)受影響!
以上就是簡(jiǎn)單的演示說明,下面我們講講防范過濾。
重點(diǎn)對(duì)象:
<>(尖括號(hào))、”(引號(hào))、 ‘(單引號(hào))、%(百分比符號(hào))、;(分號(hào))、()(括號(hào))、&(& 符號(hào))、+(加號(hào))
過濾函數(shù):
(1)htmlspecialchars() 函數(shù),用于轉(zhuǎn)義處理在頁(yè)面上顯示的文本。
(2)htmlentities() 函數(shù),用于轉(zhuǎn)義處理在頁(yè)面上顯示的文本。
(3)strip_tags() 函數(shù),過濾掉輸入、輸出里面的惡意標(biāo)簽。
(4)header() 函數(shù),使用header("Content-type:application/json"); 用于控制 json 數(shù)據(jù)的頭部,不用于瀏覽。
(5)urlencode() 函數(shù),用于輸出處理字符型參數(shù)帶入頁(yè)面鏈接中。
(6)intval() 函數(shù)用于處理數(shù)值型參數(shù)輸出頁(yè)面中。
好,今天XSS就先介紹到這里了,希望各位一定要認(rèn)識(shí)到網(wǎng)安的重要性!
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。