乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      關(guān)于web應(yīng)用程序安全的思考(一) - net點(diǎn)滴 - 博客園

       xnet 2006-12-28

      關(guān)于web應(yīng)用程序安全的思考(序)中我曾提到﹕web應(yīng)用程序的安全不應(yīng)該依賴于客戶端的請(qǐng)求信息。

      眾所周知﹐http協(xié)議是開放的﹐因此誰(shuí)都能向網(wǎng)絡(luò)上公開的web服務(wù)器發(fā)送request請(qǐng)求﹐要求一個(gè)URL(Uniform Resource Locator 統(tǒng)一資源定位符)。

      所謂request﹐不過(guò)是符合http協(xié)議(即遵守http請(qǐng)求語(yǔ)法)的一大段字符串而已﹕

      下面是一個(gè)aspx的請(qǐng)求示例﹕

      GET /FrameWorkService/TestRequest.aspx HTTP/1.1
      Connection: Keep
      -Alive
      Accept: 
      */*
      Accept
      -Encoding: gzip, deflate
      Accept
      -Language: zh-tw
      Host: localhost
      User
      -Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)
      UA
      -CPU: x86

       

       

      下面是一個(gè)web service的請(qǐng)求示例﹕

      POST /testwssecurity/service2.asmx HTTP/1.1
      Content
      -Length: 288
      Content
      -Type: text/xml; charset=utf-8
      Expect: 
      100-continue
      Host: localhost
      User
      -Agent: Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 2.0.50727.42)
      SOAPAction: 
      "http:///HelloWorld"

      <?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas./soap/envelope/" xmlns:xsi="http://www./2001/XMLSchema-instance" xmlns:xsd="http://www./2001/XMLSchema"><soap:Body><HelloWorld xmlns="http:///" /></soap:Body></soap:Envelope>

       

      相信大家基本上能理解上述字符串的意義。這表明我們只要組織類似的字符串﹐然后發(fā)往相應(yīng)的web服務(wù)器﹐就可以請(qǐng)求到某個(gè)URL了﹐也就是說(shuō)web請(qǐng)求不依賴瀏覽器(其實(shí)web也不依賴服務(wù)器﹐它只依賴http協(xié)議)。

      下面的這個(gè)程序是C#寫的通過(guò)socket直接向web服務(wù)器發(fā)送http請(qǐng)求的示例﹕

       

       1using System;
       2using System.Text;
       3using System.IO;
       4using System.Net;
       5using System.Net.Sockets;
       6
       7public class server
       8{
       9    //建立socket連接
      10    private static Socket ConnectSocket(string server, int port)
      11    {
      12        Socket s = null;
      13        IPHostEntry hostEntry = null;
      14        hostEntry = Dns.GetHostEntry(server);
      15        foreach (IPAddress address in hostEntry.AddressList)
      16        {
      17            IPEndPoint ipe = new IPEndPoint(address, port);
      18            Socket tempSocket =
      19                new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
      20            tempSocket.Connect(ipe);
      21            if (tempSocket.Connected)
      22            {
      23                s = tempSocket;
      24                break;
      25            }

      26            else
      27            {
      28                continue;
      29            }

      30        }

      31        Console.WriteLine(s==null?"":"連接建立成功﹗");
      32        return s;
      33    }

      34
      35    //發(fā)送request請(qǐng)求并返回響應(yīng)字串
      36    private static string SocketSendReceive(string request,string server, int port)
      37    {
      38        Byte[] bytesSent = Encoding.ASCII.GetBytes(request);
      39        Byte[] bytesReceived = new Byte[256];
      40        Socket s = ConnectSocket(server, port);
      41        if (s == null)
      42            return ("連接失敗﹗");
      43        Console.WriteLine("正在發(fā)送請(qǐng)求");
      44        s.Send(bytesSent, bytesSent.Length, 0);
      45        int bytes = 0;
      46        StringBuilder responsestr = new StringBuilder();
      47        Console.WriteLine("正在接收web服務(wù)器的回應(yīng)");
      48        do
      49        {
      50            bytes = s.Receive(bytesReceived, bytesReceived.Length, 0);
      51            responsestr.Append(Encoding.UTF8.GetString(bytesReceived, 0, bytes));
      52        }

      53        while (bytes > 0);
      54        return responsestr.ToString();
      55    }

      56    
      57    //獲取Request請(qǐng)求字符串
      58    private static string getRequestStr()
      59    {
      60        StringBuilder sb = new StringBuilder();
      61        sb.Append("GET /FrameWorkService/TestRequest.aspx?name=zkw&age=24 HTTP/1.1\r\n");
      62        sb.Append("Host: localhost\r\n");
      63        sb.Append("Accept: */*\r\n");
      64        sb.Append("Accept-Encoding: gzip, deflate\r\n");
      65        sb.Append("Accept-Language: zh-tw\r\n");
      66        sb.Append("User-Agent: Mozilla/8.0 (compatible; MSIE 7.0; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)\r\n");
      67        sb.Append("UA-CPU: x86\r\n");
      68        sb.Append("Cookie: ASP.NET_SessionId=g5vz3k55q4dhgy3dvmm3dj4x\r\n");
      69        sb.Append("Connection: Close\r\n\r\n");
      70        return sb.ToString();
      71    }

      72
      73    public static void Main(string[] args)
      74    {
      75        string requeststr = getRequestStr();
      76        Console.WriteLine("請(qǐng)求字串如下﹕\n{0}",requeststr);
      77        string result = SocketSendReceive(requeststr,"localhost",80);
      78        Console.WriteLine(result);
      79        Console.ReadLine();
      80    }

      81}

       

       相關(guān)的aspx.cs程序如下﹕

      using System;
      using System.Data;
      using System.Configuration;
      using System.Collections;
      using System.Web;
      using System.Web.Security;
      using System.Web.UI;
      using System.Web.UI.WebControls;
      using System.Web.UI.WebControls.WebParts;
      using System.Web.UI.HtmlControls;
      using System.IO;

      public partial class TestRequest : System.Web.UI.Page
      {
          
      protected void Page_Load(object sender, EventArgs e)
          
      {
              Request.SaveAs(
      "c:/test.txt",true);
              
      using(StreamReader sr = new StreamReader("c:/test.txt"))
              
      {
                  tt_request.Value 
      = (sr.ReadToEnd());
              }

              
      foreach (string key in Request.QueryString.AllKeys)
                  div_querystring.Value 
      += string.Format("{0}:{1}\r\n", key, Request[key]);
              
      if (Session["firsttime"== null)
              
      {
                  Session[
      "firsttime"= DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");
                  Response.Write(
      "<b style=‘color:red‘>first request</b></br>");
              }

              Response.Write(
      "First Time:" + Session["firsttime"].ToString());
          }

      }

      aspx頁(yè)面:

      <%@ Page Language="C#" AutoEventWireup="true" CodeFile="TestRequest.aspx.cs" Inherits="TestRequest" %>
      <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www./TR/xhtml1/DTD/xhtml1-transitional.dtd">
      <html xmlns="http://www./1999/xhtml" >
      <head runat="server">
          
      <title>請(qǐng)求字串提取示例</title>
      </head>
      <body>
      這是Request字符串﹕
      <br />
      <textarea style="width:100%;height:200px" id="tt_request" runat="server">
      </textarea> 
      以下是程式直接提取的參數(shù)﹕
      <br />
      <textarea id="div_querystring" runat="server" style="width:100%;height:100px">

      </textarea>
      </body>
      </html>

       

      由上可知﹐web服務(wù)器對(duì)于請(qǐng)求方的識(shí)別能力是很低的。因此作為web應(yīng)用程序安全管控的唯一依據(jù)就只能是request的url了﹐因?yàn)橹挥兴攀钦鎸?shí)的﹐而我們進(jìn)行安全管控的最終目的也就是

      判斷這個(gè)請(qǐng)求方是否擁有這個(gè)url的權(quán)限(即授權(quán))

      這就是我抽象出來(lái)的web安全管控的本質(zhì)﹐依據(jù)這點(diǎn)﹐我們就可以把web安全管控和業(yè)務(wù)系統(tǒng)進(jìn)行解耦。即在request到達(dá)其請(qǐng)求的url之前﹐先對(duì)這個(gè)url和請(qǐng)求方進(jìn)行權(quán)限驗(yàn)證﹐如果通過(guò)﹐我們就放它過(guò)去﹐什么都不做﹐如果不通過(guò)﹐我們就可以向客戶端發(fā)送相關(guān)的拒絕信息﹐并不讓web服務(wù)器真正執(zhí)行到那個(gè)url﹐完成安全管控。

       web安全管控中﹐授權(quán)的除了要識(shí)別授權(quán)的客體(URL)之外﹐我們還必須識(shí)別授權(quán)的主體﹐即請(qǐng)求方的認(rèn)定﹐也就是常說(shuō)的認(rèn)證機(jī)制。

       由于http協(xié)議無(wú)狀態(tài)的特點(diǎn)﹐每次request時(shí)﹐web服務(wù)器都無(wú)法識(shí)別這個(gè)請(qǐng)求是否和上次的請(qǐng)求是否相同。因此認(rèn)證機(jī)制在某種程度上來(lái)說(shuō)其實(shí)相當(dāng)困難。

      曾經(jīng)遇到過(guò)通過(guò)IP來(lái)認(rèn)證的﹐先不說(shuō)這種機(jī)制對(duì)于web可以anywhere訪問(wèn)是一種倒退﹐單是那種IP更改﹐欺騙或通過(guò)Proxy訪問(wèn)就無(wú)法適用了。

      現(xiàn)在最多的做法還是通過(guò)cookiesession來(lái)完成的。

      不過(guò)最好還是清楚一下cookiesession的原理﹕

      Cookiecookie其實(shí)也是http request header的一部分﹐我們可以把任何值當(dāng)作cookie發(fā)給web服務(wù)器。

      至于Session,不知道大家有沒(méi)有看過(guò).netsession實(shí)現(xiàn)機(jī)制﹐每次請(qǐng)求后﹐.net會(huì)寫入一個(gè)session_idcookie到客戶端﹐這樣在下次客戶再請(qǐng)求時(shí)﹐提取這個(gè)cookie來(lái)識(shí)別。剩下的就和cookie一樣了。


      大家可以看一下我上面這個(gè)例子﹐在那支request請(qǐng)求的程式中加入相關(guān)的session_id的cookie﹐你會(huì)發(fā)現(xiàn)程式是無(wú)法識(shí)別是不是真正的session的 

      曾經(jīng)有人設(shè)計(jì)過(guò)這樣一個(gè)系統(tǒng)﹐要我嘗試攻入其中某個(gè)已管控的頁(yè)面中。

      它是這樣做的﹐在每個(gè)要權(quán)限的aspx頁(yè)面的page_load中判斷Session["userid"]是否為null,如果不是﹐則轉(zhuǎn)向登錄頁(yè)面。

       

      在我截獲了網(wǎng)絡(luò)上某個(gè)已登錄用戶和web服務(wù)器通訊的requestresponse之后﹐提取其cookie信息﹐交將它放入我的request請(qǐng)求中﹐我就以那個(gè)登錄用戶的身份執(zhí)行了那支程序了。

       

      但是這并不是說(shuō)就不能使用cookiesession來(lái)作為認(rèn)證的機(jī)制﹐我的意思是﹐web應(yīng)用程序的安全也是相對(duì)的﹐必須建立在基本的網(wǎng)絡(luò)安全和用戶安全防范意識(shí)之上??梢圆扇“用軙?huì)關(guān)鍵頁(yè)面(如登錄頁(yè)面)的會(huì)話(例如使用https)或要求用戶每次使用完系統(tǒng)后注銷或關(guān)閉瀏覽器﹐以及盡可能多的對(duì)cookiesession做更多驗(yàn)證等。

       

      在認(rèn)證和授權(quán)的原理講完后﹐要在asp.net應(yīng)用程序中要完成上述的安全管控其實(shí)非常簡(jiǎn)單﹐設(shè)計(jì)一個(gè)httpmodule﹐然后捕獲相關(guān)的事件﹐在這個(gè)事件中進(jìn)行權(quán)限判斷即可。

      下面是一些框架代碼﹕

       1    /// <summary>
       2    /// 使用HttpModule模組進(jìn)行web權(quán)限管控
       3    /// </summary>
       4    /// <remarks>
       5    /// 自定義一個(gè)HttpModule﹐并在AuthorizeRequest事件中完成授權(quán)動(dòng)作
       6    /// </remarks>

       7    public class WebSecurityModule:IHttpModule
       8    {
       9
      10
      11
      12        /// <summary>
      13        /// 在AuthorizeRequest事件中,進(jìn)行驗(yàn)証和授權(quán)
      14        /// </summary>
      15        /// <param name="context"></param>

      16        public void Init(HttpApplication context)
      17        {
      18context.AuthorizeRequest  += new EventHandler(OnAuthorize);
      19        }

      20            
      21        /// <summary>
      22        /// 調(diào)用PFSAuthorize類進(jìn)行授權(quán)
      23        /// </summary>
      24        /// <param name="sender"></param>
      25        /// <param name="e"></param>
      26        /// <remarks>主要是看當(dāng)前用戶(包括匿名用戶)是否擁有當(dāng)前Request的url的權(quán)限</remarks>

      27        public void OnAuthorize(Object sender,EventArgs e)
      28        {
      29           //認(rèn)証﹕提取用戶ID
      30            string userid = getuserid();
      31           //授權(quán)﹕判斷用戶ID是否有URL的權(quán)限
      32              bool hasright = authroize(userid,HttpContext.Current.Request.Url);
      33            if (!hasright)
      34            {
      35                //進(jìn)行無(wú)權(quán)信息返回
      36                  //如轉(zhuǎn)向無(wú)權(quán)登錄頁(yè)面
      37                  Response.Redirect("error.aspx");
      38            }

      39        }

      40    }

      最后我們只要將這個(gè)類封裝成一個(gè)單獨(dú)的DLL﹐然后在每個(gè)web.config的httpmodules節(jié)中配置即完成了安全管控

      后面的文章我會(huì)講如何設(shè)計(jì)這些模塊達(dá)到最好擴(kuò)展性

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多