Шифрование модуля строки запроса не работает должным образом
Я создал страницу входа в систему с какой-то простой функцией SQL-запроса и пытаюсь зашифровать строку запроса URL-адреса, но, похоже, с ней есть какая-то проблема, каждый раз после того, как я использовал свою функцию "кнопка", URL-адрес раскрывается. Могу я узнать, в чем проблема с моим кодированием? Примечание: Я поместил "QueryStringModule" в web config system.web & system.webServer
Вот код QueryStringModule.cs, который я использовал:
#region Using using System; using System.IO; using System.Web; using System.Text; using System.Security.Cryptography; #endregion /// <summary> /// Summary description for QueryStringModule /// </summary> public class QueryStringModule : IHttpModule { #region IHttpModule Members public void Dispose() { // Nothing to dispose } public void Init(HttpApplication context) { context.BeginRequest += new EventHandler(context_BeginRequest); } #endregion private const string PARAMETER_NAME = "enc="; private const string ENCRYPTION_KEY = "key"; void context_BeginRequest(object sender, EventArgs e) { HttpContext context = HttpContext.Current; if (context.Request.Url.OriginalString.Contains("aspx") && context.Request.RawUrl.Contains("?")) { string query = ExtractQuery(context.Request.RawUrl); string path = GetVirtualPath(); if (query.StartsWith(PARAMETER_NAME, StringComparison.OrdinalIgnoreCase)) { // Decrypts the query string and rewrites the path. string rawQuery = query.Replace(PARAMETER_NAME, string.Empty); string decryptedQuery = Decrypt(rawQuery); context.RewritePath(path, string.Empty, decryptedQuery); } else if (context.Request.HttpMethod == "GET") { // Encrypt the query string and redirects to the encrypted URL. // Remove if you don't want all query strings to be encrypted automatically. string encryptedQuery = Encrypt(query); context.Response.Redirect(path + encryptedQuery); } } } /// <summary> /// Parses the current URL and extracts the virtual path without query string. /// </summary> /// <returns>The virtual path of the current URL.</returns> private static string GetVirtualPath() { string path = HttpContext.Current.Request.RawUrl; path = path.Substring(0, path.IndexOf("?")); path = path.Substring(path.LastIndexOf("/") + 1); return path; } /// <summary> /// Parses a URL and returns the query string. /// </summary> /// <param name="url">The URL to parse.</param> /// <returns>The query string without the question mark.</returns> private static string ExtractQuery(string url) { int index = url.IndexOf("?") + 1; return url.Substring(index); } #region Encryption/decryption /// <summary> /// The salt value used to strengthen the encryption. /// </summary> private readonly static byte[] SALT = Encoding.ASCII.GetBytes(ENCRYPTION_KEY.Length.ToString()); /// <summary> /// Encrypts any string using the Rijndael algorithm. /// </summary> /// <param name="inputText">The string to encrypt.</param> /// <returns>A Base64 encrypted string.</returns> public static string Encrypt(string inputText) { RijndaelManaged rijndaelCipher = new RijndaelManaged(); byte[] plainText = Encoding.Unicode.GetBytes(inputText); PasswordDeriveBytes SecretKey = new PasswordDeriveBytes(ENCRYPTION_KEY, SALT); using (ICryptoTransform encryptor = rijndaelCipher.CreateEncryptor(SecretKey.GetBytes(32), SecretKey.GetBytes(16))) { using (MemoryStream memoryStream = new MemoryStream()) { using (CryptoStream cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write)) { cryptoStream.Write(plainText, 0, plainText.Length); cryptoStream.FlushFinalBlock(); return "?" + PARAMETER_NAME + Convert.ToBase64String(memoryStream.ToArray()); } } } } /// <summary> /// Decrypts a previously encrypted string. /// </summary> /// <param name="inputText">The encrypted string to decrypt.</param> /// <returns>A decrypted string.</returns> public static string Decrypt(string inputText) { RijndaelManaged rijndaelCipher = new RijndaelManaged(); byte[] encryptedData = Convert.FromBase64String(inputText); PasswordDeriveBytes secretKey = new PasswordDeriveBytes(ENCRYPTION_KEY, SALT); using (ICryptoTransform decryptor = rijndaelCipher.CreateDecryptor(secretKey.GetBytes(32), secretKey.GetBytes(16))) { using (MemoryStream memoryStream = new MemoryStream(encryptedData)) { using (CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read)) { byte[] plainText = new byte[encryptedData.Length]; int decryptedCount = cryptoStream.Read(plainText, 0, plainText.Length); return Encoding.Unicode.GetString(plainText, 0, decryptedCount); } } } } #endregion }
Вот код моей функции кнопки:
protected void Button1_Click(object sender, EventArgs e) { string sONbr = sONbrTextBox.Text; string SOLine = sOLineTextBox.Text; string SerialNbr = serialNbrTextBox.Text; string PalletID = palletIDTextBox.Text; string PackingListNo = PackingListNoTextBox.Text; string StatusCode = statusCodeComboBox.Text; string PackType = packTypeComboBox.Text; string CrUserID = Request.QueryString["LogInUser"].ToString(); if (string.IsNullOrWhiteSpace(sONbr) || string.IsNullOrWhiteSpace(SOLine) || string.IsNullOrWhiteSpace(PalletID) || string.IsNullOrWhiteSpace(PackingListNo) || string.IsNullOrWhiteSpace(StatusCode) || string.IsNullOrWhiteSpace(PackType)) { status_lbl.Text = "Please fill in all the information."; status_lbl.Visible = true; GridView1.Visible = false; return; } else if (string.IsNullOrWhiteSpace(CrUserID)) { status_lbl.Text = "Please login your account!"; status_lbl.Visible = true; ClientScript.RegisterStartupScript(Page.GetType(), "validation", "<script language='javascript'>alert('Please login your account!')</script>"); Response.Redirect("Login Page.aspx"); GridView1.Visible = false; return; } else { SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["constr_TESTINGSystem"].ToString()); conn.Open(); SqlCommand comm = conn.CreateCommand(); comm.CommandType = CommandType.StoredProcedure; comm.CommandText = "usp_TagNumberUpdate"; comm.Parameters.AddWithValue("@sONbr", sONbr); comm.Parameters.AddWithValue("@SOLine", SOLine); comm.Parameters.AddWithValue("@SerialNbr", SerialNbr); comm.Parameters.AddWithValue("@PalletID", PalletID); comm.Parameters.AddWithValue("@PackingListNo", PackingListNo); comm.Parameters.AddWithValue("@StatusCode", StatusCode); comm.Parameters.AddWithValue("@PackType", PackType); comm.Parameters.AddWithValue("@CrUserID", CrUserID); SqlParameter ReturnVal = comm.Parameters.Add("@return", SqlDbType.NVarChar,200); ReturnVal.Direction = ParameterDirection.Output; comm.ExecuteNonQuery(); string val = (string)ReturnVal.Value; conn.Close(); status_lbl.Text = val; status_lbl.Visible = true; CheckBox1.Checked = false; serialNbrTextBox.ReadOnly = true; serialNbrTextBox.BackColor = System.Drawing.ColorTranslator.FromHtml("#A9A9A9"); serialNbrTextBox.Text = "N/A"; sONbrTextBox.Text = sOLineTextBox.Text = palletIDTextBox.Text = PackingListNoTextBox.Text = ""; GridView1.Visible = false; } } protected void Button2_Click(object sender, EventArgs e) { string sONbr = sONbrTextBox.Text; string SOLine = sOLineTextBox.Text; string SerialNbr = serialNbrTextBox.Text; if (string.IsNullOrWhiteSpace(sONbr) || string.IsNullOrWhiteSpace(SOLine) || string.IsNullOrWhiteSpace(SerialNbr)) { status_lbl.Text = "Please fill in SO #, SO LINE & SERIAL NO to check record."; status_lbl.Visible = true; GridView1.Visible = false; return; } else { status_lbl.Text = "Inquiry Successful!"; status_lbl.Visible = true; GridView1.Visible = true; } }
ZurdoDev
Вы пытаетесь зашифровать всю строку запроса или отдельные значения?
Alvan Khong
Вся строка запроса.
ZurdoDev
Я не понимаю, что вы имеете в виду, когда после вашей функции кнопки url-адрес раскрывается. Я думаю, вы имеете в виду, что вы нажимаете кнопку, и url-адрес кратко отображается? Если это так, я не думаю, что вы можете обойти это. Это функция безопасности браузера для предотвращения спуфинга.
Alvan Khong
когда я вошел в систему, мой URL-адрес был примерно таким!
http://localhost:53815/Main.aspx?enc=aflHfXfh87xB29VhJx42zeYbAV/Ft6IHRA1TXHamETMeigA2Cwfiwh2gn4upy++7itBBICXzfxlq41PAkbs2Rw==
После того, как я использую свою функцию кнопки, URL - адрес становится таким!
http://localhost:53815/Main.aspx-что?LogInUser=admin&Result=1
Tadit Dash (ତଡିତ୍ କୁମାର ଦାଶ)
Поставить отладчики и проверить, где именно он создает проблемы?
Alvan Khong
Я уже сделал проверку отладчиков, кажется, что после завершения цикла функции кнопки до конца } тогда изменится только URL-адрес!
Nafish khan
Я использую один и тот же код для шифрования URL-адресов,код отлично работает почти для всех URL-адресов, но есть один URL-адрес, который имеет проблему.
Вопрос-это из-за строки запроса = ExtractQuery(контексте.Запрос.RawUrl); код.
Свойство HttpContext.Тока.Запрос.RawUrl не возвращает правильный url-адрес.
например :
Фактический URL-адрес ... http://abc.com/XIA/PX/Product/Product.aspx?ID=13&PID=15408&nID=18652&pageID=27624
URL имея Issue--/XIA/PX/Product/ProductOverview.aspx?enc=ON7YuUnmSi4FyCWsVcTQy4Al8g0g4gUbhiao/lXe/HpebVBLQWEK6/IKP42TACTTnZkOTOjiFaY5rrm8bArbEnyxeikahyku89yfbtxb52g=&pageID=87654"
svkrajesh
если вы видите в окне разработчика, то фактическая строка запроса видна, и она просто отображается зашифрованной в адресной строке. как сделать работу в инструментах разработчика также
Adil Deveci
этот код работает только тогда, когда http get
он не работает, когда страница является обратной почтой.
и это не работает, когда мы используем сервер.Перемещение.