發表文章

目前顯示的是 4月, 2021的文章

C#處理XML大檔案遇到的多重宣告問題(這不是預期的 XML 宣告)_記憶體不足處理_未預期的結束標記

圖片
  首先在一開始遇到的主要是有多個宣告出現在同一篇XML檔案中 由於遇到的需求是要我去解析匯入一個XML大檔案(平均超過700MB以上) 包含多份專利檔案 在一開始遇到的Exception 錯誤就是 這不是預期的 XML 宣告。XML 宣告必須在文件的第一個節點,且不允許在其前方出現空白字元。 通常一份XML只能有一個 <?xml version="1.0" encoding="UTF-8"?> 的宣告 有重複多個是不合法的XML格式 How to load XML File Source with multiple XML Declaration https://answers.sap.com/questions/12229327/how-to-load-xml-file-source-with-multiple-xml-decl.html 因此一開始想到的策略就是一開始 不要直接先用XML API Load(string xml_path)進來(傳入的參數為一XML檔案路徑) 改先將重複宣告的這一句 <?xml version="1.0" encoding="UTF-8"?> 給取代掉 統一只在最一開始加上這一句宣告就好 結果 由於大檔案關係一次取代會導致記憶體不足 遇到的第二個例外錯誤 System.OutOfMemoryException 這裡已經測試過直接一口氣Load到記憶體存的 例如MemoryStream XML API Load 跟 LoadXml都是不可行的 只能改成一行一行讀取的方式(不要一次讀進內存) 因此未來必須捨棄掉對XmlDocument 仰賴XPATH 相關API (SelectNodes,SelectSingleNode)作法 .NET XML API 中 XmlTextReader 、 XmlReader (XmlTextReader 的抽象Base Class)雖能夠一行一行讀取 使記憶體不足問題得以克服但又會遭遇到 這不是預期的 XML 宣告。XML 宣告必須在文件的第一個節點,且不允許在其前方出現空白字元。 當讀取到重複宣告的該行就又會報此錯 我希望當滾while一行一行讀取時候當出現此例外就continue來忽略 直接做

經得起原始碼資安弱點掃描的程式設計習慣培養(四)_1.Injection注入攻擊_SQL Injection_order by 語句正確參數化套入

圖片
  接續前幾篇系列 經得起原始碼資安弱點掃描的程式設計習慣培養(一)_OWASP Top 10(十大網站安全風險)_學習寫更安全程式碼的網站推薦 經得起原始碼資安弱點掃描的程式設計習慣培養(二)_8.Insecure Deserialization :不安全的反序列化漏洞ASP.NET處理方式 經得起原始碼資安弱點掃描的程式設計習慣培養(三)_7.Cross Site Scripting(XSS)_Stored XSS_Reflected XSS All Clients 在專案不斷去累積具有資安程式撰寫設計習慣更上一層樓 於近期又被掃到程式寫的部分具有高風險 而且是在SQL部分注入的風險 這就令人納悶因為早已知道要遵照Parameter來防止這種安全問題才對 查閱了報告後才得知 原來其中一段在order by 由於採用變動帶字串取代方式的可變動設計 但忽略了參數化處理 這裡要小心只要是用字串格式化串接外部傳入的變動內容的方式來產生 SQL 語句就一定會有 SQL injection的風險! 此外除where 語句部分也可能在order by 語句部分發生 只是打從 娘胎 痾不是我是說從開始寫.net以來好像沒看過有人參數化是 直接套入order by [@FieldName] [@SortDir(asc/desc)] 來試試看好了果真會報錯 (。ŏ﹏ŏ) 而比較正確設計方式就是利用  CASE WHEN 排序方向 + CASE WHEN 排序對應欄位 來自己寫入對應order by 後續指令字串 外部傳入的參數則用於條件分支判斷而已 Ref: [如何提升系統品質-Day20]Security - SQL injection https://ithelp.ithome.com.tw/articles/10080209 “Order By” using a parameter for the column name https://stackoverflow.com/questions/13844678/order-by-using-a-parameter-for-the-column-name How do you ORDER BY a parameter? https://dba.stackexchange.com/questions/4104/how-do-yo

C#文字取代時候遇到的坑_ADO.NET如何獲取已串入參數值的SQL指令字串

圖片
  常用ADO.NET的開發者 不免就會遇到維護上時常會因為要偵錯程式兜出來的SQL Statement 而會有需要看運行時期到底錯在哪 這時會突然感覺微軟的ADO.NET實在是有點美中不足 不支援直接獲取串入Parameter後的最終SQL 指令字串 (NodeJs的MySQL api則有支援這種功能啊...) 所以還要自己後製取代處理 這作法參考StackOverFlow上人家提供的土法煉鋼解法 A way to see query after parameters are applied? https://stackoverflow.com/questions/7772815/a-way-to-see-query-after-parameters-are-applied 不過直接用Replace就會遇到一個可怕潛在的BUG 右邊是被取代後的最終SQL指令字串 可以看到由於Parameter Name有一個剛好是符合其他Parameter Name某部分子字串 使取代出現異常 建議改採用Regex來做 Full Match 字串的取代 還有在取愛過程要做一些跳脫字元處理 此外Regex 取代 "@...."   at symbol起始的字測試起來沒辦法match 所以在之前先取代成p_ 前墜 使其一定是唯一參數欄位名稱 1 2 3 4 5 6 7 string qryText = sqlCmd.CommandText; foreach (SqlParameter p in sqlCmd.Parameters) { string isQuted = (p.Value is string ) ? "'" : "" ; qryText = Regex.Unescape(Regex.Replace(Regex.Escape(qryText.Replace( "@" , "p_" )), @"\b" + p.ParameterName.Replace( "@" , "p_" ) + @"\b" , isQuted + Regex.Escape(p.Value

Entity Framework筆記(一)_EF歷史與簡介_Code First_Migration指令操作與EF API使用

圖片
撇除微軟平台ORM工具 EF 我們先來了解ORM Tools帶來的效益 在各種程式語言(Java,Php,C#...)中都有類似工具與框架 用來提供在compile階段就能有type safe的保證機制 協助開發者透過物件導向方式在對DB進行相關存取與操作 .NET ORM 框架工具 EF 是一套對於.Net的ORM框架,而EF Core則是針對.Net5(.Net Core)的延伸。 ORM(Object-Relational Mapping)可以理解為關聯式資料庫和物件之間根據某種規則而建立的一套映射關係,取代底層資料庫操作而透過物件的coding來操作,主要都是透過物件的形式在做DB存取更新刪除的相關操作。 其他ORM框架像是Dapper , NHibernate都是其中一種。  EF是由微軟推出的一種ORM框架自5.0過後就變為open source了 主張透過類似操作Object方式來控管DB .NET Framework 發展時間軸 EF的發展時間軸 早期的第一版EntityFramework 從visual studio 2008開始(.net 3.5 sp1) 只有提供 Design-First模式 直到visual studio推出2010版本相應.net 4.0一併推出 Entity Framework第四版 多出所謂的Code First 以及 POCO ( P lain O ld C lass O bject)等觀念 POCO 有點跟DTO概念類似 就是藉由傳統的Class來對應DB結構做設計,簡化EF開發過程。 EF會自動處裡相應轉換 直到.net4.0之後的發展(vs2012開始 .net 4.5的釋出) 從EF5開始的版本都能直接透過Nuget來額外安裝 別於以往相依在.net framework 的package當中 主要分成如下三種開發型態 (一)GUI拖曳方式的 Database-First:從既有的資料庫藉由GUI精靈產生EDMX檔案(xml格式的檔案), Model-First:產生Entities , relationships 跟 繼承階層 (二)OOP方式的 Code-First:優先開始撰寫Class 各自使用時機 .NET 3.5之前的開發上 開發者習慣透過ADO.NET進行資料庫程式開發 Entity Framew

Angular使用筆記4_專案目錄架構

圖片
  首先最上層三種目錄 e2e - 端到端的測試項目, 用於自動化測試 node_modules - 存放第三方的依賴套件 src - 主要大部分開發用的程式碼(css,typescript...) 在主要開發用的 ./src/ 目錄下 ./app/ - 整個網頁應用程式的 Module、Component、Service ....都放置於此。 ( 不含E2E 測試的程式碼) ./assets/ - 靜態資源放置處,如圖片、資料檔... ./environments/ - 存放angular 環境配置文件(環境變數設定檔) 建立專案時就會自動建立兩檔案,environment.ts 與 environment.prod.ts。 全系統的環境變數都會需要透過這兩檔案來設定。 browserslist - 檔案內其實有說明,大意就是 Angular 的編譯器會根據此檔案的設定來加上 CSS 的前綴,若有 IE 11支援相容需求,需要取消最後一行的註解。 test.ts - 跟 main.ts 檔類似,主要是用在測試檔上。 karma.conf.js - karma 單元測試配置文件 angular.json - CLI的配置文件 package.json - 就是跟我們NodeJs應用一樣的NPM相依套件配置文件

Angular使用筆記3_CLI使用_創建並啟動我們第一支AngularApp

圖片
 ng version Outputs Angular CLI version. ng version [options] ng v [options] ng new Creates a new workspace and an initial Angular application. ng new <name> [options] ng n <name> [options] ng serve Builds and serves your app, rebuilding on file changes. ng serve <project> [options] ng s <project> [options] ng build Compiles an Angular app into an output directory named dist/ at the given output path. Must be executed from within a workspace directory. ng build <project> [options] ng b <project> [options] Angular CLI 起手式 ng new proj_name --skip-install cd proj_name npm install ng serve ng new myapp --skip-install (注意若沒按照順序先把該有的相依套件透過npm install下來會跑出紅色一串錯誤) 而由於我們一開始選擇的是後面多加--skip-install的動作因此之後才有多出這一步驟 等執行完ng serve之後出現上面這種畫面資訊, 打開瀏覽器於網址輸入 localhost:4200  就可以看到我們自己新建的Angular App Ref: https://angular.io/cli Could not find module “@angular-devkit/build-angular” https://stackoverflow.com/questions/50333003/could-not-find-module-angular-devkit-build-angula