構建安全的Xml Web Service系列之如何察看SoapMessage

上一篇文章地址:構建安全的Xml Web Service系列一之初探使用Soap頭 (5-22 12:53)????
???? 要分析Xml Web Service的安全性,首先要解決的問題是我們能了解和清楚Soap消息的格式和內容,如果獲得不了SoapMessage,分析如何能構建安全Xml web service也就無從下手,即使分析出來,自己也可 能模模糊糊,不能定論。下面就分析下如何獲得SoapMessage。
??? 首先介紹一個類-SoapExtension,msdn對這個類的備注為:ASP.NET 允許通過擴展性機制生成與 SOAP 相關的基礎結構。ASP.NET SOAP 擴展結構以一種擴展為中心,該擴展可以在客戶端或服務器上處理消息時在特定階段中檢查或修改消息。ASP.NET SOAP 擴展從 SoapExtension 類派生。GetInitializer 和 Initialize 方法提供其他可用機制,用于初始化 SOAP 擴展以增強性能。ProcessMessage 是大多數 SOAP 擴展的核心,原因是該方法在 SoapMessageStage 中定義的每一個階段都被調用,從而使 SOAP 擴展得以執行所需的該特定 SOAP 擴展的行為。對于需要修改 SOAP 請求或 SOAP 響應的 SOAP 擴展,ChainStream 提供一個機會以接收要通過網絡發送的建議數據。 仔細閱讀這段文字,如果您以前開發過windows程序,那第一個應該想到的是:原來web service的處理機制和windows窗口程序的消息機制竟然有著一曲同工之妙。下面談談如何利用這個類,來截獲Xml web Service請求和相應的Soap消息,從而看看xml web service的廬山真面目。
??? 首先大家先看看這個類,這個類完成的功能是將Xml Web Service通過擴展的方式,將每次的請求和響應的Soap消息通過日志的方式保存到文本文件中。日志記錄的方式也有兩種:
??? 1。針對每個WebMethod產生一個日志文件。
????2。針對每個WebService產生一個日志文件
?因為一個WebService可能包含一個或者多個WebMethod,所以如果指定兩種方法都支持的話,那第二個日志兩面應該包括第一個日志里面的內容,而有些情況下,是不需要對每個WebMethod都進行日志記錄的,這時候采用第一種記錄方式,增強了系統的靈活性。?
下面是擴展了的SoapExtension
None.gif?<webServices>
None.gif????????
<soapExtensionTypes>
None.gif??????????
<add?type="Jillzhang.TraceExtension,Jillzhang"?priority="1"??group="High"??/>
None.gif????????
</soapExtensionTypes>
None.gif??????
</webServices>
ContractedBlock.gifExpandedBlockStart.gif可以記錄SoapMessage的SoapExtension
None.gifnamespace?Jillzhang
None.gif{
None.gif????public?class?TraceExtension:?SoapExtension
None.gif????{
None.gif????????static?readonly?string?LogRoot?=?System.Configuration.ConfigurationManager.AppSettings["logRoot"];
None.gif????????Stream?oldStream;
None.gif????????Stream?newStream;
None.gif????????string?filename;
None.gif
None.gif???????///?
<summary>
None.gif???????///?將請求流和響應流存到內存流中,已被調用
None.gif???????///?
</summary>
None.gif????????///?
<param?name="stream">包含?SOAP?請求或響應的內存緩沖區</param>
None.gif????????///?
<returns>它表示此?SOAP?擴展可以修改的新內存緩沖區。</returns>
None.gif????????public?override?Stream?ChainStream(Stream?stream)
None.gif????????{
None.gif????????????oldStream?=?stream;
None.gif????????????newStream?=?new?MemoryStream();
None.gif????????????return?newStream;
None.gif????????}
None.gif
None.gif????????///?
<summary>
None.gif????????///?在Xml?Web?Service第一次運行的時候,一次性的將通過TraceExtensionAttribute傳遞進來的
None.gif????????///?保存日志信息的文件名初始化
None.gif????????///?
</summary>
None.gif????????///?
<param?name="methodInfo">應用?SOAP?擴展的?XML?Web?services?方法的特定函數原型</param>
None.gif????????///?
<param?name="attribute">應用于?XML?Web?services?方法的?SoapExtensionAttribute</param>
None.gif????????///?
<returns>SOAP?擴展將對其進行初始化以用于緩存</returns>
None.gif????????public?override?object?GetInitializer(LogicalMethodInfo?methodInfo,?SoapExtensionAttribute?attribute)
None.gif????????{
None.gif????????????return?((TraceExtensionAttribute)attribute).Filename;
None.gif????????}
None.gif
None.gif????????///?
<summary>
None.gif????????///?替代為每個方法配置的保存SoapMessage文件名,而是將整個網絡服務
None.gif????????///?的SoapMessage都保存到一個日志文件中,這個文件路徑需要在Web?Service
None.gif????????///?的配置文件中web.config指出,如
None.gif????????///?
<appSettings>
None.gif????????///??
<add?key="logRoot"?value="c:\\serviceLog"/>
None.gif????????///?
</appSettings>
None.gif????????///?
</summary>
None.gif????????///?
<param?name="WebServiceType">網絡服務的類型</param>
None.gif????????///?
<returns>用于保存日志記錄的文件路徑</returns>
None.gif????????public?override?object?GetInitializer(Type?WebServiceType)
None.gif????????{
None.gif????????????//return?LogRoot.TrimEnd('\\')?+?"\\"?+?WebServiceType.FullName?+?".log";
None.gif????????????return?LogRoot.TrimEnd('\\')+"\\"+?WebServiceType.FullName?+?".log";
None.gif????????}
None.gif
None.gif????????//獲得文件名,并將其保存下來
None.gif????????public?override?void?Initialize(object?initializer)
None.gif????????{
None.gif????????????filename?=?(string)initializer;
None.gif????????}
None.gif
None.gif???????///?
<summary>
None.gif???????///?當數據還為Soap格式的時候,將數據寫入日志
None.gif???????///?
</summary>
None.gif???????///?
<param?name="message"></param>
None.gif????????public?override?void?ProcessMessage(SoapMessage?message)
None.gif????????{
None.gif????????????switch?(message.Stage)
None.gif????????????{
None.gif????????????????case?SoapMessageStage.BeforeSerialize:
None.gif????????????????????break;
None.gif????????????????case?SoapMessageStage.AfterSerialize:
None.gif????????????????????WriteOutput(message);
None.gif????????????????????break;
None.gif????????????????case?SoapMessageStage.BeforeDeserialize:
None.gif????????????????????WriteInput(message);
None.gif????????????????????break;
None.gif????????????????case?SoapMessageStage.AfterDeserialize:
None.gif????????????????????break;
None.gif????????????????default:
None.gif????????????????????throw?new?Exception("invalid?stage");
None.gif????????????}
None.gif????????}
None.gif????????///?
<summary>
None.gif????????///?將SoapMessage寫入到日志文件
None.gif????????///?
</summary>
None.gif????????///?
<param?name="message"></param>
None.gif????????public?void?WriteOutput(SoapMessage?message)
None.gif????????{
None.gif????????????newStream.Position?=?0;?
None.gif????????????//創建或追加記錄文件
None.gif????????????FileStream?fs?=?new?FileStream(filename,?FileMode.Append,
None.gif????????????????FileAccess.Write);
None.gif????????????StreamWriter?w?=?new?StreamWriter(fs);
None.gif????????????string?soapString?=?(message?is?SoapServerMessage)???"Soap響應"?:?"Soap請求";
None.gif????????????w.WriteLine("-----"?+?soapString?+?"?在?"?+?DateTime.Now.ToString("yyyy年MM月dd日?HH時mm分ss秒"));
None.gif????????????w.Flush();
None.gif????????????Copy(newStream,?fs);
None.gif????????????w.Close();
None.gif????????????newStream.Position?=?0;
None.gif????????????Copy(newStream,?oldStream);
None.gif????????}
None.gif
None.gif????????public?void?WriteInput(SoapMessage?message)
None.gif????????{
None.gif????????????Copy(oldStream,?newStream);
None.gif????????????FileStream?fs?=?new?FileStream(filename,?FileMode.Append,
None.gif????????????????FileAccess.Write);
None.gif????????????StreamWriter?w?=?new?StreamWriter(fs);
None.gif
None.gif????????????string?soapString?=?(message?is?SoapServerMessage)??
None.gif?????????????????"Soap請求"?:?"Soap響應";
None.gif????????????w.WriteLine("-----"?+?soapString?+
None.gif????????????????"?在?"?+?DateTime.Now.ToString("yyyy年MM月dd日?HH時mm分ss秒"));
None.gif????????????w.Flush();
None.gif????????????newStream.Position?=?0;
None.gif????????????Copy(newStream,?fs);
None.gif????????????w.Close();
None.gif????????????newStream.Position?=?0;
None.gif????????}
None.gif????????///?
<summary>
None.gif????????///?拷貝流到流
None.gif????????///?
</summary>
None.gif????????///?
<param?name="from"></param>
None.gif????????///?
<param?name="to"></param>
None.gif????????void?Copy(Stream?from,?Stream?to)
None.gif????????{
None.gif????????????TextReader?reader?=?new?StreamReader(from);
None.gif????????????TextWriter?writer?=?new?StreamWriter(to);
None.gif????????????writer.WriteLine(reader.ReadToEnd());
None.gif????????????writer.Flush();
None.gif????????}
None.gif????}
None.gif
None.gif????//創建一個用于在WebMethod上使用的SoapExtension屬性
None.gif????[AttributeUsage(AttributeTargets.Method)]
None.gif????public?class?TraceExtensionAttribute?:?SoapExtensionAttribute
None.gif????{
None.gif
None.gif????????private?string?filename?=?"c:\\log.txt";
None.gif????????private?int?priority;
None.gif
None.gif????????///?
<summary>
None.gif????????///?擴展類型
None.gif????????///?
</summary>
None.gif????????public?override?Type?ExtensionType
None.gif????????{
None.gif????????????get?{?return?typeof(TraceExtension);?}
None.gif????????}
None.gif????????///?
<summary>
None.gif????????///?優先級?
None.gif????????///?
</summary>
None.gif????????public?override?int?Priority
None.gif????????{
None.gif????????????get?{?return?priority;?}
None.gif????????????set?{?priority?=?value;?}
None.gif????????}
None.gif????????///?
<summary>
None.gif????????///?用于記錄該WebMethod的SoapMessage的文件的絕對路徑
None.gif????????///?默認為c:\\log.txt;
None.gif????????///?
</summary>
None.gif????????public?string?Filename
None.gif????????{
None.gif????????????get
None.gif????????????{
None.gif????????????????return?filename;
None.gif????????????}
None.gif????????????set
None.gif????????????{
None.gif????????????????filename?=?value;
None.gif????????????}
None.gif????????}
None.gif????}???
None.gif}
None.gif
結下來,介紹一個如何使用該類:
如果要使讓TraceExtension支持第一種記錄方式,需要作的額外工作為:
只需要在要記錄SoapMessage的WebMethod添加如下的Attribute
[TraceExtension(Filename="d:\\data.xml",Priority=0)]
當然路徑,您可以自己設定
前一節的WebMethod就變成了
ContractedBlock.gifExpandedBlockStart.gif添加了針對WebMethod日志記錄的WebMethod
None.gif?public?MySoapHeader?header?=?new?MySoapHeader();????????
None.gif????????[WebMethod]
None.gif????????[SoapHeader("header")]???
None.gif????????[TraceExtension(Filename="d:\\data.xml",Priority=0)]
None.gif????????public?string?HelloWorld()
None.gif????????{
None.gif????????????if?(header?==?null)
None.gif????????????{
None.gif????????????????return?"您沒有設置SoapHeader,不能正常訪問此服務!";
None.gif????????????}
None.gif????????????if?(header.UserName?!=?"jillzhang"?||?header.Pwd?!=?"123456")
None.gif????????????{
None.gif????????????????return?"您提供的身份驗證信息有誤,不能正常訪問此服務!";
None.gif????????????}
None.gif????????????return?"Hello?World";
None.gif????????}
調用下該WebService,便在d盤產生一個data.xml文件,里面的內容為:
ContractedBlock.gifExpandedBlockStart.gif日志記錄
None.gif-----Soap請求?在?2007年05月25日?09時06分29秒
None.gif
<?xml?version="1.0"?encoding="utf-8"?><soap:Envelope?xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"?xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Header><MySoapHeader?xmlns="http://tempuri.org/"><UserName>jillzhang</UserName><Pwd>123456</Pwd></MySoapHeader></soap:Header><soap:Body><HelloWorld?xmlns="http://tempuri.org/"?/></soap:Body></soap:Envelope>
None.gif
None.gif
None.gif-----Soap響應?在?2007年05月25日?09時06分29秒
None.gif
<?xml?version="1.0"?encoding="utf-8"?><soap:Envelope?xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"?xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><HelloWorldResponse?xmlns="http://tempuri.org/"><HelloWorldResult>Hello?World</HelloWorldResult></HelloWorldResponse></soap:Body></soap:Envelope>
None.gif
如何采用第二種方法,讓WebService的每個WebMethod都能記錄日志
需要在Web.config中作如下的設定
首先添加如下節點
None.gif?<webServices>
None.gif????????
<soapExtensionTypes>
None.gif??????????
<add?type="Jillzhang.TraceExtension,Jillzhang"?priority="1"??group="High"??/>
None.gif????????
</soapExtensionTypes>
None.gif??????
</webServices>
然后通過配置設定日志文件保留的路徑:
None.gif<appSettings>
None.gif????
<add?key="logRoot"?value="d:"/>
None.gif??
</appSettings>
找到日志文件,里面也赫然有著SoapMessage的真面目。通過以上方法,大家可以清晰地分析到SoapMessage的具體格式和內容,知道了這個以后,對付Web Service,您就可以隨心應手,隨心所欲,如果你愿意,你甚至也可以“強奸"一次webservice,哈哈!
上一篇文章地址:構建安全的Xml Web Service系列一之初探使用Soap頭 (5-22 12:53)
附:終于買上房了,雖然買的過程很累,但現在還是很Happy!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/276421.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/276421.shtml
英文地址,請注明出處:http://en.pswp.cn/news/276421.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

前端高效開發必備的 js 庫梳理

之前有很多人問學好前端需要學習哪些 js 庫, 主流框架應該學 vue 還是 react ? 針對這些問題, 筆者來說說自己的看法和學習總結.首先我覺得在學習任何知識之前必須要有一個明確的學習目標, 知道自己為什么要學它, 而不是看網上說的一股腦的給你灌輸各種知識, 讓你學習各種庫, …

交叉報表crosstab隱藏列名顯示_SAP軟件 報表查詢之 輸出格式設置

SAP不僅是功能強大、邏輯嚴謹的ERP軟件&#xff0c;還提供了強大的報表查詢功能。SAP的ALV報表展示功能是SAP的一大特點&#xff0c;實現了類似于EXCEL的功能。使用好ALV報表功能可以方便用戶從SAP中取到想要的數據&#xff0c;尤其是財務用戶。大家在使用SAP報表時&#xff0c…

CSS HACK 區別 IE6、IE7、IE8、Firefox兼容性

轉載鏈接&#xff1a;http://developer.51cto.com/art/201009/226787_1.htm 本文向大家描述一下如何使用CSS HACK區別IE6、IE7、IE8、Firefox兼容性問題&#xff0c;針對不同的瀏覽器寫不同的CSS code的過程&#xff0c;就叫CSS hack,也叫寫CSS hack&#xff0c;相信你對本文介…

Flex sdk4 布局與更新

在flex中,主要使用LayoutManager來驅動組件的度量和布局策略, LayoutManager實現一個單例,在Application類構造函數中創建: 1 public functionApplication()2 {3 UIComponentGlobals.layoutManager ILayoutManager(4 Singleton.getInstance("mx.managers::ILayoutManager&…

linux PROC文件系統詳解

/proc文件系統下的多種文件提供的系統信息不是針對某個特定進程的&#xff0c;而是能夠在整個系統范圍的上下文中使用。可以使用的文件隨系統配置的變化而變化。命令procinfo能夠顯示基于其中某些文件的多種系統信息。以下詳細描述/proc下的文件。----------------------------…

seo每日一貼_白楊SEO:我看ZAC的外貿SEO應該怎樣做?(策略篇)

前言&#xff1a;這是白楊SEO公眾號更新第64篇。本該寫寫頭條SEO啥的&#xff0c;最近在師徒培訓講站內SEO時有旁聽同學提到后面講講谷歌SEO怎么樣&#xff0c;因為谷歌全世界搜索市場占有率&#xff0c;所以外貿SEO最主要還是做谷歌SEO。以白楊特意又去了前輩ZAC的SEO每日一貼…

Can't connect to local MySQL server through socket '/tmp/mysql.sock'

轉載鏈接&#xff1a;http://blog.csdn.net/ixidof/article/details/5958904 摘要&#xff1a;解決不能通過mysql .sock連接MySQL問題 這個問題主要提示是&#xff0c;不能通過 /tmp/mysql .sock連到服務器&#xff0c;而php標準配置正是用過/tmp/mysql .sock&#xff0c;但是…

[轉]網頁柵格系統研究(2):蛋糕的切法

[出自]http://lifesinger.org/blog/2008/10/grid-system-2/首先澄清一個應用場景問題。研究&#xff08;1&#xff09;中指出&#xff0c;對于結構復雜的網站&#xff0c;不少設計師們喜歡采用960固定寬度布局。但要注意的是&#xff0c;960并不是萬能鑰匙&#xff0c;大部分網…

Vue3響應式原理

關注若川視野&#xff0c;回復"pdf" 領取資料&#xff0c;回復"加群"&#xff0c;可加群長期交流學習本文結構- 關于Vue3- Vue2響應式原理回顧- Vue3響應式方案- Vue3響應式原理- 手寫mini版Vue3響應式本文共計&#xff1a;2349字2圖預計閱讀時間&#xff…

python二值化 感興趣區域_Python+OpenCV感興趣區域ROI提取方法

方法一&#xff1a;使用輪廓步驟1"""src為原圖"""ROI np.zeros(src.shape, np.uint8) #感興趣區域ROIproimage src.copy() #復制原圖"""提取輪廓"""proimagecv2.cvtColor(proimage,cv2.COLOR_BGR2GRAY) #轉換成…

error while loading shared libraries: libmysqlclient.so.16: cannot open

轉載鏈接&#xff1a;http://blog.sina.com.cn/s/blog_4ab24dd50100wnkv.html 問題解決辦法&#xff1a; locate libmysqlclient.so.16 如我的mysql安裝在/usr/local/mysql下&#xff0c;則結果為 /usr/local/mysql/lib/mysql/libmysqlclient.so.16 vi /etc/ld.so.conf 增…

編譯cvaux錯誤的原因

平臺vc6.0;在debug模式下編譯cvaux時會提示三個錯誤&#xff1a;error C2039: foreground_regions : is not a member of CvFGDStatModelerror C2039: foreground_regions : is not a member of CvFGDStatModelerror C2039: foreground_regions : is not a member of CvGaussBG…

找準切入點,調試看源碼,事半功倍

關注若川視野&#xff0c;回復"pdf" 領取資料&#xff0c;回復"加群"&#xff0c;可加群長期交流學習最近寫了很多源碼分析相關的文章&#xff0c;React、Vue 都有&#xff0c;想把我閱讀源碼的一些心得分享給大家。React&#xff1a;React 架構的演變 - 從…

Android布局大全

Android的界面是有布局和組件協同完成的&#xff0c;布局好比是建筑里的框架&#xff0c;而組件則相當于建筑里的磚瓦。組件按照布局的要求依次排列&#xff0c;就組成了用戶所看見的界面。 所有的布局方式都可以歸類為ViewGroup的5個類別&#xff0c;即ViewGroup的5個直接子類…

java實現加減乘除運算符隨機生成十道題并判斷對錯_2020年Java面試題(3年的工作總結),最全的知識點總結...

這份Java面試題整整花了三個月的時間來整理&#xff0c;都是自己再工作中總結出來&#xff0c;記住多少就寫多少&#xff0c;希望這份資料可以幫助你們&#xff0c;文末有其余部分資料的領取方式.Redis12道面試題1.什么是Redis&#xff1f;答&#xff1a;Remote Dictionary Ser…

Linux MySQL 5.1.62 source install

源碼包官網下載&#xff1a;http://dev.mysql.com/downloads/ MySQL手冊官網下載&#xff1a;http://dev.mysql.com/doc/ 安裝ncurses&#xff1a; 1、tar -zxvf ncurses-5.9.tar.gz 2、cd ncurses-5.9.tar.gz ; ./configure; make clean; make; make install 修改時區…

RDLC 示例 文章 1

GotReportViewer的實例&#xff0c;請在下面的連接中下載&#xff1a; http://files.cnblogs.com/waxdoll/RDLC.rar http://www.databasejournal.com/features/mssql/article.php/3605826/Mastering-OLAP-Reporting--Reporting-with-Analysis-Services-KPIs.htm MSSQL Server …

.NET 中的泛型 101

1.1.1 摘要 圖1 C# 泛型介紹 在接觸泛型之前&#xff0c;我們編程一般都是使用具體類型&#xff08;char, int, string等&#xff09;或自定義類型來定義我們變量&#xff0c;如果我們有一個功能很強的接口&#xff0c;而且我們想把它提取或重構成一個通用的接口&#xff0c;使…

年底了,給想進階的的前端朋友一些福利

2020 年&#xff0c;很多朋友都經歷了一段比較艱難的求職季。年末&#xff0c;“就業寒冬”迎來了一絲暖陽&#xff0c;很多中大型互聯網公司擴大了未來一年的招聘需求。前不久&#xff0c;字節跳動放出了年末要招 1 萬人的消息&#xff0c;騰訊校招規模也將擴張至 5000 人&…

python oa系統_用python把C#操作OA的例子重寫了一下

#手工chrome.exe --remote-debugging-port9222 --user-data-dir"C:\selenum\AutomationProfile"fromselenium import webdriverfromselenium.webdriver.common.by import Byfromselenium.webdriver.support.ui import WebDriverWaitfromselenium.webdriver.chrome.op…