亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > XML > 正文

構建安全的Xml Web Service系列(二)

2024-09-05 20:55:58
字體:
來源:轉載
供稿:網友

  上一篇文章地址:構建安全的xml web service系列一之初探使用soap頭

  要分析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

<webservices>
        <soapextensiontypes>
          <add type="jillzhang.traceextension,jillzhang" priority="1"  group="high"  />
        </soapextensiontypes>
      </webservices>

可以記錄soapmessage的soapextension

namespace jillzhang
{
    public class traceextension: soapextension
    {
        static readonly string logroot = system.configuration.configurationmanager.appsettings["logroot"];
        stream oldstream;
        stream newstream;
        string filename;
       /// <summary>
       /// 將請求流和響應流存到內存流中,已被調用
       /// </summary>
        /// <param name="stream">包含 soap 請求或響應的內存緩沖區</param>
        /// <returns>它表示此 soap 擴展可以修改的新內存緩沖區。</returns>
        public override stream chainstream(stream stream)
        {
            oldstream = stream;
            newstream = new memorystream();
            return newstream;
        }
        /// <summary>
        /// 在xml web service第一次運行的時候,一次性的將通過traceextensionattribute傳遞進來的
        /// 保存日志信息的文件名初始化
        /// </summary>
        /// <param name="methodinfo">應用 soap 擴展的 xml web services 方法的特定函數原型</param>
        /// <param name="attribute">應用于 xml web services 方法的 soapextensionattribute</param>
        /// <returns>soap 擴展將對其進行初始化以用于緩存</returns>
        public override object getinitializer(logicalmethodinfo methodinfo, soapextensionattribute attribute)
        {
            return ((traceextensionattribute)attribute).filename;
        }
        /// <summary>
        /// 替代為每個方法配置的保存soapmessage文件名,而是將整個網絡服務
        /// 的soapmessage都保存到一個日志文件中,這個文件路徑需要在web service
        /// 的配置文件中web.config指出,如
        /// <appsettings>
        ///  <add key="logroot" value="c://servicelog"/>
        /// </appsettings>
        /// </summary>
        /// <param name="webservicetype">網絡服務的類型</param>
        /// <returns>用于保存日志記錄的文件路徑</returns>
        public override object getinitializer(type webservicetype)
        {
            //return logroot.trimend('//') + "http://" + webservicetype.fullname + ".log";
            return logroot.trimend('//')+"http://"+ webservicetype.fullname + ".log";
        }
        //獲得文件名,并將其保存下來
        public override void initialize(object initializer)
        {
            filename = (string)initializer;
        }
       /// <summary>
       /// 當數據還為soap格式的時候,將數據寫入日志
       /// </summary>
       /// <param name="message"></param>
        public override void processmessage(soapmessage message)
        {
            switch (message.stage)
            {
                case soapmessagestage.beforeserialize:
                    break;
                case soapmessagestage.afterserialize:
                    writeoutput(message);
                    break;
                case soapmessagestage.beforedeserialize:
                    writeinput(message);
                    break;
                case soapmessagestage.afterdeserialize:
                    break;
                default:
                    throw new exception("invalid stage");
            }
        }
        /// <summary>
        /// 將soapmessage寫入到日志文件
        /// </summary>
        /// <param name="message"></param>
        public void writeoutput(soapmessage message)
        {
            newstream.position = 0;
            //創建或追加記錄文件
            filestream fs = new filestream(filename, filemode.append,
                fileaccess.write);
            streamwriter w = new streamwriter(fs);
            string soapstring = (message is soapservermessage) ? "soap響應" : "soap請求";
            w.writeline("-----" + soapstring + " 在 " + datetime.now.tostring("yyyy年mm月dd日 hh時mm分ss秒"));
            w.flush();
            copy(newstream, fs);
            w.close();
            newstream.position = 0;
            copy(newstream, oldstream);
        }

        public void writeinput(soapmessage message)
        {
            copy(oldstream, newstream);
            filestream fs = new filestream(filename, filemode.append,
                fileaccess.write);
            streamwriter w = new streamwriter(fs);

            string soapstring = (message is soapservermessage) ?
                 "soap請求" : "soap響應";
            w.writeline("-----" + soapstring +
                " 在 " + datetime.now.tostring("yyyy年mm月dd日 hh時mm分ss秒"));
            w.flush();
            newstream.position = 0;
            copy(newstream, fs);
            w.close();
            newstream.position = 0;
        }
        /// <summary>
        /// 拷貝流到流
        /// </summary>
        /// <param name="from"></param>
        /// <param name="to"></param>
        void copy(stream from, stream to)
        {
            textreader reader = new streamreader(from);
            textwriter writer = new streamwriter(to);
            writer.writeline(reader.readtoend());
            writer.flush();
        }
    }
    //創建一個用于在webmethod上使用的soapextension屬性
    [attributeusage(attributetargets.method)]
    public class traceextensionattribute : soapextensionattribute
    {
        private string filename = "c://log.txt";
        private int priority;
        /// <summary>
        /// 擴展類型
        /// </summary>
        public override type extensiontype
        {
            get { return typeof(traceextension); }
        }
        /// <summary>
        /// 優先級
        /// </summary>
        public override int priority
        {
            get { return priority; }
            set { priority = value; }
        }
        /// <summary>
        /// 用于記錄該webmethod的soapmessage的文件的絕對路徑
        /// 默認為c://log.txt;
        /// </summary>
        public string filename
        {
            get
            {
                return filename;
            }
            set
            {
                filename = value;
            }
        }
    }  
}

  結下來,介紹一個如何使用該類:

  如果要使讓traceextension支持第一種記錄方式,需要作的額外工作為:

  只需要在要記錄soapmessage的webmethod添加如下的attribute

  [traceextension(filename="d://data.xml",priority=0)]

  當然路徑,您可以自己設定

  前一節的webmethod就變成了

添加了針對webmethod日志記錄的webmethod
public mysoapheader header = new mysoapheader();       
        [webmethod]
        [soapheader("header")]  
        [traceextension(filename="d://data.xml",priority=0)]
        public string helloworld()
        {
            if (header == null)
            {
                return "您沒有設置soapheader,不能正常訪問此服務!";
            }
            if (header.username != "jillzhang" || header.pwd != "123456")
            {
                return "您提供的身份驗證信息有誤,不能正常訪問此服務!";
            }
            return "hello world";
        }
 
  調用下該webservice,便在d盤產生一個data.xml文件,里面的內容為:

-----soap請求 在 2007年05月25日 09時06分29秒
<?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="jillzhang123456http://tempuri.org/"><username>jillzhang</username><pwd>123456</pwd></mysoapheader></soap:header><soap:body><helloworld xmlns="http://tempuri.org/" /></soap:body></soap:envelope>
 
 
 
-----soap響應 在 2007年05月25日 09時06分29秒
<?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="hello'>http://tempuri.org/"><helloworldresult>hello world</helloworldresult></helloworldresponse></soap:body></soap:envelope>

  如何采用第二種方法,讓webservice的每個webmethod都能記錄日志

  需要在web.config中作如下的設定

  首先添加如下節點

<webservices>
        <soapextensiontypes>
          <add type="jillzhang.traceextension,jillzhang" priority="1"  group="high"  />
        </soapextensiontypes>
      </webservices>

  然后通過配置設定日志文件保留的路徑:

<appsettings>
    <add key="logroot" value="d:"/>
  </appsettings>

  找到日志文件,里面也赫然有著soapmessage的真面目。通過以上方法,大家可以清晰地分析到soapmessage的具體格式和內容,知道了這個以后,對付web service,您就可以隨心應手,隨心所欲,如果你愿意,你甚至也可以“強奸"一次webservice,哈哈!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91色视频在线观看| 久久久伊人日本| 日韩在线不卡视频| 疯狂欧美牲乱大交777| 在线日韩欧美视频| 欧美综合在线观看| 成人网在线视频| 日韩视频亚洲视频| 啊v视频在线一区二区三区| 亚洲综合小说区| 日韩中文字幕网站| 精品中文字幕乱| 国产精品高清在线| 日韩av网站在线| 午夜精品久久久久久久男人的天堂| 久久久久久久久91| 久久久久久久999精品视频| 久久久久久久久网站| 2019中文字幕在线| 2019国产精品自在线拍国产不卡| 欧美成人精品xxx| 亚洲人成在线电影| 日本亚洲欧洲色| 亚洲毛片一区二区| 一区二区三区四区视频| 日韩中文字幕免费看| 色综合伊人色综合网| 国产精品激情av电影在线观看| 5566日本婷婷色中文字幕97| 九九综合九九综合| 国产mv免费观看入口亚洲| 久久久久国产精品www| 亚洲一区www| 色综合久久天天综线观看| 欧美高清理论片| 亚洲电影在线看| 久久这里有精品视频| 国产伦精品免费视频| 国产国语videosex另类| 在线视频免费一区二区| 91在线|亚洲| 日本精品一区二区三区在线播放视频| 91九色单男在线观看| 国产精品久久视频| 一区二区欧美久久| 午夜精品免费视频| 大桥未久av一区二区三区| 亚洲人高潮女人毛茸茸| 日韩av影院在线观看| 国产日韩欧美在线| 两个人的视频www国产精品| 欧美日韩日本国产| 日本亚洲欧美成人| 欲色天天网综合久久| 日韩高清av一区二区三区| 91干在线观看| 欧美黄色片在线观看| 中文字幕免费精品一区| 国内久久久精品| 欧美最猛性xxxxx亚洲精品| 日韩大片在线观看视频| 色婷婷成人综合| 中国人与牲禽动交精品| 欧美日韩国产91| 亚洲精品一区av在线播放| 尤物yw午夜国产精品视频| 最近2019中文免费高清视频观看www99| 亚洲一区二区福利| 国产精品天天狠天天看| 久久男人av资源网站| 激情成人在线视频| 欧美视频在线观看免费网址| 另类美女黄大片| 久久精品视频在线| www.欧美精品| 久久综合久久八八| 日韩电影在线观看中文字幕| 亚洲3p在线观看| 这里精品视频免费| 国产精品美腿一区在线看| 欧美电影在线观看网站| 亚洲人成伊人成综合网久久久| 51色欧美片视频在线观看| 成人激情视频网| 精品国产一区久久久| 影音先锋欧美在线资源| 亚洲电影成人av99爱色| 在线成人中文字幕| 中文字幕在线看视频国产欧美在线看完整| 日韩美女免费线视频| 国产精品亚洲视频在线观看| 97国产真实伦对白精彩视频8| 亚洲欧洲黄色网| 国产啪精品视频| 国产精品美女久久久免费| 亚洲成人黄色在线观看| 欧美激情国产高清| 国产精品极品美女粉嫩高清在线| 国产美女91呻吟求| 欧美香蕉大胸在线视频观看| 国产一区二区三区网站| 欧美在线激情视频| 亚洲香蕉伊综合在人在线视看| 精品亚洲国产成av人片传媒| 国产黑人绿帽在线第一区| 成人精品久久av网站| 亚洲精品视频在线播放| 国产精品久久久久久久久久久不卡| 亚洲午夜女主播在线直播| 日韩电影免费观看在线观看| 韩国视频理论视频久久| 在线观看日韩视频| 97国产真实伦对白精彩视频8| 91av网站在线播放| 在线视频日韩精品| 91精品视频观看| 日韩中文在线观看| 国产精品视频久久| 中文字幕精品久久久久| 欧美国产日韩一区二区在线观看| 亚洲国产福利在线| 国产精品成久久久久三级| 亚洲精品久久久久中文字幕二区| 精品日韩视频在线观看| 久久久久久尹人网香蕉| 成人两性免费视频| 亚洲精品一区中文| 国产欧美精品一区二区三区介绍| 97视频在线观看亚洲| 中文字幕日韩电影| 亚洲图片在线综合| 国产精品你懂得| 欧美肥老太性生活视频| 欧美猛交ⅹxxx乱大交视频| 日韩国产欧美精品一区二区三区| 久久精品视频在线观看| 日韩在线视频国产| 国产精品爽黄69天堂a| 亚洲午夜av久久乱码| 91精品综合久久久久久五月天| 久久久久久久久久久成人| 51ⅴ精品国产91久久久久久| 欧美日韩在线免费观看| 欧美在线一级va免费观看| 亚洲最大福利视频网站| 欧美成人激情视频免费观看| 久久久精品国产亚洲| 亚洲一区二区三区xxx视频| 日韩视频免费在线| 国产精品免费网站| 韩国福利视频一区| 亚洲人成电影网站色…| 中文字幕视频一区二区在线有码| 亚洲午夜av电影| 国产精品美女久久| 精品色蜜蜜精品视频在线观看| 国产精品亚洲аv天堂网| 亚洲精品国产精品久久清纯直播| 亚洲欧美国产视频| 欧美久久久精品| 亚洲男人天天操| 久久久免费在线观看| 欧美精品电影免费在线观看| 国产一区二区三区免费视频|