透過SSE的方式,使用open ai的api服務,但不希望把api key值寫在程式碼中,
利用環境變數的方式來取得,例 api_key = os.environ.get("OPENAI_API_KEY")
.env 檔放在根目錄,內容也無誤,但還是抓不到值。
原因在於
from dotenv import load_dotenv
在呼叫os.environ.get("OPENAI_API_KEY")程式碼前先執行 load_dotenv() 即可。
透過SSE的方式,使用open ai的api服務,但不希望把api key值寫在程式碼中,
利用環境變數的方式來取得,例 api_key = os.environ.get("OPENAI_API_KEY")
.env 檔放在根目錄,內容也無誤,但還是抓不到值。
原因在於
from dotenv import load_dotenv
在呼叫os.environ.get("OPENAI_API_KEY")程式碼前先執行 load_dotenv() 即可。
透過 Server-Sent Events, SSE 把資料往前端送的時侯,很有可能會發生處理 Markdown 格式無法正確顯示。
但是實際上我們從後端(server端)送出的資料格式是正確的,
但前端顯示的Markdown 處理,在針對換行、標記符號(如 * 或 **),可能無法正確呈現。
有換行,所顯示出來的內容是正常的
沒有換行符號,格式不正確
微軟釋出新的SQL Server資料連接程式後,原先System.Data.SqlClient除重大變更外已經很少更新,目前(2024/1月)最新版本是4.8.6,上次更新已經是2022年/11月,這四年內只更新了5次。
想讓專案走得長久,是可以考慮換成Mircosoft.Data.SqlClient ,他是System.Data.SqlClient的新版本,程式只需要變更using參照引用之外,自行開發的程式碼基本上是不需做什麼大異動。
更新完後,雖然程式碼compiler成功,但執行過程中確出現「憑證鏈結是由不受信任的授權單位所發出的」錯誤,原因在於原先System.Data.SqlClient預設加密憑證OFF,而Microsoft.Data.SqlClient預設會啟用加密憑證,所以執行時會驗證憑證,而大多數的SQL雖然支援TLS加密,但大部份都是自簽憑證,所以就會丟出失敗訊息。
解決方法:除了可以在我們資料庫連線字串(通常在appsettings.json中),加上;TrustServerCertificate=true來強制用戶端信任憑證不進行驗證。或是直接在程式中判斷並加上TrustServerCertificate參數(請參考暗黑大的做法)。
.NET Core 目前大多都是透過相依性注入(Dependency Injection)的方式來有效管理程式碼,方便大家在program.cs中先建置.NET Core 程式專案的一些基本設置,像是相依性插入 (DI)、設定、中介軟體等,當專案一啟動時就被建置或設定。
通常大家會習慣將一些資訊記錄有appsetting.json檔中,像是資料庫的連線,.NET Core初期仍需要安裝Microsoft.Extensions.Configuration 套件,來取得appsetting.json內容,以 .NET Core 6 為例,後期的.NET Core已經內建Configuration。
目前遇到的例子是,早期自行撰寫的共用物件(DBUtil)已經在各程式中被廣泛引用,目前先不打算異動原來的程式碼,原因是如果一改的話,所有有呼叫到的程式都要修改,所以我們並非透過相依性注入(Dependency Injection),而是透過中介的靜態類別,像建立一個Single Object 。
作法:在program.cs中先設置好Configuration並取得appsetting.json的資料庫連結資訊,再把Configuration傳遞到手動新增的靜態類別ConfigurationHelper中,最後在共用物件(DBUtil)的建構子中來取得Configuration。
1.先新增一個靜態類別叫ConfigurationHelper
2. 在Program.cs中,完成Configuration的設置(例如取得appsetting.json內的資料庫連線資料),接下來再把Configuration傳遞到剛剛建立的ConfigurationHelper靜態類別中。
.NET Core 目前大多都是透過相依性注入(Dependency Injection)的方式來有效管理程式碼,以 .NET Core 6 為例,可以在program.cs中先建置.NET Core 程式專案的一些基本設置,像是相依性插入 (DI)、設定、中介軟體等,當專案一啟動時就執行。
目前遇到的例子是,早期寫好的共用物件(DBUtil)已經在各程式中被廣泛引用,目前先不異動原來的程式碼(以前有用DI就不會有這問題),而不是透過相依性注入(Dependency Injection)的方式來取得。
作法:在program.cs中先設置好Configuration並取得appsetting.json的資料庫連結資訊,再把Configuration傳遞到手動新增的靜態類別ConfigurationHelper中,最後在共用物件(DBUtil)的建構子中來取得Configuration。
1.先新增一個靜態類別叫ConfigurationHelper
2. 在Program.cs中,完成Configuration的設置(例如取得appsetting.json內的資料庫連線資料),接下來再把Configuration傳遞到剛剛建立的ConfigurationHelper靜態類別中。
3. 最後在我們自已的公用程式物件,在建構子來取得靜態類別ConfigurationHelper來取得需要的內容,透過Configuration.GetConnectionString的方式來存取appsettings.json的連線資訊。
.NET Core 目前大多都是透過相依性注入(Dependency Injection)的方式來有效管理程式碼,以 .NET Core 6 為例,可以在program.cs中先建置.NET Core 程式專案的一些基本設置,像是相依性插入 (DI)、設定、中介軟體等,當專案一啟動時就被建置或設定。
目前遇到的例子是,早期寫好的共用物件(DBUtil)已經在各程式中被廣泛引用,目前先不異動原來的程式碼(以前有用DI就不會有這問題),並非透過相依性注入(Dependency Injection)來取得,而是透過一個中介的靜態類別。
作法:在program.cs中先設置好Configuration並取得appsetting.json的資料庫連結資訊,再把Configuration傳遞到手動新增的靜態類別ConfigurationHelper中,最後在共用物件(DBUtil)的建構子中來取得Configuration。
1.先新增一個靜態類別叫ConfigurationHelper
2. 在Program.cs中,完成Configuration的設置(例如取得appsetting.json內的資料庫連線資料),接下來再把Configuration傳遞到剛剛建立的ConfigurationHelper靜態類別中。
3. 最後在我們自已的公用程式物件,在建構子來取得靜態類別ConfigurationHelper來取得需要的內容,透過Configuration.GetConnectionString的方式來存取appsettings.json的連線資訊。
系統中用太舊的版本JQuery會有資安風險的問題,舊版(尤其是1.12以前)的JQuery或許有一個或多個弱點,
要怎麼知道自已是用什麼版本的JQuery,先到Chrome的console mode輸入 jQuery.fn.jquery
接著我們使用「jQuery Migrate 」工具,來分析程式中需要修正的語法,
畢竟不同的版次語法有一些已經停用,參考以下「jQuery Migrate 」做法
https://github.com/jquery/jquery-migrate/#readme
X-Frame-Options 標頭用來阻擋 Clickjacking (點擊劫持) 這個行為
有三種情境可以設定
在IIS主機中HTTP回應標頭中加入即可
完整仔細的介紹可以參考黑暗大的blog
伺服器主機或是開發平台的資訊遮蔽,在於減少風險或是惡意攻擊的發生,尤其是程式版本或主機資訊的揭露有可能會引來惡意使用者的針對性測試或零時差攻擊。
在IIS主機中,可透過「設定編輯器」在system.webServer下的security設定 requestFiltering removeServerHeader="true",來遮蔽相關資訊
"未加密的__VIEWSTATE參數"屬於風險等級-中
這個參數的目地在於,傳統的ASP.NET表單畫面中,如果送出失敗時,不去清空原來輸入的相關欄位內容,按回上一頁後會把之前所輸入的值帶回來,不過這個未加密的參數所造成的漏容可能會洩漏敏感資料。
解決方法:
在web.config檔的 <System.Web>下加入<pages enableViewStateMac="false" viewStateEncryptionMode="Always">
或是在表單程式中加入 <%@ Page EnableViewStateMac="true" %>
這個風險是透過測試IIS主機的短名稱或網址是否存在,像是攻擊者可以透過get指令下類似 https://www.example.com/*~1*/.aspx 這樣的要求,來猜測該網站上的網頁資料夾或是檔案名稱,進一步取得沒有公開曝露的檔案或程式,可能會造成敏感資料的洩漏問題。
解決的方法就是修改機碼 HKLM\SYSTEM\CurrentControlSet\Control\FileSystem\NtfsDisable8dot3NameCreation,值改為 1, 修改完機碼後記得要重開機。
很多人在重開機之後,仍然再次出現404 ERROR(File Not Found ) 這樣就是沒效,請記得要把整個網站刪除,再重新發佈,就可以了。
----
另一個作法,可以直接在.NET Core的Program.cs中進行設定,透過程式的方式來設定。
app.UseFileServer(new FileServerOptions() {
某次的作業系統安全性更新後,系統服務發生錯誤,開始查不到原因,原以為是程式問題,
到作業系統事件檢視器中發現 " Failed to decrypt using provider 'RsaProtectedConfigurationProvider' "的問題,
--訊息內容如下---
InvalidOperationException 型別 WebMatrix.WebData.PreApplicationStartCode 上應用程式的啟動前初始設定方法 Start 擲回例外狀況,錯誤訊息為: 無法使用提供者 'RsaProtectedConfigurationProvider' 解密。來自這個提供者的錯誤訊息為: 參數錯誤。 (C:\發佈的系統目錄\web.config line 12)。
發生原因:因原先將webconfig的connectionStrings進行加密,發現在RSA解密過程中發生錯誤
問題排除:我們先把webconfig改回為明文(沒有加密過),再重啟IIS,測試正常,沒有再發生錯誤。
新增專案的一年後,最近在執行專案時出現 NET::ERR CERT AUTHORITY INVALID 的憑證過期訊息,
即使清除再重發憑證,或是手動刪除「管理使用者憑證」及「管理電腦憑證」後再重新發證,
檢查了整台電腦的localhost憑證,最後發現瀏覽器主機的憑證還是舊的!
環境:Microsoft Visual Studio 2022
專案:.NET Core 7
原因:localhost憑證過期
一開始用讀取css的方式來設background 屬性來設定
後來因需要動態變換圖檔,因此把css轉換成class的方式在jsx裏面
但發現有部份的屬性沒辦法正常顯示,像是backgroundSize...之類的
解決方法,把原來background的相關屬性都各別拆開,不要寫在同一行的background裏面
// header底圖的css語法
const BgImageStyle = {
原來專案的是bootstrap3的版本,有一些畫面想升級到bootstrap5
在載入js的 @Scripts.Render("~/bundles/bootstrap5") 出現 「並未將物件參考設定為物件的執行個體」。
解法 把 "new ScriptBundle" 改為 "new Bundle"
// 原來 bootstrap3 js
bundles.Add(new ScriptBundle("~/bundles/bootstrap").Include("~/Scripts/bootstrap.min.js","~/Scripts/respond.min.js"));
// bootstrap5.1.3 js
bundles.Add(new Bundle("~/bundles/bootstrap5").Include("~/Scripts/bootstrap-5.1.3/bootstrap.bundle.min.js"));