跳到主要內容

發表文章

目前顯示的是 2019的文章

如何佈署Python Web 服務 - How to deploy Flask web app with WSGI + Nginx

需要 Gunicorn Nginx Step 1. 部屬Flask app程式碼 複製程式碼到指定位置 e.g /var/www/flaskapp $ sudo mkdir /var/www/flaskapp $ sudo chmod 777 /var/www/flaskapp Step 2. 安裝WSGI Server (Gunicorn)  安裝 sudo apt-get install gunicorn or pip install gunicorn Step 3. 安裝web server (Nginx) sudo apt-get install nginx 設定 sudo vim /etc/nginx/site-avalidable/default 將內容改成如下 server {     listen 80;     server_name 10.36.172.142; # external domain name     location / {         proxy_pass http://0.0.0.0:5678 ; # point to gunicorn host address         proxy_set_header Host $host;         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;     }   } 啟動 sudo service nginx restart Step 4. 啟動Gunicorn gunicorn -w 4 -b 0.0.0.0:5678 {主程式檔名}:{flask實體名稱} 假設我們主程式叫做main.py內容如下 from flask import Flask app = Flask(__name__) if __name__ == '__main__':  

何謂 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

Cookie與Session的差別 - Difference Between Cookie and Session

前言  HTTP是個Stateless的協議, 意思是說Client端發請求時, 並無法得知上一個請求的結果, 比如說做完登陸後, 網頁跳到了商品頁面時, 系統怎麼知道使用者登錄過了, 所以我們需要一種方式來儲存資料 粗略的講Cookie和Session是一種資料儲存的方式, 用來紀錄使用者在某特定網站下的活動資訊, 讓無狀態的HTTP協議擁有記憶的能力 Cookie  將在資料存在Client Side, 可以被看, 被改(除非用Signed Cookie, Server side拒絕改過的cookie), 屬於較不安全的儲存方式, 所以通常用來存放敏感度低的資料, 像是Remember Me的資訊 若要防止Cookie被竄改的話, 可以用簽章的方式確認資料是否被更動過, 而Server Side發現簽章有問題時再拒絕請求 基本上簽章的數位長度足夠的話,也不太需要擔心被偽造 Session  將資料存在Server Side上, 相較於Cookie來說算是比較安全的儲存作法 通常Server Side會返回一組Session Id 給Client存到Cookie裡面, 接下來的請求會根據Id去把先前存放的資訊給挖出來  儲存 Session 有下列方法:  1. Memory  2. Cookie  3. Cache  存Memory 會有Memory Leak的風險, 存Cookie會使的請求傳輸量變大, 所以通常正式環境主要還是存在Redis Cache中

使用MSBuild來自動化編譯及部屬ASP.NET Web應用程式到 Azure

Title: How to use MSBuild to deploy your .NET Web Application on Azure 前言 對於開發人員來說, routine的事情能夠自動化就自動化, 比如說編譯程式, 或是發布程式等等, 這些自動化之後, 才能將更多的專注力放在程式開發上, 以下就是介紹如何使用 MSBuild 來佈署.NET Framework的程式到Azure App Service上 MSBuild 用來佈署.Net framework到Azure 上的工具, 可以透過安裝Visual Studio來獲得, 使用方式如下: MSBuild <solution的位置> /p:DeployOnBuild  /p:PublishProfile /p:Password MSBuild 需要吃一個Publish Profile才能正常運作, 以下教學將會演示如何編輯Publish Profile, 並且使用 MSBuild 來做編譯以及佈署 必要條件 需要安裝Visual Studio 需要在Azure App Service建立服務   需要取得佈署帳密(Publish Profile) 需要安裝Azure Cli az webapp deployment list-publishing-profiles --name YOUR-APP-NAME --resource-group YOUR-RESOURCE-GROUP Step 1. 下載佈署範本 $appSolutionDeploymentProfile = ".\production.pubxml" wget https://gist.githubusercontent.com/andy51002000/37a0af3fec1caf2955f109c0b583b3e3/raw/9b2105abd05a304b8ea6045fe78c8de781f4d0a2/publish.pubxml -OutFile $appSolutionDeploymentProfile Step 2. 開始來編輯Publish Profile的內容 宣告一些變數

簡易教學-如何使用burp proxy來攔截封包

Title: How to Use Burp Suite 前言 嗨~ 大家好, 今天要分享如何在Windows 10上使用Burp Suite來攔截封包, 以及進一步地演示如何修改HTTP請求的內容, 希望這篇文章可以幫助到同為網頁開發者的朋友或是正在學習資訊安全的朋友們 首先, 下載 & 安裝 Burp Suit Community https://portswigger.net/burp/communitydownload Step 1. 打開Burp Suit建立暫時用的專案(Temporary Project) 一直下一步 > 最後選擇 Start Burp Step 2. 設定Proxy 在鍵盤上按下Windows鍵 > 輸入Proxy > 按下Enter 進入設定頁面後, 把Proxy Address 和 Port 的資訊填上, 如下 基本上, 環境都設好了 ... 接下來, 要試看看有沒有成功攔截封包 測試 沒有測試環境的朋友, 可以使用以下網站來當練習的對象,  雖然這網站主要目的是讓人學習XSS相關技術用的, 但由於它提供了一個非常簡單的表單功能, 所以很非常適合讓我們用來模擬POST請求 網站:  http://xss-quiz.int21h.jp/ 按下Search後, 可以在 Proxy > Intercept 裡看到剛剛表單送出的參數 lady gaga 修改請求內容 我們當然也可以滑鼠左鍵去修改表單內容 最後按下Forward將請求送出 結果 由於剛剛的請求內容被植入了一段javascript的程式碼, 所以結果會出現一個alert

Azure Logic Apps 如何設定Timeout來限制Action的執行時間: Logic App Timeout

Title: how to set timeout in Azure Logic App 前言 對開發人員來說, Logic Apps是個非常好用的工具, 特別是有DevOps需求, 或是想做自動化的開發者來說, 可以節省許多時間寫一堆Code或是腳本去串接服務 設計Logic Apps 直接在Azure Portal上定義Action的種類, Input是什麼就好了, 底層的事情就交給Azure 來幫我們處理 比如說, 我們可以設一個排程, 每隔一段時間就發個請求去搓一下某個Service是否還活著 Timeout 在某些情況下, 我們可能不希望Action的執行時間過長, 假設我們預期最多不超過10秒, 但因為訪問的端點有可能發生異常, 造成Actionc還傻傻地等待Server的回應 這種情況我們可以設Timeout讓Logic App把超時的Action殺掉 首先, 右鍵 > 選擇Settings Step 2. 找到Timeout的欄位設定Duration 這邊要注意填入的時間要使用ISO 8601 的格式 ISO 8601的規則  P (Period) T(duration) H (Hour) M(Minute) S(Second). 如果Timeout想設20秒的話可以表示成PT20S 設定好之後選擇Done ... 接下來就可以存檔跑看看結果了 ... 結果 如果有成功跑完的話, 會出現綠色小勾勾, 但如過被Timeout的話就沒有

如何從Azure DevOps Pipeline寄信給指定對象 - Send email notification in an Azure DevOps pipeline

前言 當Pipeline要結束的時候, 通常大家都會希望系統可以自動寄信去通知相關人員, "程式已經Build好了"或是"程式已經上線了"等等 網路上可以找到的方法一般都是用Send Mail的Task去作這件事 這些方法都要設定SMTP, 而我自己試的結果是一直卡在權限以及安全性的問題使的Gmail總是拒絕我的請求 後來發現有個更簡單的方法, 就算不懂SMTP也可以的設定, 也可以做到相同的事情 就是使用Azure上的SendGrid來幫我們寄信 設定步驟如下 Step 1. 建立SendGrid 首先需要在Azure 建立一個SendGrid的資源 填入帳號密碼, 然後選擇付費方式, 基本方案是不用錢的 Step 2. 取得API Key 資源配置完成之後, 就可以點進去到以下的頁面 選擇Manage進入管理頁面後可以在Settings下方找到API Keys, 我們可以在這邊建立API Key然後再把API Key記下來 Step 3. 設定Pipeline 回到Azure DevOps頁面去設定Pipeline 在右邊的搜尋欄上敲"SendGrid" 就可以找到相關的Task並安裝, 安裝完之後就可以把他加進Pipeline 接下來就填一下API Key, 寄件對象, 內容之後就差不多了 點選上方存檔然後開始跑Pipeline

[簡易教學] 如何使用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就會跑起來做事 結果 如果一切順利的話, 可以看到類似以下的結果

[簡易教學] 五分鐘內學會使用Gitlab Pipeline作CI

前言 現在的Gitlab加入越來越多功能, 開發者除了可以用Gitlab作原始碼的遠端儲存庫之外, 也可以用它來作Continuously Integration(簡稱CI) 以下內容示範如何使用Gitlab Pipeline作CI 1. 開案 ( Create a Project on Gitlab ) 開案成功之後會得到儲存庫的位址, 以及設定git環境的相關指令 2. 設定工作目錄 使用以上的指令來設定git遠端儲存庫的位址 3. (Optional) 加入一些檔案 這裡以Node.js程式為例, 建立一個index.js檔案, 內容就讓它印Hello world就好 echo "console.log('Hello world')" > index.js 4. 加入腳本.gitlab-ci.yaml 我們必須加入腳本告訴gitlab去執行什麼工作 image: node:8.9-alpine stages: - buildMyApp buildApp: stage: buildMyApp script: - echo "start my job" - node index.js image : 由於CI是跑在Container內執行的, 若對runtime的環境有特別要求的話, 可以指定相應的docker image來起Container stages : 由於CI是分階段循序進行的, 我們必須把CI中的每個階段定義在這邊 buildApp : 定義任務的內容, 這邊要指定任務屬於哪一個階段 我們可以在script底下定義buildApp這個任務應該要執行什麼動作 (預期一開始先印出start my job, 然後執行Node.js 程式去印Hello world) 5. 上傳 $git add -A $git commit -m "add some file" $git push origin master 6. 最後來看結果 程式碼Push上去之後就可以進到底下頁

[ 解決方法] 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 也可以正常的被呼叫

[WIX]如何移除安裝成功的視窗

Windows Installer XML Toolset 簡稱WIX, 可以用它很輕易的設計一個Windows 程式的安裝檔 一般而言使用WIX套件做出來的安裝檔,  在安裝完畢後會有一個安裝成功的視窗, 若不希望出現這個視窗, 可以修改ExitDialog.wax裡面的屬性如下 < InstallUISequence >               < Show Dialog = " ExitDialog " OnExit = " success " Overridable = " yes " > 0 </ Show > </ InstallUISequence > < AdminUISequence >               < Show Dialog = " ExitDialog " OnExit = " success " Overridable = " yes " > 0 </ Show > </ AdminUISequence >

如何在Container裡使用GPU

How to use GPU in docker container 前言 基本上原生的docker 容器是無法使用GPU資源 解決方法 必須使用NVIDIA的 Docker才可以讓容器吃到GPU的資源 以下是在Ubuntu上的安裝步驟 Step 1. (Optional) 安裝驅動 如果GPU的驅動已經裝好了化可以先略過這一步 sudo ubuntu-drivers autoinstall 安裝完之後可以用以下指令確認有沒有裝成功 nvidia-smi Step 2.  安裝 CUDA CUDA是個運算架構能夠輕易地時線平行運算 wget https://gist.githubusercontent.com/acerkr71a/29ecd032eeb178888fec0bb7660cc3bf/raw/03df656e945d7c56ee2d454e0ea83796e8eacfeb/install-cuda.sh && chmod +x installer.sh && ./installer.sh Step 3. 安裝NVIDIA 的 Docker wget https://gist.githubusercontent.com/acerkr71a/7c19e940f4029d86476309d63950d750/raw/a7f368c800b4ef2e23559ef5f13f97a540dc4499/install-nvidia-docker.sh && chmod +x docker-installer.sh && ./docker-installer.sh

手把手教學, 十分鐘內快速建立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 複製在步驟三取得的