2014年5月16日 星期五

SQL injection

http://en.wikipedia.org/wiki/SQL_injection

資料來源:
http://ithelp.ithome.com.tw/question/10080209

解決方法:使用 SqlCommand.Parameters 屬性
http://msdn.microsoft.com/zh-tw/library/system.data.sqlclient.sqlcommand.parameters.aspx

回到之前重構系列的第一篇文章:[如何提升系統品質-Day2]重構– UI, Business logic, Data access概念分開,以這篇文章的例子來說明,不好的設計,SQL injection會怎麼發生。

畫面


需求
當輸入的帳號密碼,在資料庫中有吻合的資料,代表帳號密碼是對的。(再強調一次,一般設計驗證密碼的部分,應該是透過畫面上輸入密碼的值進行hash,再與資料庫中該帳號所對應hash完的密碼比對,以保障密碼不是以明文存在於資料庫中,確保密碼無法被還原)

直覺設計且造成SQL injection問題的程式碼
  1. protected void Verify_Click(object sender, EventArgs e)  
  2. {  
  3.     string connectionString = @"myConnectionString";  
  4.     int count;  
  5.     using (SqlConnection cn = new SqlConnection(connectionString))  
  6.     {  
  7.         cn.Open();  
  8.         string sqlStatement = @"Select Count(1) From SomeTable Where ID= '" + this.Id.Text + "' AND Password= '" + this.Password.Text + "'";  
  9.         SqlCommand sqlCommand = new SqlCommand(sqlStatement, cn);  
  10.         count = (int)sqlCommand.ExecuteScalar();  
  11.     }  
  12.   
  13.     this.Result.Text = (count > 0) ? "Pass" : "帳號或密碼錯誤";  
  14. }  


這樣的程式碼會有什麼問題? 問題可大了! 假設我是壞人,知道或猜測這功能的SQL是這樣串的(大部分功能都很好猜的,猜錯了也不會被咬),那麼我只要在畫面上的Id,隨便輸入個值,接著在密碼的部分,輸入' OR 1=1; --

這時候,這一支聰明的功能就可以把完整的SQL statement組出來,變成Select Count(1) From SomeTable Where ID= '隨便輸入' AND Password ='' OR 1=1; -- 

輸入這樣的值代表什麼,代表所有畫面上的輸入值都無所謂,因為1=1恆等式一定會成立,且前面的condition為OR,所以可以把前面的where condition都忽略掉。後面再補上個分號,代表這一個SQL子句已經結束,最後再補上--,代表後面的sql為註解。

就這樣,最基本的SQL injection就成功了。是的,這個網站在裸奔了。

如果你以為,只有登入頁面會存在這樣的問題,或是這樣的問題影響不大,那就大錯特錯了。通常會寫出這樣程式的人,如果又都是自己設計,那洞就不只一個。首先,DB的存取帳號,可能就是預設的sa或admin,也就是權限開到最大。這時候的SQL injection要進DB做事,就跟進自己家廚房一樣,例如:
Select Count(1) From SomeTable Where ID= '隨便輸入' AND Password ='' OR 1=1; DROP DATABASE pubs -- 
恭喜你,你DB中的pubs這個DataBase就被Drop掉了。

駭客高興的話,也可以針對sysobjects跟syscolumns來瞭解你DB中有哪些table, 欄位,再比對一下網頁的資料,接著透過Update的語法,把相關的欄位資料加入一些html tag或惡意的程式碼,進而引發從SQL injection觸發的Cross-site Scripting(XSS攻擊),常見的結果就是連到那一頁時,可能被導到別頁,或是XX政府網站上被掛上特殊的國旗,再來就是莫名其妙的個資外洩。

這些情況充斥在我們的生活中,這一切的原罪,都是因為程式設計師的偷懶或不專業。

除了上述的例子,還可以怎麼瞭解SQL的組成?以ASP.NET來說,一樣,通常會寫出那樣有問題的程式,web.config可能也沒有設定custom error頁面,所以當程式出錯時,IIS就大剌剌的幫你把程式錯誤的資訊show在網頁上(就是黃頁的那個),要讓錯誤資訊是掛在SQL statement執行錯誤,是一件再簡單不過的事。所以,要瞭解該網頁的輸入和對應SQL的組成,根本不需要駭客等級就可以做。瞭解之後,要啟動SQL injection,也就只是易如反掌的事。

如何避免SQL injection
簡單的說,過濾輸入值。

但,攻擊手法相當多種,要過濾的字元組合可能一個都漏不得,所以自己設定黑名單來進行過濾,是一件非不得以才做的事。如果是用ASP.NET寫,那所有人的強烈建議,就是使用Parameters

Parameter的用法相當簡單,這也是為什麼我前面會說,寫出SQL injection問題的程式碼,是一種偷懶的行為。
  1. protected void Verify_Click(object sender, EventArgs e)  
  2. {  
  3.     string connectionString = @"myConnectionString";  
  4.     var id = this.Id.Text;  
  5.     var password = this.Password.Text;  
  6.   
  7.     int count;  
  8.     using (SqlConnection cn = new SqlConnection(connectionString))  
  9.     {  
  10.         cn.Open();  
  11.         string sqlStatement = @"Select Count(1) From SomeTable Where ID= @id AND Password= @password";  
  12.         SqlCommand sqlCommand = new SqlCommand(sqlStatement, cn);  
  13.           
  14.         ////定義parameter型別  
  15.         sqlCommand.Parameters.Add("@id", SqlDbType.VarBinary);  
  16.         sqlCommand.Parameters["@id"].Value = id;  
  17.           
  18.         ////讓ADO.NET自行判斷型別轉換  
  19.         sqlCommand.Parameters.AddWithValue("@password", password);  
  20.   
  21.         count = (int)sqlCommand.ExecuteScalar();  
  22.     }  
  23.   
  24.     this.Result.Text = (count > 0) ? "Pass" : "帳號或密碼錯誤";  
  25. }  


透過使用parameter,在SqlCommand執行時,會自動過濾掉可能造成問題的字元,並拋出對應的。

另外,SQL injection並不只會發生在where condition,也有可能發生在Order by等語法中。所以只要是畫面上可能被改變的值,要串到SQL語法中,就應該使用parameter。

結論
在patterns & practices Developer Center簡單歸納出三個步驟防止SQL injection:
Step 1. Constrain input.
Step 2. Use parameters with stored procedures.
Step 3. Use parameters with dynamic SQL.

另外的補充:
1.web.config的custom error要記得打開,避免讓『使用者』看到詳細的錯誤訊息
2.權限這種東西,都是能開越小越好,包括資料庫。
3.所謂畫面可能被改變的值,可能包括了Url上的QueryString,post過來的表單資料,甚至於cookie內容假造。

----------------------------------------------------------------------------------------

sql = select * from table where user = @user
Command.Parameters.Add("@user",SqlDbType.nvarchar,100).Value = user.Text


'**** 重 點!*************************************************
'**** DataReader 改用 SqlCommand的 @參數來作
Dim cmd As New SqlCommand("select * from test where id = @id", Conn)

cmd.Parameters.Add("@id", SqlDbType.Int)
cmd.Parameters("@id").Value = CType(Request("id"), Integer)

'== 參考網址  http://msdn.microsoft.com/zh-tw/library/system.data.sqlclient.sqlcommand.parameters.aspx
'************************************************************
整理

SQL Injection (資料隱碼)– 駭客的 SQL填空遊戲(上)
http://www.microsoft.com/taiwan/sql/sql_injection_g1.htm
SQL Injection (資料隱碼)– 駭客的 SQL填空遊戲(下)
http://www.microsoft.com/taiwan/sql/SQL_Injection_G2.htm
此外有些部落客在過去也都寫過很多好文,也可以參考參考
像是黑暗大寫過的
游擊式的SQL Injection攻擊
blog.darkthread.net/post-2008-05-22-hit-and-run-sql-injection-attack.aspx
或是91大寫過的 


2014年5月14日 星期三

如何在Blogger中顯示程式碼


1.點選版面配置,點選"新增小工具"新增"HTML/JavaScript"

2.將以下內容貼上
<style>
.post .codeblock{
display: block; /* fixes a strange ie margin bug */
font-family: Courier New;
font-size: 10pt;
overflow:auto;
background: #f0f0f0 url(data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAASwCAYAAAAt7rCDAAAABHNCSVQICAgIfAhkiAAAAQJJREFUeJzt0kEKhDAMBdA4zFmbM+W0upqFOhXrDILwsimFR5pfMrXW5jhZr7PwRlxVX8//jNHrGhExjXzdu9c5IiIz+7iqVmB7Hwp4OMa2nhhwN/PRGEMBh3Zjt6KfpzPztxW9MSAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzB8HS+J9kUTvzEDMwAAAABJRU5ErkJggg==) left top repeat-y;
border: 1px solid #ccc;
padding: 10px 10px 10px 21px;
max-height:1000px;
line-height: 1.2em;
}
</style>


3.使用方式
將這段程式<div class='codeblock'>class 教學</div>放入HTML的編輯中

顯示效果:

class 教學

4.程式碼如果包含大於(>)、小於(<)標籤字元,先利用 HTML Encoder 網頁直接在線上轉換。

參考資料:
http://turtleharvey.blogspot.tw/2013/12/bloggercode.html
http://www.ewdna.com/2012/02/css-block.html

2014年5月13日 星期二

[轉貼] 破除檸檬水5迷思 喝的養生又安心

檸檬雖含有豐富的維生素、纖維素、抗氧化物等,但經由《優活》追蹤後發現,大家對於檸檬似乎存在些疑慮,因此,以下列出五迷思,讓想要喝檸檬水養生的民眾,也能安心喝!
 
迷思一/與海鮮、胡蘿蔔同食,易造成腸胃不適?
 
醫師表示,檸檬水與這兩種食物一同下肚,並不會造成不適,只是有兩點要多加留意,第一點是要盡量避免檸檬與奶類一起飲用,避免傷到腸胃;第二點則是要多注意檸檬的濃度,以避免過酸刺激到腸胃。
 
迷思二/感光性檸檬製成水,會讓皮膚反黑?
 
書田診所皮膚科徐家琪醫師表示,若是用喝的,經過腸胃道吸收到體內劑量頗低,所以較不會因為飲用檸檬水而導致變黑,但檸檬主要還是以接觸型才容易反黑,因為在接觸的過程中,若沒將雙手洗乾淨,而直接外出的話,經過太陽照射後才會有變紅變黑的問題,以致造成光接觸性皮膚炎,對此,建議民眾若有接觸到檸檬時,應用洗手乳清洗雙手後再出門,以避免曬黑等問題產生。
 
迷思三/研究說熱檸檬水能抗癌?
 
曾經有研究指出,喝熱的檸檬水可以抗癌,但據洛桑加參醫師表示,檸檬皮中的確是含有抗癌的成分,因為它有有高濃度的維他命C,可提升免疫力、殺菌力,但抗癌並不是只有靠單一成分,而是要看它的整體價值,此外,也建議民眾在飲用檸檬水時,最好保持在40度左右為最佳狀態,可增加吸收力。
 
迷思四/檸檬水添加鹽巴可治感冒?
 
洛桑加參醫師表示,檸檬水不可與鹽巴一同飲用,因為我們在飲食的過程中就會攝取到鹽份,然而若攝取過多的鹽份,恐會造成高血壓。所以,建議民眾若想添加的其他東西增加風味的話,建議可添加純天然的蜂蜜,因為它會含有營養素及微量元素,可增加身體攝取其他的營養,讓大家喝得安心又放心。
 
迷思五/檸檬萊姆傻傻分不清楚 挑選過程要注意
 
最後,提醒民眾,雖然檸檬常見,但你真的挑對了嗎?市售的檸檬中分為兩種,一種有籽,另一種則是無籽的,無籽的檸檬也就是所謂的萊姆,顏色較偏黃,果皮較為薄,酸度較低,外觀較為長球狀,而檸檬外觀為橢圓形,顏色維常見的綠色,果皮較為粗糙,酸度較高,所以大家在挑選的過程中應多加留意,以避免挑錯水果。

2014年5月9日 星期五

GridView 動態產生欄位 For C#

資料來源:
http://www.blueshop.com.tw/board/fum20041006161839lrj/BRD2011031411333152E.html

事先(page_init)建立所有的欄位,

事後(page_load, button_click, .....)隱藏某幾個已存在的欄位 

GridView密技#4---使用ITemplate介面,動態新增「GridView樣版列(Template Row/模版列)」,內含VB與C#語法

http://www.dotblogs.com.tw/mis2000lab/archive/2008/12/24/gridview_dynamic_add_template_1224.aspx

GridView密技#5---(修改/補強版)使用ITemplate介面,動態新增「GridView樣版列(Template Row/模版列)」
http://www.dotblogs.com.tw/mis2000lab/archive/2008/12/24/gridview_dynamic_add_template_1224.aspx 


Q:自訂GridView欄位,為何每換頁一次,欄位就一直增加呢?
資料來源:
http://www.blueshop.com.tw/board/FUM20041006161839LRJ/BRD20101117120721FD2.html


protected void Page_Init()
{
dt.clear(); // 加一行
dt = sqlDB.DbCreateDataTable(sql, "Grid1");

-------

我想可能是「GridView的 DataBinding時機有錯」

如果您寫在 Page_Load()事件裡面,
多寫一段判別式,說不定就改善了。
IF Not Page.IsPostBack Then
'----把 DBInit()程式寫在這裡
End IF

DBInit()就是您目前 Page_Init()這一區塊的程式碼。

關於 Page的生命週期,PostBack的觀念,Page_Load()事件何時被觸發?
您可以參考這 2篇文章,希望對您有幫助。

[FAQ]GridView的編輯、修改、刪除,為何都會重複執行兩次?
http://www.dotblogs.com.tw/mis2000lab/archive/2009/10/20/11157.aspx


自己動手寫 GridView的編輯/更新程式,但抓不到修改後的資料?(兼論DataBinding的時機)
http://www.dotblogs.com.tw/mis2000lab/archive/2009/11/09/11497.aspx 

------

把addSource();從Page_Load移到Page_Init.
並且把中斷點放在Page_Init的addSource(),但發現一個問題.
當我按下送出的時候 此時畫面會PostBack 這個時候,Page_Init也是會被執行,且會再次觸發.
您試會嗎?如果不會,是我這裡有什麼東西沒設定到嗎?

後端程式如下:

protected void Page_Init(object sender, EventArgs e)
{
addSource();
}

protected void Page_Load(object sender, EventArgs e)
{
}

private void addSource()
{
ddlTest1.Items.Add(new ListItem("s1", "1"));
ddlTest1.Items.Add(new ListItem("s2", "2"));
ddlTest1.Items.Add(new ListItem("s3", "3"));


GridView依前方欄位值條件disable編輯及刪除鈕

資料來源:
http://adamschen9921.pixnet.net/blog/post/91648159-gridview%E4%BE%9D%E5%89%8D%E6%96%B9%E6%AC%84%E4%BD%8D%E5%80%BC%E6%A2%9D%E4%BB%B6disable%E7%B7%A8%E8%BC%AF%E5%8F%8A%E5%88%AA%E9%99%A4%E9%88%95

本例依前方欄位值條件,如未鎖則可編輯及刪除,如前方欄位為已鎖,則停用編輯及刪除。
GridView進行RowDataBound時,檢查Cell值為已鎖或未鎖並決定是否Disable編輯及刪除之功能。
 
 
 
VB

Private Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs)Handles Gridview1.RowDataBound
If e.Row.Cells(6).Text.Trim() = "已鎖" Then
DirectCast(e.Row.Cells(7).Controls(0), WebControl).Enabled = False
DirectCast(e.Row.Cells(8).Controls(1), WebControl).Enabled = False
End If
End Sub


C#

private void GridView1_RowDataBound(object sender, System.Web.UI.WebControls.GridViewRowEventArgs e)
{
if (e.Row.Cells[6].Text.Trim() == "已鎖") {
((WebControl)e.Row.Cells[7].Controls[0]).Enabled = false;
((WebControl)e.Row.Cells[8].Controls[1]).Enabled = false;
}
}

2014年5月2日 星期五

GridView設定


Q1:內建的DeleteQuery刪除時卻出現錯誤:必須宣告純量變數


Q2: 只要顯示日期
時間欄位轉換為TemplateField, 設定 {0:d}
-------------------
Bind("配宿時間", "{0:d}")
--------------------

Q3:刪除資料,並彈出刪除確認對話框
http://blog.finalevil.com/2008/11/aspnetgridview03.html


東訊TECOM SD/DX 2488交換機



http://www.sunwe.com.tw/tecom304.htm

SD2488/DX2488 TECOM超級數位電話總機


  • 東訊 TECOM SD-2488 數位電話主機(實裝 8 外線 24 數位內線容量,可擴充至 8 外線 40 數位內線)一台
  • 4 路來電顯示卡2片
  • 12路自動總機1片

  • CALL 02-22267567 上偉科技
    簡易功能說明:

  • SD 2488 為全數位式電話系統,主機與各型數位話機均為數位式設計。主機採用最先進的PCM 與TDM 整合技術,而主機與各數位話機間,採用2 芯無極性配線(如配線短路,系統會自動閉鎖)。其傳輸模式為2B+D,所以本系統可以在2 芯配線上同時傳送聲音(VOICE)與資料(DATA)之功能。更利用2B+D 之架構應用,提供雙向式的秘書插話(OHVA)。因此,現在已可為您在辦公室內預設整體服務數位網路,享受數位系統所能提供的各種彈性服務,以滿足新時代的需求。
  • 機器設備保固一年。

  • 詳細說明請參閱



    SD-7724E TECOM 24鍵免持對講顯示型功能話機


    安裝手冊