Visual Studio 2010穩定度不佳

一個全新的產品,讓人期待,也讓人受傷。由Visual Studio 2008改使用Visual Studio 2010已已經一段時間,整體而言,使用Visual Studio 2010開發是開心的,但近來常常寫Code寫到一半,Visual Studio 2010就會發現Crash,只是簡單打幾行程式就會Crash,然後自動重新啟動,這樣的感覺很不好,重點是剛才所打的Code有時還會不見了。



只能等Service Pack 1出來時,可否大大改進穩定度問題。想念Visual Studio 2008,用了許久也沒有Crash過!

我的物件導向學習史

我最早接觸的是Dos裡的Basic,在那個時代是個有個「黑白畫面」就讓人興奮的事了,一開始學程式都是叫你寫九九乘法表、排出各種圖型的星星(*)…等,到後來Windows 95與OS/2大戰,第一次接觸到Visual Basic 6…好多有趣的歷史,但今天我想聊聊一些程式方面的東西。

1. Copy & Paste

在我剛學程式時,最常使用的方法,就是將會重覆使用的程式片斷,Copy然後Paste,最是簡單也是最有效率的方法,但時間一久,就會發現問題!如果這段程式需要修改,那你必須將有所有使用此段程式的檔案找出來,然後全部修改,當時我最常用的工具是UltraEdit,它在多檔案搜尋及取代實在好用,不過這實在不是個好方法。

2. 副程式

後來學到了副程式,我們將上述程式獨立出來,使用Sub或Function來撰寫,然後整個在一個檔案裡,需要的程式在引用使用即可,當程式需要修改時,我們也只需要修改此檔案裡的Sub或Function即可,引用使用的程式都不必修改,馬上套用修改後的Sub或Function,終於有比較像樣的架構出現。

3. 模組

後來我們發現,這個副程式檔案裡有些副程式實在好用,想要給其他開發系統也能使用,所以就有人開始將類似的副程式整理集合起來,分門別類,儲存在檔案裡,這就是模組(Module)的概念。在使用Visual Basic 6時代,網路上開始出現很多免費的模組,也有很多公司在賣模組,也就是我自可以買現成人家寫好的模組在Visual Basic 6來使用,來加速程式的開發。

4. 類別

模組真的是一大突破,在Visual Basic 6使用起來真的很高興,但模組還是有些問題,而且Visual Basic 6一直被罵,說Visual Basic 6根本不是物件導向的程式設計語言。什麼是物件導向?記得第一次上物件導向的課,是使用C++,聽的一個頭兩個大,而且就算你想要學物件導向,世面上清一色都是C及Java的教材,Visual Basic…根本沒有。到了多年之後,VB進步到VB.NET,在VB.NET中才終於引進了「OOP」的關念。在VB.NET我才開始關接觸到OOP。

看一看,我的學習史與程式進步史兩者還差得不遠,不過現在可以說是軟體爆炸的時代,推陳出新的速度快的不行,要好好加油才是。

參考:
Module與Class的差別??

駭客級測試工具--hping

今天來為大家介紹一個駭客級的測試工具「hping」。

聽到「駭客」不知道各位有沒有很高興,其實在資訊領域很利害的電腦高手我們稱為「駭客, Hacker」,但這些高手中有些人走上歧途,把這些可能是高深也可能不是高深的技術,使用在不正當的用途上,我們稱之「怪客, Cracker」。

就像正邪大戰一般,我們當然希望邪不能勝正,但在邪惡的一方發動攻擊之前,正義的一方是否能先做好充足的防禦,是重要的關鍵。那我要如何知道是否有良好的防禦工程呢?請東邪、西毒先來攻打一番嗎?當然不是!通常我們會先自我測試一番,如果連自我測試通無法通過,那還談什麼防禦,你說是不是。

如果你有一點網路基礎,那你一定使用過Windows系統下的ping指令,例如「開始 --> 執行 --> 鍵入:cmd --> 會跳出一個黑色命令視窗 --> 輸入:ping 168.95.1.1」這是一個在測試網路狀態的指令。或是當你電腦的網路不通時,是否有人就會說,你有沒有ping ping看?而Windows內建的ping真的是太陽春了,只合適簡單測試網路是否正常連線。

但我們需要的是一個能「模擬攻擊」的測試工具,而hping正是一個在Unix/Linux下的測試用的攻擊工具(也有Windows版本,我們下一部份會談),在開始介紹前,記得一件事,網路上的每一個工具,是毒也是藥,就如我介紹這個hping工具,你可以拿它來當駭客,也可以拿它來當怪客。

hping安裝


目前hping有hping2、hping3及hping.win32三個版本,Linux我們介紹hping3,hping.win32我們下一部份介紹。

實作Linux系統:CentOS 5

# tar zxvf hping3-20051105.tar.gz
# cd hping3-20051105
# cat INSTALL (請詳細觀看)
# ./configure
# make
# make install

下面是一些常用的方法

hping www.abc.net.tw -1 -i u100000 -a 100.100.100.100
每秒送10個(-i u10000)ICMP(-1)封包到www.abc.net.tw 偽造來源IP(-a)為100.100.100.100

註:-1為數字非英文

hping www.abc.net.tw –i u1000000 –a 100.100.100.100 –s 22222 –p 44444
每秒送1個(-i u1000000)TCP(default)封包到www.abc.net.tw的port 44444,偽造來源IP(-a)100.100.100.100使用的port為22222




測試1: SYN Flooding(每秒10個封包)
hping 目標主機IP –i u100000 –S –a 偽造來源IP

測試2 :偽造IP的ICMP封包(每秒10個封包)
hping 目標主機IP –i u100000 –1 –a 偽造來源IP
註:-1為數字非英文

測試3:不正常TCP Flag組合封包(每秒10個封包)
(a)SYN+FIN
hping 目標主機IP –i u100000 –S –F –a 偽造來源IP
(b)X’mas
hping 目標主機IP –i u100000 –F –S –R –P –A –U –a 偽造來源IP

測試4:偽造IP的UDP封包
hping目標主機IP –i u100000 –2 –a 偽造來源IP

測試5:偽造IP內含CodeRed封包
hping 目標主機IP –i u100000 –d [封包datasize] –E [filename] –a [偽造來源IP]

如果參數使用方面有任何問題,請參考man hping或是線上hping man page。最後,希望「你」的系統可以平安通過「你」的測試。

透過資料庫上傳下載檔案

在ASP時候,寫個上傳檔案都很麻煩,因為ASP本身沒有支援上傳的物件,必須使用第三方物件來進行上傳功能的實作,到了ASP.NET上傳實在很簡單,拉個FileUpload物件,寫簡單的幾行程式,馬上可以有上傳功能。

有了上傳,那下載呢?

下載就很笨,通常是網頁帶「Link」的方式,例如:「http://localhost/files/KKBruce.zip」這樣的方式來讓人下載。好一點的架個FTP,但還是寫個管理Link資料庫及程式,例如:「http://localhost/files/download.asp?id=1」取出「ftp://localhost/files/bruce/blog.zip」來讓使用者下載。久而久之,檔案一多還是不好管理,又要管檔案,又要管理Link!

所以想就使用「資料庫」來管理,這裡指的資料庫不是那種管理「路徑」的Table,而且將檔案整個存到Table裡,需要時再取出來使用,以下我們就來實作上傳檔案至資料庫,由資料庫取出檔案下載兩部份。

****** Object:  Table [dbo].[Files]    Script Date: 08/26/2010 17:12:17 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[Files](
 [uid] [int] IDENTITY(1,1) NOT NULL,
 [Name] [nvarchar](50) NOT NULL,
 [Body] [varbinary](max) NOT NULL,
 [Size] [decimal](18, 0) NOT NULL,
 [SaveDateTime] [datetime] NOT NULL,
 [LastUseDateTime] [datetime] NULL
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

我們先建一個資料表,裡面最重要的是「Body」,Body就是要儲存檔案的地方,而一般網路資料或書籍資料都是使用「Image資料類型」,但查看MSDN後發現,如果你是使用SQL Server 2005以後的版本,請改使用請改用 nvarchar(max)、varchar(max) 和 varbinary(max)

在未來的 Microsoft SQL Server 版本中,將移除 ntext、text 和 image 等資料類型。請避免在新的開發工作中使用這些資料類型,並規劃修改目前在使用這些資料類型的應用程式。請改用 nvarchar(max)、varchar(max) 和 varbinary(max)。

以上是要注意的地方。

接下來我們來實作上傳檔案到資料庫,然後再從資料庫下載檔案。

新增Default.aspx在UI部份:

<div>
        <asp:FileUpload ID="FU" runat="server" />
     
        <asp:Button ID="SaveFile" runat="server" Text="上傳" />
        <br />
        <br />
        編號:<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
 <asp:Button ID="DownFile" runat="server" Text="下載" />
    </div>

我們針對SaveFile及DownFile來撰寫程式碼:

SaveFile事件:
Protected Sub SaveFile_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles SaveFile.Click
        ' 先確認有選擇檔案
        If Not FU.HasFile Then
            Response.Write("沒有上傳的檔案!")
            Response.End()
        End If

        ' 檔案存進資料庫都是「二進位」,所以使用Byte
        ' buf陣列依檔案大小來建立
        ' 陣列由0開始,所以減1
        Dim buf(Me.FU.PostedFile.ContentLength - 1) As Byte
        Me.FU.PostedFile.InputStream.Read(buf, 0, Me.FU.PostedFile.ContentLength)

        Dim conn As New SqlConnection(WebConfigurationManager.ConnectionStrings("SCS").ConnectionString)

        ' 將參考及欄位對應起來
        Dim cmd As New SqlCommand("INSERT INTO Files(Name,Body,Size,SaveDateTime) VALUES (@filename,@body,@size, @sdt);", conn)
        cmd.Parameters.AddWithValue("@filename", FU.PostedFile.FileName)
        ' 將二進位檔放入資料庫中
        cmd.Parameters.AddWithValue("@body", buf)
        cmd.Parameters.AddWithValue("@size", FU.PostedFile.ContentLength.ToString)
        cmd.Parameters.AddWithValue("@sdt", Now)

        Try
            Dim rs As Integer
            conn.Open()
            rs = cmd.ExecuteNonQuery
            Response.Write("新增成功")
        Catch ex As Exception
            Response.Write(ex)
        Finally
            cmd.Cancel()
            cmd.Dispose()
            conn.Close()
        End Try
    End Sub

DownFile事件:
Protected Sub DownFile_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles DownFile.Click
        ' 由輸入
        Dim id As Integer

        If String.IsNullOrEmpty(Me.TextBox1.Text) Then
            Response.Write("請輸入下載ID編號")
            Response.End()
        Else
            id = Me.TextBox1.Text
        End If

        Dim conn As New SqlConnection(WebConfigurationManager.ConnectionStrings("SCS").ConnectionString)
        Dim cmd As New SqlCommand("Select * from Files Where uid = @id", conn)
        cmd.Parameters.AddWithValue("@id", id)

        Dim dr As SqlDataReader

        Try
            conn.Open()
            dr = cmd.ExecuteReader
            ' 將資料取出,輸出
            If dr.Read Then
                Response.ClearHeaders()
                Response.Clear()
                Response.Expires = 0
                Response.Buffer = True

                ' Getxxx效能較佳
                Dim Name As String = dr.GetString(1)
                ' 進行AddHeader設定
                Response.AddHeader("Accept-Language", "zh-tw")
                ' 設定輸出檔案及類型
                Response.AddHeader("content-disposition", "attachment; filename=" & Chr(34) & Name & Chr(34))
                Response.ContentType = "Application/octet-stream"
                ' 進行「二進位」輸出,使用BinaryWrite方法
                Response.BinaryWrite(dr("Body"))
                ' 將緩衝輸出
                Response.Flush()
                Response.Close()
                ' 請參考討論,不要使用Response.End()
                ' http://www.blueshop.com.tw/board/FUM20041006161839LRJ/BRD20100824142739D3F.html
                'Response.End()
            End If
            Response.End()
        Catch ex As Exception
            Response.Write(ex)
        Finally
            cmd.Cancel()
            cmd.Dispose()
            conn.Close()
        End Try
    End Sub

其實不難:
  1. 將檔案轉為Byte,然後存進資料庫的二進位欄位;
  2. 取出資料,進行二進位輸出。
不管是Excel、Word、MP3、Text、ZIP…反正只要是檔案都可以上傳及下載。以上還有很多可以改進的地方,例如統計的部份,或使用其他方式(Session…)來取得下載檔案。

參考:

Visual Studio 2010 新發現(7)--反白顯示

反白顯示
當我們點選某個關鍵字時,Visual Studio 2010會馬上幫我們「反白顯示」所有相同的物件,例如上圖的ds,這樣可以很清楚的知道,我的ds物件用在什麼地方。

另外我們還可以使用組合鍵:「Ctrl + Shift + 上或下鍵」來移至上一個或下一個反白顯示的物件。