跳到主要內容

發表文章

目前顯示的是有「C#」標籤的文章

何謂 Cross-Site Scripting? 如何避免 - How to prevent Cross-Site Scripting (XSS)

前言 攻擊者向有Cross-Site Scripting (XSS) 漏洞的網站值入惡意的HTML指令碼, 當用戶在瀏覽網站時, 由於瀏覽器無法判斷被植入的指令碼是否可信, 造成這些惡意指令碼被執行而達到攻擊的目的 列如: 訪問cookie, 改寫HTML 如何避免 過濾 過濾可疑字元, 比如說用戶上傳的DOM屬性和script, link, style, iframe等等 驗證 驗證資料格式, 每筆資料基本上都會有預期的輸入格式, 若不符合格式, 就應該禁止用戶提交表單 編碼 對輸入的某些字元進行編碼, 比如 ” < > & C#預設會幫我們把表單中的輸入做編碼, 當然也可以把它關掉然後自己去呼叫Server.HtmlEncode [HttpPost] [ValidateInput(false)] public ActionResult NewItem(string Text1) { ViewBag.Text1 = Server.HtmlEncode(Text1); return View("Index"); } 透過瀏覽器來防堵XSS攻擊 Server Side在回傳的Header裡埋入X-XSS-Protection的資訊, 讓用戶端的瀏覽器幫我們檢查是否有XSS的情況發生, 並進一步停止加載 Node.js // simple case, you can set the X-XSS-Protection header to 1; mode=block. // This tells browsers to detect and block reflected XSS. const xssFilter = require('x-xss-protection') // Sets "X-XSS-Protection: 1; mode=block". app.use(xssFilter()) C# 在web.config裡加入以下設定 <httpProtoc...

[簡易教學] 如何使用Azure Pipeline 建立CICD管線自動編譯程式碼以及部屬至Azure APP Service

前言 最近一兩年微軟開始大力的推廣自家的DevOps工具, 可以感覺的出他們很想要搶下這塊市場, 這對開發者來說其實是件好事情, 表示我們的選擇可以更多元了, 不需要再侷限於Gitlab, Jenkins 等等 Aure Pipeline 用起來的感覺是蠻好上手的, 兩三下就能將.Net程式編譯打包然後部屬到Azure的雲上跑 以前用Gitlab作CI/CD時, 比較麻煩的是如果要Build .Net Framework的程式, 就需要特別自架runner跑在windows的機器上當作build machine, 而這台build machine還需要設定跟安裝某些套件才能讓整個自動化的流程運作起來, 光弄這些code 都不用寫了 TT 那這也是我們團隊開始接觸Azure DevOps的原因, 以下就簡單的帶各位了解一下怎麼在Azure DevOps 上建立Pipeline跑CI/CD的流程 Step 1. 建立組織 一開始Azure DevOps會要求開發者建立一個組織 Step 2. 建立專案 在組織底下我們可以建立多個專案 Step 3. 建立 Pipeline 選擇Pipelines > Builds Step 4. 設定Pipeline 選擇Source Code的來源 : 這邊示範從Gitlab伺服器上抓Code下來編譯 填入遠端倉庫的位址, 帳密 然後" 下一步 " 選擇Pipeline的範本 : 待會我們會根據這個範本作些微的調整, 讓他可以正常編譯程式最終部屬到Azure App Service上 設定與調整Pipeline範本: 這邊比較重要的部分是Azure帳號裡的訂閱ID, 以及要部屬的目標App Service 的名稱 最後按上方的" Save & Queue " 接下來Pipeline就會跑起來做事 結果 如果一切順利的話, 可以看到類似以下的結果

[ 解決方法] LINQ to Entities does not recognize the method System.String Format

前言 相信.NET的開發者對Entity Framework(簡稱EF)絕對不陌生, 這是基於.NET的ORM框架, 除了可以讓開發者用存取物件的方式與資料庫溝通之外, 還可以搭配LINQ to Entity的技術, 更輕易地撰寫查詢邏輯, EF底層會自動將這些邏輯轉換為對應的SQL語法,然後執行在SQL Server上 雖然LINQ to Entity很方便, 但在使用上也必須小心, 不然有可能在編譯的時候都OK, 但Runtime時卻跳出以下的錯誤訊息 錯誤訊息 LINQ to Entities does not recognize the method System.String Format 錯誤的使用方式 這個問題出在於Select 的時侯呼叫了 string . Format   在這個情況下使用LINQ to Entities時, C#會告訴SQL Server去執行 string . Format , 但由於SQL Server上沒有相對應的指令, 所以才會出現這個錯誤訊息 解決方法 可以將Query分成兩段, 前半段最後呼叫 .AsEnumerable() 將資料讀到記憶體中, 後半段Query就能以LINQ to Objects的方式來操作資料, string . Format 也可以正常的被呼叫

手把手教學, 十分鐘內快速建立Line Bot

前言 相對以前來說, 現在要建一個LINE Bot已經變得非常簡單了, 尤其是最近微軟的Bot Service提供LINE的支援, 對使用微軟Bot Framework的開發者來說, 可以省去不少功夫去串接LINE 基本上使用Bot Framework來建立一個LINE Bot有幾個步驟 建立一個BOT 建立LINE BOT帳號 設定LINE頻道 串接LINE與Azure Bot Service 建立一個BOT 關於如何建立可以參考之前的 文章 啟用LINE的頻道 建立LINE BOT專用帳號 要開啟賴的通道首先必須要在賴的平台上替機器人建一個帳號 https://developers.line.biz/console/register/messaging-api/provider/ 建立Provider 這邊我們需要給他一個名字 選擇Message Api, 然後建立頻道 給個名字, 然後下方選擇Developer Trial Developer 跟Free最大的差別是Free沒有推送訊息的權限, 所以如果你選擇Free, 那你的Bot就相當於有耳朵但是卻沒有嘴巴 而這個問題可以透過升級為付費模式來解決 相反的Developer有嘴巴也有耳朵的權限, 但是他不能透過升級來獲得更多的權限 填入你的電子郵件後按同意, 完成後會看到你剛剛建立的賴帳號 進入賴帳號, 繼續接下來的設定 接下來我們要開始將Azure Bot Service跟賴串起來 卷軸往下滾找到~Channel Secrete 回到Azure Bot Service上, 把Channel Secrete 填上去 接下來複製下面 Webhook URL , 然後再回到賴的頁面 卷軸繼續下拉到 Message Setting 這部分有四個步驟 1. 依序是設定Webhook URL, 把剛剛在Azure上複製的URL給貼上去 2. 啟動 Use Webhook 3. 取得Channel access token 4. 啟動 Allow bot to join group chats 複製在步驟...

How to secure ASP.NET MVC API: Part 1 (如何在ASP .NET MVC上保護REST API不被任意人士存取)

前言 基本上要保護API不被其他有心人士存取有很多種方法, 以下介紹兩種最常見的保護方式 1. 檢查Request Header有沒有特定的API Key Client跟Server在溝通時可以協調好Request Header裡應該要出現什麼特定的API Key字串才能證明是合法的請求 實作方法 - 使用Message Handler Step 1. (Optional) 安裝必要套件 Microsoft.AspNet.WebApi.WebHost Microsoft.AspNet.WebApi.Core Microsoft.AspNet.WebApi.Client 如果你的專案是 ASP.NET Web Application (.NET Framework)這種類型的話, 請務必安裝以上的套件 Step 2. 實作Message Handler來檢查每個進來的請求 在專案中新增一個目錄Handlers 接下來, 在這個目錄中新增一個APIKeyMessageHandler.cs 如下 <原始碼> 這個類別可以用來過濾請求, 當請求Header內沒有指定的字串時會被拒絕, Step 3. 註冊剛剛自訂義的Message Handler 修改Global.asax <原始碼> 加入以下兩行             GlobalConfiguration.Configure(WebApiConfig.Register);             GlobalConfiguration.Configuration.MessageHandlers.Add(new APIKeyMessageHandler()); Step 4. 新增一個API Controller "MyApiController" 來處理請求 <原始碼> 測試 如果請求裡面沒有帶APIKey, 最後會得到 {"message": "Invalid API Key"} 的結果 完整原始碼在這 ...

C# WEB API 無法回傳HttpStatusCode NotModified(304)

C# WEB API 無法回傳HttpStatusCode NotModified(304) 實務上在實作WEB API時, 通常會根據結果去回傳合適的HTTP Status Code(狀態碼), 當請求失敗時我們可以從狀態碼清楚地得知原因是什麼 有些狀態碼有其特殊的規範, 如 304 NotModified 如下所示, 這個API 若檢查到POST過來的資料(Activity)早已存在資料庫中時, 會回傳304還有碩誤訊息 "item exist already"         public async Task <IHttpActionResult> Post([FromBody]Activity activity)         {             if(Context.Activities.Any(a=>a.Id == activity.Id))             {                 return ResponseMessage(Request.CreateResponse(HttpStatusCode.NotModified, "item exist already" ));             } 而這是一個錯誤的示範 當使用POSTMAN測試時會報錯 Could not get any response There was an error connecting to   http://localhost:58671/api/history . Why this might have happened: The server couldn't send a response: Ensure that the backend is w...

使用Azure cli 建立對話式聊天機器人(Bot Service)

前言 如果覺得使用Azure Portal建立Bot很麻煩的話, 不妨試試看用Azure Cli, 以指令的方式來建立 以下教學如何使用Azure cli 快速建立一個Bot 前置作業: 需要先在開發機上安裝Azure cli的套件 https://docs.microsoft.com/en-us/cli/azure/install-azure-cli-windows?view=azure-cli-latest 註冊新的應用程式 每隻Bot應用都需要先在微軟的App Portal註冊, 之後會取得APP ID 以及Public key (https://apps.dev.microsoft.com/portal/register-app) Public Key 這組密鑰需要自己手動按下 Generate New Password 去產生, 得到之後記得要好好保存, 因為它只會在UI上顯示一次 如上圖所示, 以上步驟完成後會可以得到App ID\Public key, 當後端程式(Bot邏輯)與Azure Bot  Connector Service溝通時會需要App ID\Public key來認證身分 在雲上建立Bot Service 登陸azure az login 建立資源群組(若使用既有群組,可以省略) az group create --name BotResourceGroup --location "West US" 建立bot 相關資源 az bot create --resource-group "BotResourceGroup" --name "andy-test-bot" --kind "function" --description "description-of-my-bot" --appid <YOUR_APP_ID> --password <YOUR_PUBLIC_KEY> appid , password 記得換成剛剛取得那組帳密 kind - 目前有三種資源方案function, registr...

使用UWP 設計 MVVM 軟體架構(三) 在view中使用view以外的資源, 以加入Converter 為例

本篇文章簡單介紹UWP MVVM 如何在view中使用view以外的資源(以加入Converter 為例) 假設view上有個 Image 元件, 它的Visibility屬性被綁定在MyViewModel.IsHide 這個Property上, <Image Margin= "200,200,0,0" MaxWidth= "50" MaxHeight= "50" HorizontalAlignment= "Center" VerticalAlignment= "Center" Source= "ms-appx:///Assets/googleIcon.png" Visibility= "{Binding IsHide, Mode=OneWay}" /> 為了提升可讀性, 我們將 MyViewModel.IsHide 宣告成布林型別, 但由於 Visibility 屬性只能接受整數型別, 所以我們需要多做一個Converter 來轉換成UI上需要的值 public class BoolToIntConvert : IValueConverter { public object Convert ( object value , Type targetType, object parameter, string language) { return ( bool ) value == true ? Visibility.Collapsed : Visibility.Visible; } public object ConvertBack ( object value , Type targetType, object parameter, string language) { t...

[C#] 實作如何讓Cortana Skill 呼叫UWP

前言 當我們在實作Cortana Skill的時候, 我們可以將雲上的資料回傳給Cortana 並且顯示在Canvas上 來跟使用者互動 但實務上, 有些情況因為Canvas本身的限制, 所以需要再刻一個負責前端的UWP來顯示Skill回傳的資料 以下即介紹如透過實作UWP的 Deep link使之與 Cortana 互動 UWP的部分 設定Protocol 右鍵 Package.appxmanifest 選擇 View Code 加入 <Extensions> <uap:Extension Category= "windows.protocol" > <uap:Protocol Name= "YOUR_URL" > <uap:DisplayName> " YOUR_NAME " </uap:DisplayName> </uap:Protocol> </uap:Extension> </Extensions> 這邊假設 YOUR_URL = skill.mytest.clien YOUR_NAME = mytest 複寫OnActivated 當程式被Cortana叫起來時, 這個函式會被執行 複寫它, 使之將頁面切換至相應的頁面 var protocolArgs = args as ProtocolActivatedEventArgs; rootFrame.Navigate( typeof (Views.ListPhotos), protocolArgs.Uri.Query); 如範例所示, 我們會將頁面導向到 Views .ListPhotos Views.ListPhotos複寫OnNavigatedTo 讓我們在導向至這個頁面的時候, 可以先去載入相關資料 protected overrid...

[C#] UWP 遠端部屬 Remote Deploy

通常當我們開發UWP到某一特定階段的時候會想要把程式部屬在其他實體機器上, 讓它跑跑看有沒有問題出現 基本上, Visual Studio 2017  除了部屬在虛擬機或是本機上之外, 也另外提供了遠端部屬的功能, 要啟用這個功能, 首先, 遠端機器必須安裝 Remote Tools for Visual Studio 2017 https://visualstudio.microsoft.com/downloads/?q=remote+tools#remote-tools-for-visual-studio-2017 安裝完後, 我們可以在開始選單上找到, Remote Debugger (左鍵執行) Remote Debugger 起來後會開始等待連接 第二步, 右鍵專案名稱 > Properties 在Debug的頁簽下, 完成以下的設定: 選擇裝置種類,  搜尋裝置,  選擇你要連接的裝置 最後, 點選工具列下方得執行 Visual Studio 就會將UWP部屬在連接的遠端機器上並且執行

[C#] UWP 如何呼叫 WIN32 程式並取得執行結果

前言 當我們在開發UWP時, 有很多情況會需要呼叫WIN32程式做事, 比如說讀取註冊表裡的值,或是使用WMI取得系統或是BIOS資訊等等, 而這些事情光靠UPW是做不到的 以下教學示範如何呼叫WIN32做事並且取得執行結果 首先UWP的部分: 匯入套件Windows Desktop Extensions for the UWP 至UWP專案 Package.appxmanifest 宣告Application Extension 我們必須讓UWP知道我們要呼叫誰並且設為 fullTrustProcess 修改Package.appxmanifest 加入WIN32 Extension 到<application>裏頭 修改<Capabilities> App.xaml.cs 引用以下套件 喚起WIN32程式 修改 protected override void OnLaunched( LaunchActivatedEventArgs e) 加入底下程式碼 初始化App Service 發請求給WIN32程式 這邊我們先建立一個方法, 負責發送請求給win32程式 修改剛剛複寫的OnBackgroundActivated, 最後去呼叫SendRequestToWin32 WIN32部分 加入套件: 有兩個必要套件必須要加入倒WIN32專案中 1. Windows (待會會需要使用到Windows.ApplicationModel) 2. System.Runtime.WindowsRuntime (少這個套件的話 await connection.OpenAsync(); 會報錯) 加完套件後Reference如下 Program.cs 建立App service 連線 處理UWP的請求 完整程式碼 https://github.com/andy51002000/UWP-appservice-communicate-win32.git

[Azure APP Service] C# ASP.NET 讀取應用程式設定, Get value from APPSettings

前言 通常開發WEB服務時, 對於一些比較敏感的資訊, 我們會盡可能的不要寫死在程式碼裡(如資料庫帳密以及某API的ACCESS KEY)避免資訊外流的問題發生 又或是說, 當程式呼叫的某些REST API 有分正式與開發的版本的時候, 如果Endpoint是寫死在程式碼裡面, 絕對是非常非常的不方便, 開發的時候改成開發的, 上線前還要再改回來, 然後重新編譯 一般而言, 我們可以將這些資訊保存在外部檔案中,  Runtime的時候再來取得這些資訊 又或是將這些資訊寫在環境變數之中, 等Runtime的時候再來取得這些資訊 若你的WEB服務是部屬在 Azure App Service的話, 我們可以善用Application Settings這項功能, 我們可以將想要存的都寫在裡面 列如: 假設Application Settings 裡定義了BOT_NAME 以及 PROJECT_ID 我們可以使用以下程式碼來取值 System.Configuration.ConfigurationManager.AppSettings[] 首先, Step 1. Add Reference Step 2. Import Configuration           using System.Configuration; Step 3. Get Value 假設我們要取PROJECT_ID的值, 那程式可以這樣寫              var  ProjectId =  System .Configuration.ConfigurationManager.AppSettings[" PROJECT_ID "]                                        ??...

[UWP] 實作Oauth 2.0登陸取得AMAZON使用者帳戶資訊

前言: 有玩過臉書的人一定有過以下經驗, 當我們想在臉書上完算命或心理測驗的小遊戲時 就會被要求先登錄臉書的在後才能使用該服務, 這就是臉書的Oauth 2.0 認證機制 透過臉書提供的API讓程式導引使用者做認證, 進一步的授權給程式去取得使用者的資料 而Amazon也有提供類似的服務 首先 到Login With Amazon 註冊應用程式 Step 1. 打開Amazon Developer Console https://developer.amazon.com/home.html Step 2. 選擇 App Service/ Login With Amazon Step 3. 註冊應用程式 註冊完後會得到 Client Id 以及 Client Secret如下 Step 4. 設定Redirect Url 選擇Web Settings, 在Allowed Return Urls填入 https://localhost UWP 的部分 以Amazon提供的API取得access token API 規則 https://www.amazon.com/ap/oa?client_id=YOUR_CLIENT_ID &scope=profile &response_type=token &redirect_uri=https://localhost 程式範例: 取得Amazon使用者資料 API 規則 https://api.amazon.com/user/profile?access_token=YOUR_ACCEES_TOKEN 程式範例: DEMO: 點擊 Login 點擊Show user data 若需要完整的程式碼也可以到以下的網址下載 完整程式碼