2012年5月31日

Security 資訊安全 2. Cross-Site-Scripting (XSS)

在留言或論壇文章等文字內容中,輸入了夾帶 javascript的文字,使得網頁在顯示內容時,順帶的執行其中的 javascript,進而對瀏覽此網頁的其他使用者造成影響。
沒有做 XSS防範措施的網頁,很容易因此就被掛上木馬等糟糕的內容。

所以,不能盡信使用者輸入的內容,最好在傳送前及顯示時,對使用者輸入的內容加做 html編碼解碼。

在 ASP .NET已經有功能強大的 Anti-XSS Library可以對付 XSS攻擊,目前最新的版本為 4.2版。


參考資料:
網站
 XSS(Cross Site Scripting)攻擊會讓您遺失Cookie中的資料
 [資訊安全]防範Cross-Site-Scripting(XSS)
PDF
 ASP.NET 防駭指南

2012年5月30日

Security 資訊安全 1. SQL Injection

SQL Injection是一種設計邏輯上的疏失造成的系統漏洞,不管用什麼程式語言、資料庫,都可能會中獎。
一個不小心,就足以讓整個系統門戶大開,赤裸裸的給人看光。

舉一個簡易的例子:
string selectCommand = 
@"SELECT UserName FROM UserAccount WHERE UserID='" + Request("UID") + "' AND UserPWD='" + Request("PWD") + "'";

如果輸入 UID為 ' or 1=1 --
這樣上方例子中的 SQL指令變成:
SELECT UserName FROM UserAccount WHERE UserID='' or 1=1 -- ' AND UserPWD=''";
就可以直接登入

如果管理者帳號為 admin,輸入 UID為 admin'--
SELECT UserName FROM UserAccount WHERE UserID='admin'-- ' AND UserPWD=''";

瞬間就可以以管理員權限登入,想做什麼就做什麼!!

再衍生下去則可以利用錯誤訊息獲得管理者權,停掉資料庫、刪除資料或卸除資料庫等,甚至取得伺服器主機管理權限等,不可不防。


另外,辛辛苦苦完成的網站上線後,若沒有做自訂錯誤頁面,直接暴露出所有 error、exception訊息,則使用者也可以利用錯誤訊息,摸透資料庫的內容,接著幹出一堆很邪惡很邪惡的事。
(詳細步驟可看 SQL Injection (資料隱碼)– 駭客的 SQL填空遊戲(上))


重點!!
1. 過濾使用者輸入的資料。
2. 不要直接以字串串接組合出 SQL指令。
3. 不要把錯誤訊息顯示給使用者。


解決方式:
ASP .NET
  • 使用 Command物件或 SqlCommand類別,透過參數執行 SQL 語法。
  • 正式環境中,將 web.config內的 customErrors設為 "On"。
  • 在伺服器端檢查與限制輸入變數的型別與長度,過濾掉不需要的內容,不要完全信任使用者輸入的內容。
  • 登入 SQL Server的帳號不使用 sa或任何屬於 Sysadmin群組的帳號,避免有過大的權限。


參考資料:
網站
    SQL Injection (資料隱碼)– 駭客的 SQL填空遊戲(上) (下)
    『資料隱碼』SQL Injection的源由與防範之道
    SQL Injection 緊急應變建議
PDF
    ASP .NET 防駭指南
    你的網站在裸奔嗎? 一個SQL Injection實例的啟示

2012年5月29日

趨勢科技 面試

自我介紹
專案

對資料庫,除了 SQL語法,還懂多少

MVC概念
執行流程圖
空專案 ... Global.aspx、Routing、...

List
輸入數字陣列  13, 2, 1, 5, ...
輸出偶數數字
foreach() {} ... 直接 remove 會當
for() {}... 移除2 下一個顯示 5

月曆
月份平移

JQuery選擇器

接別人的程式做維護等,要怎麼做,從哪裡開始切入 (寫test追蹤程式行為)

對新語言、新技術的上手速度、如何學習

抗壓性


Team Leader 註:

1. 自我介紹
2. 資料庫到Javascript間的實作
3. 自我學習Highcharts的經驗
4. ASP.Net的學習經驗
5. Web開發的經驗
6. 是否有參與系統分析
7. jQuery的學習經驗
8. 圖表的類型有哪些
9. 開發經驗中印象最深的事
10. 專案中如何存取資料(庫), ADO, SQL, etc.
11. Stored Procedure的經驗.
12. 請畫出MVC的架構
13. Server如何透過URL知道哪些Controller, Model, View該處理資料.
14. 請試從一個空的專案說明MVC的開發.
15. 除了ActionResult, 還有哪些可以回傳的ViewResult.
16. List<int> num = new List<int>(new int[]{13, 2, 1, 5, 6, 10, 7});
刪除偶數, print剩下的奇數. foerach的remove風險與for的實作.
17. 用月份推算是第幾季.
18. 假如7, 8, 9三個月是第一季, 推算的公式是.(年度亦要考慮)
19. 用jQuery取出div下所有class=classA.
20. 面試者反問.
21. 面試者對新東西的反應與興趣, 以及如何熟悉的方式.
22. 對於維護別人的程式, 會如何進行.



2012年5月28日

SQL Injection

今天在跟組長做面試練習時,組長問了怎麼防止 SQL Injection

我直接回答:不知道什麼是 SQL Injection

所以 組長 就簡單的解釋了一下 SQL Injection的做法

我頓時:哦 ~

然後在面試練習結束後,上網查了一下 SQL Injection
看到黑暗執行緒的 你的網站正在裸奔嗎? (裡面有個 pdf連結,下載來看)
才更清楚的了解了 SQL Injection的嚴重性

還好當初專案開發時就有被告知盡量不要用字串串接做 SQL查詢句

Interview Pratice

session multiple server
sessionstate
1. port
A B C - D(session server)  IP:port 導向同一台處理 session的 server

2. DB
用一個資料庫儲存server (ASPState),以空間去換

MVC
概念
MVC把 View抽離出來,能夠讓設計師方便使用
若只要動 View,就不用更動 Model、Controller
反正 Web Form要改就是全都要 (compile)
View裡就不會有一堆 asp tag,設計師可以專注在 html(html helper)、css、js
***YL: 對方並沒有要問 MVC的好跟 Web Form的不好

熟悉度
再寫一次 新增修改刪除,會快很多
但若要求不刷新頁面做新增修改刪除?



專案介紹
人數  功能數(model數、table數)  資料量  負責的功能
後台 C:42  M:52
前台 C:16  M:64+6+3
T: 55(data)+33(analysis)
資料: 17x萬

依照我回答的方式,對方的問題延伸會著重在資料庫數據處理部分
ex: 數據發生問題時,怎麼處理 (完整、正確)
***客戶會從你所描述的東西去延伸問題
***YL: 你會不會去幫客戶(全國)思考還需要什麼功能

若主機掛掉了怎麼辦
因為全國是在測試機上確認好程式都沒問題後才佈版到主機上
所以測試機上的資料會跟主機的一樣
把測試機上的資料還原到主機上就好


SQL injection
select *
from login
where u=" ' "+uid+" ' "
and pw=" ' "+upw+" ' "
如果 uid = " ' ' or 1=1 -- "
狠一點還可以再加 delete ... --
http://www.microsoft.com/taiwan/sql/sql_injection_g1.htm

用 SQL parameter杜絕
where u=@uid and pw=@upw

雖有用 MD5對密碼加密編碼
但侵入者若是直接回傳 id跟 md5pw,那不就沒差?


為什麼沒有做購物車儲存的功能
客戶是拿其他的購物網站來比
回答: 商品數小、跟客戶談的結果是不需要,所以就沒有做這個功能
***從發問者的角度來思考對方想要知道什麼(YL:客戶真的想知道你的系統做了什麼?)
***從談需求的角度去回答問題,而非工程師一直線的往系統如何完成去思考

2012年5月25日

Interview Questions

Q:Session 、Cookie 如何選擇?  怎麼判斷何時該用?
      cookie將使用者資訊存在 client


      session將使用者資訊存在 server,使用者關閉 cookie功能,session仍可用
      關閉瀏覽器並重新開啟後,session 就會消失
      session 生存期限到時後,session 自動消失


  http://www.php5.idv.tw/bb-6243.htm

  使用Cookie機制
  瀏覽第一頁時,使用一個Cookie名稱紀錄你瀏覽過第一頁的一些資訊,
  瀏覽第二頁時,紀錄第二個Cookie名稱的一些資訊,瀏覽第三頁時,
  紀錄第三個Cookie名稱的一些資訊...依此類推。
  假設都要記錄Cookie,那麼每次瀏覽網頁,都會跟web Server溝通
  你有這些Cookie要處理。也就是你會傳送這麼多資料給Web Server。

  換成Session機制
  瀏覽第一頁時,僅使用一個Cookie紀錄Session ID,瀏覽第二頁時,
  也使用第一頁的那個Session ID,所有資料僅傳送這個Cookie遍可以
  記錄相關的資訊(存在server)。

  理論上第一個方式將會有比較大的流量,第二個則會比較少。
  而在安全性上,網頁動作每次傳送都會經過很多點,會被攔截,
  Cookie傳送的資訊通常清晰可見(很少人編碼後在傳送),
  而Session只是一個編碼id 資訊,資訊都是在Server上。
  所以通常Session通常運用在登入機制,Cookie則通常用在無關緊要
  的個人化習慣性機制。

安全性:session只需要在 cookie儲存一個 session id(或用 URL重寫),使用者資訊則存在 server,而 cookie卻是會記錄網頁的部分資訊
流量:


  嗯~~
  突然我想要加上一個功能
  就是一些會員資料可以隨時拉出來用
  保存在Session是一個方式
  但是Session的預設逾時值是20分鐘
  而且也挺浪費伺服器效能跟記憶體
  怎麼辦咧?
  我也不想一直從資料庫拉資料


  OK~
  那我利用Cookie來記錄好了
  Cookie是放在客戶端
  這樣也可以把負擔分攤給其他瀏覽者


  基本上別把一些很重要的資料寫到Cookie就好
  例如會員的密碼(明碼格式)
  免得被人竊取了會員的帳密
  不過千萬要記得Cookie如果沒有設定逾期的時間的話
  只要一關閉瀏覽器就失效了
  所以一定得注意
  ================說故事完畢=================
  其實最主要的就是注意點如下:


  Session ==> 資料是儲存在伺服器上,消耗的是伺服器的資源,
  並且預設逾時為20分鐘沒有操作就會失效


  Cookie ==> 資料儲存在客戶端上,可以減少伺服器的負擔,
  建議儲存一些不是很重要的資料使用,預設逾時為結束瀏覽器就結束


  http://blog.51yip.com/php/938.html



Q:用Session為何沒有意見?  (為何 PM能放心讓我們使用 session)
      (session存在哪?  用在多主機時會有甚麼問題?)

  http://www.heiqu.com/show-2910-1.html
  稍大一些的網站,通常都會有好幾個服務器,每個服務器運行著不同功能的模塊,
  使用不同的二級域名,而一個整體性強的網站,用戶系統是統一的,即一套用戶名
  、密碼在整個網站的各個模塊中都是能登錄使用的。
  各個服務器共享用戶數據是比較容易實現的,只需要在後端放個數據庫服務器,各
  個服務器通過統一接口對用戶數據進行訪問即可。但還存在一個問題,就是用戶在
  這個服務器登錄之後,進入另一個服務器的別的模塊時,仍然需要重新登錄,這就
  是一次登錄,全部通行的問題,映射到技術上,其實就是各個服務器之間怎麼實現
  共享 SESSION 數據的問題。

Q:MVC 有無幫助?好或不好在哪(對系統開發的幫助及壞處)? 若走回web form  抗拒在哪?




交易面
藍新說有打回交易資料給我們,我們的系統卻沒有記錄,何解??


價格預防機制
全國的員工只有測試機的 url,不會碰到線上主機
在測試機上都完成後才佈上線 (一季一次)


主機佈在雲端,我們對主機還需要付什麼責任??


客戶回報無法使用或交易失敗,如何追蹤錯誤?  圖表、交易


各個功能背後的用意是什麼??

REST:Representational State Transfer

因為 Service Stack裡面有提到 REST-ful

所以來研究一下

  1. http://zh.wikipedia.org/zh-tw/REST
  2. REST[轉貼]

  • 資源是由URI來指定。
  • 對資源的操作包括獲取、創建、修改和刪除資源,這些操作正好對應HTTP協議提供的GET、POST、PUT和DELETE方法。
  • 通過操作資源的表現形式 (指定URI)來操作資源。


優點:
  • 可以利用緩存Cache來提高響應速度
  • 通訊本身的無狀態性可以讓不同的伺服器的處理一系列請求中的不同請求,提高伺服器的擴展性
  • 瀏覽器即可作為客戶端,簡化軟體需求
  • 相對於其他疊加在HTTP協議之上的機制,REST的軟體依賴性更小
  • 不需要額外的資源發現機制
  • 在軟體技術演進中的長期的兼容性更好


REST-ful Web API 定義:
  • URI。
  • Web服務接受與返回的網際網路媒體類型,如 json、xml等。
  • Web服務在該資源上所支持的一系列請求方法(如:post、get、put、delete)。

疑問:

  1. 在REST[轉貼]中提到,一般網址:
    http://www.some_site.com/user/find/123
    到了 REST會變成 :
    http://www.some_site.com/user/123  搭配 http的「Get」

    http://www.some_site.com/user/123  搭配 http的「Put」
    這兩個 REST的網址都長得一樣,那沒有動詞的 URL要怎麼知道現在是要做 get還是 put ??
  2. MVC是否符合 REST設計風格??


2012年5月23日

Service Stack Example_1 Hello

1.安裝 Service Stack:
透過 NuGet下載 ServiceStack.Host.AspNet 或 ServiceStack.Host.Mvc

2.開新專案

3.將 Service Stack套用至此專案  //加入參考 ServiceStack.dll
可分:希望有 Web Framework (host from the root path:/)
<location path="servicestack">
  <system.web>
    <httpHandlers>
      <add path="*" 
           type="ServiceStack.WebHost.Endpoints.
                 ServiceStackHttpHandlerFactory, ServiceStack" 
           verb="*"/>
    </httpHandlers>
  </system.web>

  <!-- Required for IIS 7.0 -->
  <system.webServer>
    <handlers>
      <add path="*" 
           name="ServiceStack.Factory" 
           type="ServiceStack.WebHost.Endpoints.
                 ServiceStackHttpHandlerFactory, ServiceStack" 
           verb="*" 
           preCondition="integratedMode" 
           resourceType="Unspecified" 
           allowPathInfo="true" />
    </handlers>
  </system.webServer>
</location>
          希望沒有 Web Framework (host web services at :/custompath)
<location path="servicestack">
  <system.web>
    <httpHandlers>
      <add path="*" 
           type="ServiceStack.WebHost.Endpoints.
                 ServiceStackHttpHandlerFactory, ServiceStack"
           verb="*"/>
    </httpHandlers>
  </system.web>

  <!-- Required for IIS 7.0 -->
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <validation validateIntegratedModeConfiguration="false" />
    <handlers>
      <add path="*" 
           name="ServiceStack.Factory" 
           type="ServiceStack.WebHost.Endpoints.
                 ServiceStackHttpHandlerFactory, ServiceStack"
           verb="*" 
           preCondition="integratedMode" 
           resourceType="Unspecified" 
           allowPathInfo="true" />
    </handlers>
  </system.webServer>
</location>

4.建立 Web Service

......吧啦吧啦一堆程式碼


5.在 URL中設定用不同的方式(檔案格式)呼叫 Web Service的方法
XML (POX), JSON, JSV, CSV urls:
/servicestack/[xml|json|html|jsv|csv]/[syncreply|asynconeway]/[servicename]

Http post from data:
<form action="servicestack/xml/syncreply/Hello" method="post">
    <label>Name:</label>
    <input type="text" name="Name" value="World!">
    <input type="submit">
</form>


SOAP Web Service urls:
/servicestack/[soap11|soap12]







User defined REST-ful urls:
Accessible via any REST-ful urls defined using the [RestService] Attribute. e.g. in this case:
/servicestack/hello/{Name}



......待續

Service Stack

前幾天被 Cindy分派研究一下 Service Stack

嗯 ... 好難懂

目前稍微理解的有 Code-First是在幹嘛

還有 Service Stack的一個優點: 可以在 URL上做手腳,要求回傳的資料為 JSON、XML、HTML等多種格式

繼續研究

2012年5月18日

Highchart IE8的圓餅圖 無法輸出

解決方法:

打開 highcharts.src.js

找到
 /**
  * Override the base drawDataLabels method by pie specific functionality
  */
  drawDataLabels: function () { ...

在底下的

for (pos = centerY - radius - distanceOption; pos <= centerY + radius + distanceOption; pos += labelHeight) {
    slots.push(pos);
}

改為

if (labelHeight == 0)
    labelHeight = halves[0][0].dataLabel.height;

for (pos = centerY - radius - distanceOption; pos <= centerY + radius + distanceOption; pos += labelHeight) {
                        slots.push(pos);
}

在網頁中加入引用 highcharts.src.js