克服GET 請求期間的斜杠URL 編碼困境
嘗試將HTTP GET 請求發送到包含百分比編碼的URL斜杠(/ ),例如“http://example.com//”,常見的方法是將WebClient類別用作如下:
using (WebClient webClient = new WebClient()) { webClient.DownloadData("http://example.com/%2F"); }
但是,這種方法會導致意想不到的結果。斜杠字元在傳輸過程中會轉換為額外的斜杠,導致發送以下請求:
GET // HTTP/1.1 Host: example.com Connection: Keep-Alive
透過HTTP/GET 使用OCSP 時會出現此問題,這需要傳輸實際的/ 而不是'/ ' 以確保協議合規性。
一個潛在的解決方案
雖然不理想,但以下程式碼片段提供了該問題的解決方法:
Uri uri = new Uri("http://example.com/%2F"); ForceCanonicalPathAndQuery(uri); using (WebClient webClient = new WebClient()) { webClient.DownloadData(uri); } void ForceCanonicalPathAndQuery(Uri uri){ string paq = uri.PathAndQuery; // need to access PathAndQuery FieldInfo flagsFieldInfo = typeof(Uri).GetField("m_Flags", BindingFlags.Instance | BindingFlags.NonPublic); ulong flags = (ulong) flagsFieldInfo.GetValue(uri); flags &= ~((ulong) 0x30); // Flags.PathNotCanonical|Flags.QueryNotCanonical flagsFieldInfo.SetValue(uri, flags); }
此解決方法涉及修改Uri 物件的內部標誌以強制CanonicalPathAndQuery,確保在傳輸過程中保留斜線字元。
免責聲明
需要注意的是,這種方法不保證與未來版本相容框架的。修改內部類別行為時始終謹慎行事。
以上是如何防止 URL 編碼修改 GET 請求中的百分比編碼斜線?的詳細內容。更多資訊請關注PHP中文網其他相關文章!