發表文章

[.NET Webform]_MasterPage應用_化重複為統一化局部為彈性(二)搭配Menu選單控件

圖片
 上一篇的筆記介紹 [.NET Webform]_MasterPage應用_化重複為統一化局部為彈性(一)基本介紹 https://coolmandiary.blogspot.com/2020/10/net-webformmasterpage.html 新增一專案 首先新增好一Master 主版頁 選擇 使用主版頁面的WebForm(視窗圖示) 新增好一Style 目錄 並將寫好的css樣式放入 檔名:Site.css Site.css 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194...

如何對SELECT TOP @topN 做參數傳入查詢_Incorrect syntax near '@topN'問題排除

  由於直接 SELECT TOP @topN ..... 這樣子搭配ado.net 執行會一直報錯 Incorrect syntax near '@topN' 因此經上網查才發現要多加一組括號....(還滿多人遇到的) SELECT TOP (@topN) ..... 但是如果只是單純這樣改仍有機會碰到錯誤 The number of rows provided for a TOP or FETCH clauses row count parameter must be an integer. 必須強制轉型讓其被識別為INT SELECT TOP (cast(@topN as int)) ..... Ref: SQL: How do I use parameter for TOP like in SELECT TOP @amount? [duplicate] https://stackoverflow.com/questions/1936496/sql-how-do-i-use-parameter-for-top-like-in-select-top-amount The number of rows provided for a TOP or FETCH clauses row count parameter must be an integer https://stackoverflow.com/questions/59981346/the-number-of-rows-provided-for-a-top-or-fetch-clauses-row-count-parameter-must Issue using variable and TOP clause https://stackoverflow.com/questions/11420535/issue-using-variable-and-top-clause

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/...

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 Fr...