国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

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

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

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

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

下面是一個(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://tempuri.org/HelloWorld"

<?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><HelloWorld xmlns="http://tempuri.org/" /></soap:Body></soap:Envelope>

 

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

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

 

 1
using System;
 2
using System.Text;
 3
using System.IO;
 4
using System.Net;
 5
using System.Net.Sockets;
 6

 7
public 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頁面:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="TestRequest.aspx.cs" Inherits="TestRequest" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/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))

這就是我抽象出來的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)證﹐如果通過﹐我們就放它過去﹐什么都不做﹐如果不通過﹐我們就可以向客戶端發(fā)送相關(guān)的拒絕信息﹐并不讓web服務(wù)器真正執(zhí)行到那個(gè)url﹐完成安全管控。

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

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

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

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

不過最好還是清楚一下cookiesession的原理﹕

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

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


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

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

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

 

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

 

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

 

在認(rèn)證和授權(quán)的原理講完后﹐要在asp.net應(yīng)用程序中要完成上述的安全管控其實(shí)非常簡單﹐設(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
        
{
18
context.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)行無權(quán)信息返回
36
                  
//如轉(zhuǎn)向無權(quán)登錄頁面
37
                  Response.Redirect("error.aspx");
38
            }

39
        }

40
    }

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

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

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
JAVA版微信支付V3-完全版
session功能實(shí)現(xiàn)原理
ASP.NET 窗體間傳值實(shí)現(xiàn)方法詳解
Windows Phone 7下一個(gè)上傳圖片的類_銀光中國 Silverlight 資源 ...
J2ME編程最佳實(shí)踐之聯(lián)網(wǎng)開發(fā)[組圖]
Java Servlet API說明文檔(2.1a版)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服